Skip to content

Commit 6c53902

Browse files
author
Ruslan Molchanov
committed
Merge branch 'sprint' into 'master'
Sprint to Master See merge request open-platform/api!24
2 parents f9c6d86 + c79cf09 commit 6c53902

14 files changed

Lines changed: 241 additions & 163 deletions

File tree

.gitlab-ci.yml

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@ stages:
88
- test
99
- package
1010
- deploy
11-
11+
- certificates
1212

1313
variables:
1414
DOCKER_DRIVER: overlay2
1515
IMAGE_NAME: gcr.io/zinc-computer-205115/apiopenfuture
1616
IMAGE_TAG: ${CI_COMMIT_REF_NAME}-${CI_PIPELINE_ID}
1717

18-
1918
###########################
2019
# Building
2120
###########################
@@ -37,6 +36,8 @@ build-jar:
3736
only:
3837
- master
3938
- sprint
39+
except:
40+
- schedules
4041

4142
unit-tests:
4243
stage: test
@@ -50,6 +51,7 @@ unit-tests:
5051
GOOGLE_CLIENT_SECRET: $GOOGLE_CLIENT_SECRET_DEV
5152
INFURA_URL: $INFURA_URL_DEV
5253
ETHEREUM_PRIVATE_KEY: $ETHEREUM_PRIVATE_KEY_DEV
54+
OPEN_TOKEN_ADDRESS: $OPEN_TOKEN_ADDRESS_DEV
5355
services:
5456
- name: postgres
5557
alias: $POSTGRES_HOST
@@ -67,7 +69,8 @@ unit-tests:
6769
- build/libs/*.jar
6870
- build/reports/tests/test/
6971
expire_in: 1 week
70-
72+
except:
73+
- schedules
7174

7275
.registry-auth-script: &registry_auth
7376
- docker login -u _json_key -p "${GOOGLE_JSON_TOKEN}" https://gcr.io
@@ -81,8 +84,8 @@ package-docker:
8184
only:
8285
- sprint
8386
- master
84-
85-
87+
except:
88+
- schedules
8689

8790
###########################
8891
# Deployment
@@ -96,14 +99,12 @@ package-docker:
9699
- ssh-keyscan $DEPLOY_HOST >> ~/.ssh/known_hosts
97100
- chmod 644 ~/.ssh/known_hosts
98101

99-
100102
.deploy-to-host-script: &deploy_to_host
101-
- |
102-
ssh ${DEPLOY_USER}@${DEPLOY_HOST} "docker login -u _json_key -p '${GOOGLE_JSON_TOKEN}' https://gcr.io"
103+
- ssh ${DEPLOY_USER}@${DEPLOY_HOST} "docker login -u _json_key -p '${GOOGLE_JSON_TOKEN}' https://gcr.io"
103104
- ssh ${DEPLOY_USER}@${DEPLOY_HOST} "docker pull ${IMAGE_NAME}:${IMAGE_TAG}"
104105
- |
105106
ssh ${DEPLOY_USER}@${DEPLOY_HOST} "
106-
docker inspect ${CONTAINER_NAME} && \
107+
docker stop ${CONTAINER_NAME} && \
107108
IMG=\$(docker ps -a --filter='name=^/${CONTAINER_NAME}$' --format='{{.Image}}') && \
108109
docker rm -f ${CONTAINER_NAME} && \
109110
docker rmi \$IMG; \
@@ -121,9 +122,24 @@ package-docker:
121122
-e "GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}" \
122123
-e "INFURA_URL=${INFURA_URL}" \
123124
-e "ETHEREUM_PRIVATE_KEY=${ETHEREUM_PRIVATE_KEY}" \
125+
-e "OPEN_TOKEN_ADDRESS=${OPEN_TOKEN_ADDRESS}" \
124126
${IMAGE_NAME}:${IMAGE_TAG}
125127
"
126128
129+
.update-certificates-script: &update_certificates
130+
- |
131+
ssh ${DEPLOY_USER}@${DEPLOY_HOST} "
132+
docker run --rm -it --name certbot \
133+
-v /etc/letsencrypt:/etc/letsencrypt \
134+
-v /var/www/certbot:/var/www/acme-challenge \
135+
-v /var/log/letsencrypt:/var/log/letsencrypt \
136+
certbot/certbot \
137+
certonly --webroot -w /var/www/acme-challenge/ \
138+
-d ${SERVER_NAME} \
139+
--renew-by-default -m devops@zensoft.io --eff-email --agree-tos --manual-public-ip-logging-ok
140+
"
141+
- ssh ${DEPLOY_USER}@${DEPLOY_HOST} "sudo service nginx reload"
142+
127143
deploy-development:
128144
stage: deploy
129145
variables:
@@ -139,13 +155,16 @@ deploy-development:
139155
GOOGLE_CLIENT_SECRET: $GOOGLE_CLIENT_SECRET_DEV
140156
INFURA_URL: $INFURA_URL_DEV
141157
ETHEREUM_PRIVATE_KEY: $ETHEREUM_PRIVATE_KEY_DEV
158+
OPEN_TOKEN_ADDRESS: $OPEN_TOKEN_ADDRESS_DEV
142159
before_script: *prepare_key
143160
script: *deploy_to_host
144161
only:
145162
- sprint
146163
environment:
147164
name: development
148165
url: http://api.open-platform.zensoft.io
166+
except:
167+
- schedules
149168

150169
deploy-production:
151170
stage: deploy
@@ -162,10 +181,37 @@ deploy-production:
162181
GOOGLE_CLIENT_SECRET: $GOOGLE_CLIENT_SECRET_PROD
163182
INFURA_URL: $INFURA_URL_PROD
164183
ETHEREUM_PRIVATE_KEY: $ETHEREUM_PRIVATE_KEY_PROD
184+
OPEN_TOKEN_ADDRESS: $OPEN_TOKEN_ADDRESS_PROD
165185
before_script: *prepare_key
166186
script: *deploy_to_host
167187
only:
168188
- master
169189
environment:
170190
name: production
171191
url: https://api.openfuture.io
192+
except:
193+
- schedules
194+
195+
certificates-development:
196+
stage: certificates
197+
variables:
198+
DEPLOY_USER: $DEPLOY_USER_DEV
199+
DEPLOY_HOST: $DEPLOY_HOST_DEV
200+
DEPLOY_KEY: $DEPLOY_KEY_DEV
201+
SERVER_NAME: "api.open-platform.zensoft.io"
202+
before_script: *prepare_key
203+
script: *update_certificates
204+
only:
205+
- schedules
206+
207+
certificates-production:
208+
stage: certificates
209+
variables:
210+
DEPLOY_USER: $DEPLOY_USER_PROD
211+
DEPLOY_HOST: $DEPLOY_HOST_PROD
212+
DEPLOY_KEY: $DEPLOY_KEY_PROD
213+
SERVER_NAME: "api.openfuture.io"
214+
before_script: *prepare_key
215+
script: *update_certificates
216+
only:
217+
- schedules

frontend/src/actions/index.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,25 @@ export const fetchScaffolds = (page = 1, limit = 10) => async dispatch => {
3131
}
3232
};
3333

34-
export const fetchScaffoldItem = (scaffoldAddres) => async dispatch => {
34+
export const fetchScaffoldItem = (scaffoldAddress) => async dispatch => {
35+
dispatch({type: FETCH_ONCHAIN_SCAFFOLD_SUMMARY, payload: {}});
3536
try {
36-
const res = await axios.get(`/api/scaffolds/${scaffoldAddres}/summary`);
37+
const res = await axios.get(`/api/scaffolds/${scaffoldAddress}/summary`);
3738
dispatch({type: FETCH_ONCHAIN_SCAFFOLD_SUMMARY, payload: res.data});
3839
} catch (err) {
3940
console.log('Error getting scaffolds', err);
4041
}
4142
};
4243

44+
export const deactivateScaffold = (scaffoldAddress) => async dispatch => {
45+
try {
46+
await axios.post(`/api/scaffolds/${scaffoldAddress}/doDeactivate`);
47+
fetchScaffoldItem(scaffoldAddress)(dispatch);
48+
} catch (err) {
49+
console.log('Error deactivating scaffolds', err);
50+
}
51+
};
52+
4353
export const generatePublicKey = () => async dispatch => {
4454
let res = {};
4555
try {
@@ -72,8 +82,6 @@ export const deployContract = (formValues, history) => async dispatch => {
7282

7383
try {
7484
res = await axios.post('/api/scaffolds', formValues);
75-
76-
history.push('/scaffolds');
7785
dispatch({
7886
type: SHOW_MODAL,
7987
payload: {contract: res.data, showLoader: false},

frontend/src/components/Header.js

Lines changed: 48 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -4,111 +4,57 @@ import {Link} from 'react-router-dom';
44
import {Button, Icon, Menu} from 'semantic-ui-react';
55

66
class Header extends Component {
7-
renderContent() {
8-
switch (this.props.auth) {
9-
case null:
10-
return (
11-
<Menu fluid={true} style={{marginTop: '10px'}}>
12-
<Menu.Item position="left">
13-
<div>
14-
<img
15-
src="/img/svg/logo-circle.svg"
16-
alt="logo"
17-
/>
18-
<img
19-
style={{
20-
left: '8px',
21-
paddingBottom: '6px',
22-
paddingRight: '10px',
23-
}}
24-
src="/img/svg/logo-name.svg"
25-
alt="logo"
26-
/>
27-
</div>
28-
</Menu.Item>
29-
<Menu.Item position="right">
30-
<a className="item" href="/auth/google">
31-
<Button color="google plus">
32-
<Icon name="google plus"/> Login with
33-
Google
34-
</Button>
35-
</a>
36-
</Menu.Item>
37-
</Menu>
38-
);
39-
case false:
40-
return (
41-
<Menu fluid={true} style={{marginTop: '10px'}}>
42-
<Menu.Item position="left">
43-
<div>
44-
<img
45-
src="/img/svg/logo-circle.svg"
46-
alt="logo"
47-
/>
48-
<img
49-
style={{
50-
left: '8px',
51-
paddingBottom: '6px',
52-
paddingRight: '10px',
53-
}}
54-
src="/img/svg/logo-name.svg"
55-
alt="logo"
56-
/>
57-
</div>
58-
</Menu.Item>
59-
<Menu.Item position="right">
60-
<a className="item" href="/auth/google">
61-
<Button color="google plus">
62-
<Icon name="google plus"/> Login with
63-
Google
64-
</Button>
65-
</a>
66-
</Menu.Item>
67-
</Menu>
68-
);
69-
default:
70-
return (
71-
<Menu fluid={true} style={{marginTop: '10px'}}>
72-
<Menu.Item position="left">
73-
<div>
74-
<img
75-
src="/img/svg/logo-circle.svg"
76-
alt="logo"
77-
/>
78-
<img
79-
style={{
80-
left: '8px',
81-
paddingBottom: '6px',
82-
paddingRight: '10px',
83-
}}
84-
src="/img/svg/logo-name.svg"
85-
alt="logo"
86-
/>
87-
</div>
88-
</Menu.Item>
89-
<Menu.Item position="right">
90-
<Link className="item" to={'/scaffolds'}>
91-
Open Tokens: {this.props.auth.credits}
92-
</Link>
93-
<Link className="item" to={'/scaffolds'}>
94-
Scaffolds
95-
</Link>
96-
<a className="item" href="/api/logout">
97-
Log Out
98-
</a>
99-
</Menu.Item>
100-
</Menu>
101-
);
102-
}
103-
}
1047

105-
render() {
106-
return <div>{this.renderContent()}</div>;
8+
renderNotAuthorizedContent() {
9+
return (
10+
<Menu.Item position="right">
11+
<a className="item" href="/auth/google">
12+
<Button color="google plus">
13+
<Icon name="google plus"/>
14+
Login with Google
15+
</Button>
16+
</a>
17+
</Menu.Item>
18+
);
19+
}
20+
21+
renderAuthContent() {
22+
return (
23+
<Menu.Item position="right">
24+
<Link className="item" to={'/scaffolds'}>Open Tokens: {this.props.auth.credits}</Link>
25+
<Link className="item" to={'/scaffolds'}>Scaffolds</Link>
26+
<a className="item" href="/login?logout">Log Out</a>
27+
</Menu.Item>
28+
);
29+
}
30+
31+
renderContent() {
32+
if (!this.props.auth) {
33+
return this.renderNotAuthorizedContent()
10734
}
35+
36+
return this.renderAuthContent()
37+
}
38+
39+
render() {
40+
return (
41+
<Menu fluid={true} style={{marginTop: '10px'}}>
42+
<Menu.Item position="left">
43+
<Link to="/scaffolds">
44+
<img src="/img/svg/logo-circle.svg" alt="logo"/>
45+
<img src="/img/svg/logo-name.svg" alt="logo" style={{
46+
left: '8px',
47+
paddingBottom: '6px',
48+
paddingRight: '10px',
49+
}}/>
50+
</Link>
51+
</Menu.Item>
52+
{this.renderContent()}
53+
</Menu>
54+
);
55+
}
10856
}
10957

110-
const mapStateToProps = ({auth}) => {
111-
return {auth};
112-
};
58+
const mapStateToProps = ({auth}) => ({auth});
11359

11460
export default connect(mapStateToProps)(Header);

frontend/src/components/scaffolds/ScaffoldList.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,16 @@ class ScaffoldList extends Component {
2323
return (
2424
<Card fluid key={index}>
2525
<Card.Content>
26-
<Link
27-
to={`scaffolds/${
28-
scaffold.address
29-
}`}
30-
>
26+
<Link to={`scaffolds/${scaffold.address}`}>
3127
<Card.Header>
3228
{scaffoldData.description}
3329
</Card.Header>
3430
</Link>
3531
<div className="meta">
36-
Scaffold Address:{' '}{scaffold.address}
32+
Scaffold Address:{' '}
33+
<a href={`https://etherscan.io/address/${scaffold.address}`} target="_blank">
34+
{scaffold.address}
35+
</a>
3736
</div>
3837
</Card.Content>
3938
<Card.Content>

0 commit comments

Comments
 (0)