Skip to content

Commit 15ddc96

Browse files
Backend da aplicação de ciclos de pagamentos
1 parent 256bf45 commit 15ddc96

File tree

10 files changed

+154
-0
lines changed

10 files changed

+154
-0
lines changed

my-money-app/backend/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
*.log

my-money-app/backend/package.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "my-money-backend",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "src/loader.js",
6+
"scripts": {
7+
"dev": "nodemon",
8+
"production": "pm2 start src/loader.js --name my-money-backend"
9+
},
10+
"keywords": [],
11+
"author": "",
12+
"license": "ISC",
13+
"dependencies": {
14+
"body-parser": "^1.15.2",
15+
"express": "^4.14.0",
16+
"express-query-int": "^1.0.1",
17+
"lodash": "^4.17.4",
18+
"mongoose": "^4.7.0",
19+
"mongoose-paginate": "^5.0.3",
20+
"node-restful": "^0.2.5",
21+
"pm2": "^2.1.5"
22+
},
23+
"devDependencies": {
24+
"nodemon": "^1.11.0"
25+
}
26+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const restful = require('node-restful')
2+
const mongoose = restful.mongoose
3+
4+
const creditSchema = new mongoose.Schema({
5+
name: { type: String, required: true },
6+
value: { type: Number, min: 0, required: true }
7+
})
8+
9+
const debtSchema = new mongoose.Schema({
10+
name: { type: String, required: true },
11+
value: { type: Number, min: 0, required: [true, 'Informe o valor do débito!'] },
12+
status: { type: String, required: false, uppercase: true,
13+
enum: ['PAGO', 'PENDENTE', 'AGENDADO'] }
14+
})
15+
16+
const billingCycleSchema = new mongoose.Schema({
17+
name: { type: String, required: true },
18+
month: { type: Number, min: 1, max: 12, required: true },
19+
year: { type: Number, min: 1970, max: 2100, required: true },
20+
credits: [creditSchema],
21+
debts: [debtSchema]
22+
})
23+
24+
module.exports = restful.model('BillingCycle', billingCycleSchema)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const BillingCycle = require('./billingCycle')
2+
const errorHandler = require('../common/errorHandler')
3+
4+
BillingCycle.methods(['get', 'post', 'put', 'delete'])
5+
BillingCycle.updateOptions({new: true, runValidators: true})
6+
BillingCycle.after('post', errorHandler).after('put', errorHandler)
7+
8+
BillingCycle.route('count', (req, res, next) => {
9+
BillingCycle.count((error, value) => {
10+
if(error) {
11+
res.status(500).json({errors: [error]})
12+
} else {
13+
res.json({value})
14+
}
15+
})
16+
})
17+
18+
BillingCycle.route('summary', (req, res, next) => {
19+
BillingCycle.aggregate({
20+
$project: {credit: {$sum: "$credits.value"}, debt: {$sum: "$debts.value"}}
21+
}, {
22+
$group: {_id: null, credit: {$sum: "$credit"}, debt: {$sum: "$debt"}}
23+
}, {
24+
$project: {_id: 0, credit: 1, debt: 1}
25+
}, (error, result) => {
26+
if(error) {
27+
res.status(500).json({errors: [error]})
28+
} else {
29+
res.json(result[0] || { credit: 0, debt: 0 })
30+
}
31+
})
32+
})
33+
34+
module.exports = BillingCycle
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const _ = require('lodash')
2+
3+
module.exports = (req, res, next) => {
4+
const bundle = res.locals.bundle
5+
6+
if(bundle.errors) {
7+
const errors = parseErrors(bundle.errors)
8+
res.status(500).json({errors})
9+
} else {
10+
next()
11+
}
12+
}
13+
14+
const parseErrors = (nodeRestfulErrors) => {
15+
const errors = []
16+
_.forIn(nodeRestfulErrors, error => errors.push(error.message))
17+
return errors
18+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = (req, res, next) => {
2+
res.header('Access-Control-Allow-Origin', '*')
3+
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE')
4+
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
5+
next()
6+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const mongoose = require('mongoose')
2+
mongoose.Promise = global.Promise
3+
module.exports = mongoose.connect('mongodb://localhost/mymoney')
4+
5+
mongoose.Error.messages.general.required = "O atributo '{PATH}' é obrigatório."
6+
mongoose.Error.messages.Number.min =
7+
"O '{VALUE}' informado é menor que o limite mínimo de '{MIN}'."
8+
mongoose.Error.messages.Number.max =
9+
"O '{VALUE}' informado é maior que o limite máximo de '{MAX}'."
10+
mongoose.Error.messages.String.enum =
11+
"'{VALUE}' não é válido para o atributo '{PATH}'."
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const express = require('express')
2+
3+
module.exports = function(server) {
4+
5+
// Definir URL base para todas as rotas
6+
const router = express.Router()
7+
server.use('/api', router)
8+
9+
// Rotas de Ciclo de Pagamento
10+
const BillingCycle = require('../api/billingCycle/billingCycleService')
11+
BillingCycle.register(router, '/billingCycles')
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const port = 3003
2+
3+
const bodyParser = require('body-parser')
4+
const express = require('express')
5+
const server = express()
6+
const allowCors = require('./cors')
7+
const queryParser = require('express-query-int')
8+
9+
server.use(bodyParser.urlencoded({ extended: true }))
10+
server.use(bodyParser.json())
11+
server.use(allowCors)
12+
server.use(queryParser())
13+
14+
server.listen(port, function() {
15+
console.log(`BACKEND is running on port ${port}.`)
16+
})
17+
18+
module.exports = server

my-money-app/backend/src/loader.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const server = require('./config/server')
2+
require('./config/database')
3+
require('./config/routes')(server)

0 commit comments

Comments
 (0)