Commit beb7c91d authored by luca de carne's avatar luca de carne
Browse files

Initial commit


Signed-off-by: luca de carne's avatarluca de carne <luca.decarne@edu.unito.it>
parents
node_modules
npm-debug.log
.git
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
{
"extends": "",
"rules":{
"semi": "off",
"indent": "off"
},
"parserOptions": {
"ecmaVersion": 6
}
}
*.csv
*.dat
*.iml
*.log
*.out
*.pid
*.seed
*.sublime-*
*.swo
*.swp
*.tgz
*.xml
.DS_Store
.idea
.project
.strong-pm
coverage
node_modules
out
npm-debug.log
.vscode
config.js
server/ssl/*
contentsUploaded
image: docker:stable
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
CONTAINER_DEV_IMAGE: gitlab.di.unito.it:5000/utbi/cocity-backend:latest
CONTAINER_DEV_IMAGE_COMMIT: gitlab.di.unito.it:5000/utbi/cocity-backend:$CI_COMMIT_SHA
DOCKER_TLS_CERTDIR: ""
services:
- docker:stable-dind
stages:
- build
- deploy
dev_build:
stage: build
script:
- echo "$CI_JOB_TOKEN" | docker login --username gitlab-ci-token --password-stdin $GITLAB_REGISTRY
- docker build --build-arg environment=development -t $CONTAINER_DEV_IMAGE -t $CONTAINER_DEV_IMAGE_COMMIT .
- docker push $CONTAINER_DEV_IMAGE
only:
- develop
prod_build:
stage: build
script:
- echo "$CI_JOB_TOKEN" | docker login --username gitlab-ci-token --password-stdin $GITLAB_REGISTRY
- docker build --build-arg environment=production -t $CONTAINER_DEV_IMAGE -t $CONTAINER_DEV_IMAGE_COMMIT .
- docker push $CONTAINER_DEV_IMAGE
only:
- master
dev_deploy:
stage: deploy
before_script:
- apk update && apk upgrade && apk add git openssh-client
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
- echo "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub
- chmod 400 ~/.ssh/id_rsa
- ssh-add ~/.ssh/id_rsa
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
- ssh $DEVELOPMENT_SERVER "cd $DEV_DEPLOY_PATH && git pull && docker login $GITLAB_REGISTRY -u $REGISTRY_USER -p $REGISTRY_PASSWORD && docker-compose pull && docker-compose up -d --force-recreate && exit"
only:
- develop
prod_deploy:
stage: deploy
before_script:
- apk update && apk upgrade && apk add git openssh-client
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
- echo "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub
- chmod 400 ~/.ssh/id_rsa
- ssh-add ~/.ssh/id_rsa
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
- >-
ssh -t $PRODUCTION_SERVER "ssh -t ccloopback \"cd $PROD_DEPLOY_PATH && docker login $GITLAB_REGISTRY -u $REGISTRY_USER -p $REGISTRY_PASSWORD && docker-compose pull && docker-compose up -d --force-recreate && exit\""
only:
- master
FROM node:8-alpine as BUILD
RUN mkdir -p /opt/server/ccserver
WORKDIR /opt/server/ccserver
COPY package*.json ./
RUN apk update && apk upgrade && apk add --no-cache bash git openssh python make g++ && npm install
COPY . .
RUN mv config.js.template config.js
FROM node:8-alpine
COPY --from=BUILD /opt/server/ccserver .
RUN npm install pm2 -g
EXPOSE 3000
ARG environment
ENV NODE_ENV=$environment
CMD ["npm", "start"]
# Commonshood Toolkit Repository
This repository contains the toolkit implementation of the Commonshood App. We use Strongloop Loopback as RESTful API framework.
## Configuration
`config.js.template` contains the server configuration parameters. `server/datasources.json` contains the server datasource configuration parameters. `server/model-config.json` contains the models configuration parameters like the datasources of the model, or wich API endpoint should be exposed by the server.
## Starting the server
*PLEASE BE CAREFUL: Be sure that a mongodb instance is running before attempting to start the server*
#### Technologies
- Loopback
- Nodejs
- Web3js
- RabbitMQ
- Socket.io
---
#### Show Documentation
Install `jsdoc` first:
``` sh
$ npm i -g jsdoc
```
Then run it on the `client`, `server`, `common` and `extra-docs` directories in `recursive mode`:
``` sh
$ cd /path/to/project/root
$ jsdoc -r server client common extra-docs
```
Finally open `out/index.html` with a web browser to see the built website
This diff is collapsed.
## Client
This is the place for your application front-end files. Which are in `cocity-frontend` repository.
module.exports = function(Message) {
Message.greet = function(msg, cb) {
process.nextTick(function() {
msg = msg || 'hello';
cb(null, 'Sender says ' + msg + ' to receiver');
});
};
};
{
"name": "Message",
"base": "Model",
"properties": {},
"validations": [],
"relations": {},
"acls": [],
"methods": {
"greet": {
"accepts": [
{
"arg": "msg",
"type": "string",
"http": {
"source": "query"
}
}
],
"returns": {
"arg": "greeting",
"type": "string"
},
"http": {
"verb": "get"
}
}
}
}
\ No newline at end of file
'use strict';
module.exports = function(Person) {
/*
Person.beforeRemote('logout', function(ctx, logoutOutput, next) {
const oauthServer = Person.app.dataSources.oauthServer
oauthServer.logout(ctx.req.accessToken.id, ctx.req.hostname, function(err, response, context) {
if(err) {
logger.error(err)
} else {
logger.debug(JSON.stringify(response))
logger.debug(`Logout done for ${JSON.stringify(ctx.req.accessToken)}`)
}
})
next()
})
*/
};
{
"name": "Person",
"plural": "Persons",
"base": "User",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {
"name": {
"type": "string",
"required": true
},
"birthdate": {
"type": "date",
"required": false
},
"password": {
"type": "string",
"required": true
}
},
"validations": [],
"relations": {
"accessTokens": {
"type": "hasMany",
"model": "token",
"foreignKey": "userId",
"options": {
"disableInclude": true
}
},
"wallets": {
"type": "embedsOne",
"model": "Wallet",
"foreignKey": "_id",
"options": {
"disableInclude": false
}
},
"coins": {
"type": "hasMany",
"model": "Coin",
"foreignKey": "userId"
},
"daos": {
"type": "hasMany",
"model": "DAO",
"foreignKey": "userId"
}
},
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$unauthenticated",
"permission": "DENY"
}
],
"methods": {}
}
This diff is collapsed.
module.exports = {
apps : [{
name: 'ccserver',
script: '.',
// Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
exec_mode: 'cluster',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '2G'
}],
};
# Introduzione
L'architettura del backend di CoCity fa affidamento, al momento della stesura di questo testo, sulle tecnologie fornite da Strongloop Loopback, per ciò che riguarda il server Node.js, MongoDB, come database per il web server, Socket.io, per l'interfaccia WebSocket, RabbitMQ, per la gestione delle code di messaggi, Web3js, per la comunicazione bidirezionale con la blockchain ethereum.
# Struttura del Repository
Il repository è composto dalle cartelle `client`, `common`, `extra-docs` (in cui è contenuto questo documento), `server` e dai file `package.json`, `package-lock.json`, `README.md` (Contenente la documentazione principale del repo, ovvero avvio server, precondizioni ecc.), `.gitignore`, `.eslintrc`, `.editorconfig`.
La cartella `server` contiene tutti i file sorgente del backend. Ha 4 sottocartelle: `boot`, per gli script che vengono eseguiti all'avvio del server, `daemon`, che contiene i sorgenti per un helper in via di sviluppo, `models`, che contiene i modelli dei dati e la logica applicativa, `socket`, che contiene i sorgenti per la gestione delle connessioni con WebSocket. Gli altri file presenti nella cartella, eccetto `server.js` sono dei file JSON che contengono le configurazioni delle componenti principali del server loopback.
## API RESTful e Autenticazione
Il web server Node.js espone un insieme di API RESTful invocabili da un qualsiasi client HTTP. Inoltre per poter usufruire della maggior parte delle API è necessaria l'autenticazione dell'utente. Il protocollo di autenticazione scelto è OAuth 2; ciò ha consentito l'integrazione con i servizi di autenticazione social forniti da Google e Facebook.
Le API sono strutturate in modo tale da esporre le componenti con le quali il client può interagire con la piattaforma per mezzo delle operazioni principali disponibili per ogni modello (Si rimanda alla documentazione delle API per le operazioni disponibili). I modelli dei dati e la corrispondente logica applicativa si trovano all'interno della cartella `server/models`, i modelli sono dei file JSON mentre la logica applicativa è all'interno di file Javascript.
I modelli principali sono: Person, che descrive e permette di operare sugli utenti, Coin, che modella e permette di operare sulle monete, Token, che modella e permette all'utente di ottenere un token di autenticazione, Wallet, che descrive e permette di operare sul wallet dell'utente, infine Notification, che modella e permette di operare sulle notifiche.
### Autenticazione Social
Il server consente all'utente di autenticarsi per mezzo di 3 fornitori di autenticazione OAuth 2: il nostro server di autenticazione, Google e Facebook. L'autenticazione segue il paradigma code-flow, perciò l'utente autorizza l'applicazione con uno dei fornitori sopracitati e riceve da questi un code che può inviare al server (Loopback) per ottenere in cambio un token di autenticazione. Il server utilizza il code per recuperare l'auth token dal servizio di autenticazione social.
## Socket.io
L'utilizzo di Socket.io consente di stabilire un canale di comunicazione persistente e near-realtime tra server e client. In questo modo il client può ricevere notifiche e altre informazioni quasi in tempo reale da parte del server, aumentando così l'interattività con la piattaforma.
## MongoDB
MongoDB si occupa di archiviare i documenti descritti dai modelli. (Inserire altro)
\ No newline at end of file
/**
* This callback type is called `loopBackCallback` and represents the callback used by Loopback to complete a remote method request.
*
* @callback loopBackCallback
* @param {Object | null} error - error, if any.
* @param {number} error.status - The status code to return, if any.
* @param {string} error.message - The error message, if any.
* @param {...Object} results - A set of results to return, if any.
*/
\ No newline at end of file
This diff is collapsed.
{
"name": "cocity-backend",
"version": "0.2.2",
"main": "server/server.js",
"engines": {
"node": ">=4"
},
"scripts": {
"lint": "eslint .",
"start": "pm2 start && pm2 logs",
"posttest": "npm run lint && nsp check",
"test": "mocha --timeout 20000 --allow-uncaught"
},
"dependencies": {
"amqplib": "^0.5.2",
"bitcore-mnemonic": "~1.5.0",
"body-parser": "^1.18.2",
"compression": "^1.7.2",
"cors": "^2.5.2",
"eth-lightwallet": "^3.0.1",
"helmet": "^1.3.0",
"hooked-web3-provider": "^1.0.0",
"ipfs-http-client": "^27.0.0",
"loopback": "^3.18.2",
"loopback-boot": "^2.27.1",
"loopback-component-explorer": "^5.3.0",
"loopback-connector-mongodb": "^1.18.1",
"loopback-connector-rest": "^3.1.0",
"mongodb": "^3.0.4",
"multer": "^1.4.1",
"multihashes": "^0.4.14",
"serve-favicon": "^2.0.1",
"sleep": "^5.1.1",
"socket.io": "^2.1.0",
"socket.io-redis": "^5.2.0",
"strong-error-handler": "^2.3.2",
"swagger-stats": "^0.95.7",
"uuid": "^3.3.2",
"web3": "1.0.0-beta.52",
"web3-provider-engine": "^15.0.0",
"winston": "^3.1.0"
},
"devDependencies": {
"chai": "^4.2.0",
"chai-http": "^4.2.1",
"eslint": "^4.19.1",
"eslint-config-airbnb-base": "^12.1.0",
"eslint-config-loopback": "^8.0.0",
"eslint-plugin-import": "^2.11.0",
"mocha": "^5.2.0",
"nsp": "^2.1.0"
},
"repository": {
"type": "",
"url": ""
},
"license": "UNLICENSED",
"description": "cocity-backend"
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment