Skip to content

Commit

Permalink
Merge pull request #14 from Lend-it/devel
Browse files Browse the repository at this point in the history
Release - 13/04/2021 - Nunito v0.4.0
youssef-md authored Apr 16, 2021
2 parents cfceb49 + 04fa29a commit ae0fb17
Showing 12 changed files with 1,611 additions and 1,188 deletions.
File renamed without changes.
47 changes: 47 additions & 0 deletions .github/workflows/automatic-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Automatic Release
on:
push:
branches:
- "release-candidate"

jobs:
pre-release:
name: "Pre Release"
runs-on: "ubuntu-latest"

steps:
- uses: actions/checkout@v2
- run: mkdir -p /tmp/
- run: curl --location --request GET 'https://sonarcloud.io/api/measures/search_history?component=Lend-it_Request&metrics=new_technical_debt,blocker_violations,bugs,classes,code_smells,cognitive_complexity,comment_lines,comment_lines_density,complexity_in_classes,complexity_in_functions,branch_coverage,new_branch_coverage,new_conditions_to_cover,confirmed_issues,coverage,new_coverage,complexity,development_cost,new_development_cost,duplicated_blocks,new_duplicated_blocks,duplicated_files,duplicated_lines,duplicated_lines_density,new_duplicated_lines_density,new_duplicated_lines,duplications_data,effort_to_reach_maintainability_rating_a,false_positive_issues,file_complexity_distribution,files,function_complexity_distribution,functions,generated_lines,generated_ncloc,info_violations,violations,line_coverage,new_line_coverage,ncloc,ncloc_language_distribution,lines_to_cover,new_lines_to_cover,sqale_rating,new_maintainability_rating,major_violations,minor_violations,new_blocker_violations,new_bugs,new_code_smells,new_critical_violations,new_info_violations,new_violations,new_lines,new_major_violations,new_minor_violations,new_security_hotspots,new_vulnerabilities,open_issues,quality_profiles,projects,public_api,public_documented_api_density,quality_gate_details,alert_status,reliability_rating,new_reliability_rating,reliability_remediation_effort,new_reliability_remediation_effort,reopened_issues,security_hotspots,security_hotspots_reviewed,new_security_hotspots_reviewed,security_rating,new_security_rating,security_remediation_effort,new_security_remediation_effort,security_review_rating,new_security_review_rating,security_hotspots_reviewed_status,new_security_hotspots_reviewed_status,security_hotspots_to_review_status,new_security_hotspots_to_review_status,skipped_tests,statements,sqale_index,sqale_debt_ratio,new_sqale_debt_ratio' > /tmp/sonar_cloud_request.json
- uses: actions/upload-artifact@v2
with:
name: sonar_cloud_request.json
path: /tmp/sonar_cloud_request.json
- run: curl --location --request GET 'https://sonarcloud.io/api/measures/search_history?component=Lend-it_Rating&metrics=new_technical_debt,blocker_violations,bugs,classes,code_smells,cognitive_complexity,comment_lines,comment_lines_density,complexity_in_classes,complexity_in_functions,branch_coverage,new_branch_coverage,new_conditions_to_cover,confirmed_issues,coverage,new_coverage,complexity,development_cost,new_development_cost,duplicated_blocks,new_duplicated_blocks,duplicated_files,duplicated_lines,duplicated_lines_density,new_duplicated_lines_density,new_duplicated_lines,duplications_data,effort_to_reach_maintainability_rating_a,false_positive_issues,file_complexity_distribution,files,function_complexity_distribution,functions,generated_lines,generated_ncloc,info_violations,violations,line_coverage,new_line_coverage,ncloc,ncloc_language_distribution,lines_to_cover,new_lines_to_cover,sqale_rating,new_maintainability_rating,major_violations,minor_violations,new_blocker_violations,new_bugs,new_code_smells,new_critical_violations,new_info_violations,new_violations,new_lines,new_major_violations,new_minor_violations,new_security_hotspots,new_vulnerabilities,open_issues,quality_profiles,projects,public_api,public_documented_api_density,quality_gate_details,alert_status,reliability_rating,new_reliability_rating,reliability_remediation_effort,new_reliability_remediation_effort,reopened_issues,security_hotspots,security_hotspots_reviewed,new_security_hotspots_reviewed,security_rating,new_security_rating,security_remediation_effort,new_security_remediation_effort,security_review_rating,new_security_review_rating,security_hotspots_reviewed_status,new_security_hotspots_reviewed_status,security_hotspots_to_review_status,new_security_hotspots_to_review_status,skipped_tests,statements,sqale_index,sqale_debt_ratio,new_sqale_debt_ratio' > /tmp/sonar_cloud_rating.json
- uses: actions/upload-artifact@v2
with:
name: sonar_cloud_rating.json
path: /tmp/sonar_cloud_rating.json
- run: curl --location --request GET 'https://sonarcloud.io/api/measures/search_history?component=Lend-it_User&metrics=new_technical_debt,blocker_violations,bugs,classes,code_smells,cognitive_complexity,comment_lines,comment_lines_density,complexity_in_classes,complexity_in_functions,branch_coverage,new_branch_coverage,new_conditions_to_cover,confirmed_issues,coverage,new_coverage,complexity,development_cost,new_development_cost,duplicated_blocks,new_duplicated_blocks,duplicated_files,duplicated_lines,duplicated_lines_density,new_duplicated_lines_density,new_duplicated_lines,duplications_data,effort_to_reach_maintainability_rating_a,false_positive_issues,file_complexity_distribution,files,function_complexity_distribution,functions,generated_lines,generated_ncloc,info_violations,violations,line_coverage,new_line_coverage,ncloc,ncloc_language_distribution,lines_to_cover,new_lines_to_cover,sqale_rating,new_maintainability_rating,major_violations,minor_violations,new_blocker_violations,new_bugs,new_code_smells,new_critical_violations,new_info_violations,new_violations,new_lines,new_major_violations,new_minor_violations,new_security_hotspots,new_vulnerabilities,open_issues,quality_profiles,projects,public_api,public_documented_api_density,quality_gate_details,alert_status,reliability_rating,new_reliability_rating,reliability_remediation_effort,new_reliability_remediation_effort,reopened_issues,security_hotspots,security_hotspots_reviewed,new_security_hotspots_reviewed,security_rating,new_security_rating,security_remediation_effort,new_security_remediation_effort,security_review_rating,new_security_review_rating,security_hotspots_reviewed_status,new_security_hotspots_reviewed_status,security_hotspots_to_review_status,new_security_hotspots_to_review_status,skipped_tests,statements,sqale_index,sqale_debt_ratio,new_sqale_debt_ratio' > /tmp/sonar_cloud_user.json
- uses: actions/upload-artifact@v2
with:
name: sonar_cloud_user.json
path: /tmp/sonar_cloud_user.json

- run: curl --location --request GET 'https://sonarcloud.io/api/measures/search_history?component=Lend-it_Gateway&metrics=new_technical_debt,blocker_violations,bugs,classes,code_smells,cognitive_complexity,comment_lines,comment_lines_density,complexity_in_classes,complexity_in_functions,branch_coverage,new_branch_coverage,new_conditions_to_cover,confirmed_issues,coverage,new_coverage,complexity,development_cost,new_development_cost,duplicated_blocks,new_duplicated_blocks,duplicated_files,duplicated_lines,duplicated_lines_density,new_duplicated_lines_density,new_duplicated_lines,duplications_data,effort_to_reach_maintainability_rating_a,false_positive_issues,file_complexity_distribution,files,function_complexity_distribution,functions,generated_lines,generated_ncloc,info_violations,violations,line_coverage,new_line_coverage,ncloc,ncloc_language_distribution,lines_to_cover,new_lines_to_cover,sqale_rating,new_maintainability_rating,major_violations,minor_violations,new_blocker_violations,new_bugs,new_code_smells,new_critical_violations,new_info_violations,new_violations,new_lines,new_major_violations,new_minor_violations,new_security_hotspots,new_vulnerabilities,open_issues,quality_profiles,projects,public_api,public_documented_api_density,quality_gate_details,alert_status,reliability_rating,new_reliability_rating,reliability_remediation_effort,new_reliability_remediation_effort,reopened_issues,security_hotspots,security_hotspots_reviewed,new_security_hotspots_reviewed,security_rating,new_security_rating,security_remediation_effort,new_security_remediation_effort,security_review_rating,new_security_review_rating,security_hotspots_reviewed_status,new_security_hotspots_reviewed_status,security_hotspots_to_review_status,new_security_hotspots_to_review_status,skipped_tests,statements,sqale_index,sqale_debt_ratio,new_sqale_debt_ratio' > /tmp/sonar_cloud_gateway.json
- uses: actions/upload-artifact@v2
with:
name: sonar_cloud_gateway.json
path: /tmp/sonar_cloud_gateway.json

- uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest"
prerelease: false
title: "Automatic Release-Candidate release"
files: |
/tmp/sonar_cloud_request.json
/tmp/sonar_cloud_rating.json
/tmp/sonar_cloud_user.json
/tmp/sonar_cloud_gateway.json
2,610 changes: 1,422 additions & 1,188 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -40,6 +40,8 @@
"dotenv": "^8.2.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"nodemailer": "^6.5.0",
"multer": "^1.4.2",
"pg": "^8.5.1",
"pg-hstore": "^2.3.3",
"sequelize": "^6.5.0"
21 changes: 21 additions & 0 deletions src/config/upload.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import crypto from 'crypto';
import multer from 'multer';
import path from 'path';

const __dirname = path.resolve();

export default {
upload(folder) {
return {
storage: multer.diskStorage({
destination: path.resolve(__dirname, '..', '..', folder),
filename: (request, file, cb) => {
const fileHash = crypto.randomBytes(16).toString('hex');
const filename = `${fileHash}-${file.originalname}`;

return cb(null, filename);
},
}),
};
},
};
92 changes: 92 additions & 0 deletions src/controllers/UserController.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import User from '../models/User.js';
import bcrypt from 'bcrypt';
import generateToken from '../services/auth.js';
import { deleteFile } from '../utils/file.js';
import path from 'path';

const saltRounds = process.env.SALT_ROUNDS;

@@ -75,4 +77,94 @@ export default {
return response.status(500).json({ error: error.message });
}
},

async update(request, response) {
const { useremail, name, whatsappnumber } = request.body;

const user = await User.findOne({
where: {
useremail,
},
});

if (!user) {
return response.status(404).json({ error: 'Usuário não existente' });
}

user.useremail = useremail;
user.name = name;
user.whatsappnumber = whatsappnumber;

await user.save();

return response.status(200).json({ user });
},

async updateAvatar(request, response) {
const { useremail } = request.body;
const avatar = request.file.filename;

const user = await User.findOne({
where: {
useremail,
},
});

if (!user) {
return response.status(404).json({ error: 'Usuário não existente' });
}

if (oldPassword && newPassword) {
if (!(await bcrypt.compare(oldPassword, user.password))) {
return response.status(400).json({ error: 'Senha Inválida!' });
}

const salt = bcrypt.genSaltSync(saltRounds);
const hashedPassword = bcrypt.hashSync(newPassword, salt);

const updatedPassword = await user.update({
password: hashedPassword,
});

return response.status(204).json({ updatedPassword });
}

if (user.avatar) {
const __dirname = path.resolve();
const avatarPath = path.resolve(
__dirname,
'..',
'..',
'tmp',
user.avatar
);
await deleteFile(avatarPath);
}
user.avatar = avatar;

await user.save();

return response.status(200).json({ user });
},

async updateLocation(request, response) {
const { latitude, longitude, useremail } = request.body;

const user = await User.findOne({
where: {
useremail,
},
});

if (!user) {
return response.status(404).json({ error: 'Usuário não existente' });
}

user.latitude = latitude;
user.longitude = longitude;

await user.save();

return response.status(200).json({ user });
},
};
1 change: 1 addition & 0 deletions src/db/scripts/create_dev.sql
Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@ CREATE TABLE "user" (
name TEXT NOT NULL,
whatsappNumber TEXT NOT NULL,
password TEXT NOT NULL,
avatar TEXT,
latitude NUMERIC NULL,
longitude NUMERIC NULL,

1 change: 1 addition & 0 deletions src/db/scripts/create_test.sql
Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@ CREATE TABLE "user" (
name TEXT NOT NULL,
whatsappNumber TEXT NOT NULL,
password TEXT NOT NULL,
avatar TEXT,
latitude NUMERIC NULL,
longitude NUMERIC NULL,

1 change: 1 addition & 0 deletions src/models/User.js
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ class User extends Sequelize.Model {
name: Sequelize.TEXT,
whatsappnumber: Sequelize.TEXT,
password: Sequelize.TEXT,
avatar: Sequelize.TEXT,
latitude: Sequelize.DECIMAL,
longitude: Sequelize.DECIMAL,
},
14 changes: 14 additions & 0 deletions src/routes/user.routes.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@
import { Router } from 'express';
import verifyToken from '../middlewares/auth.js';
import uploadConfig from '../config/upload.js';
import multer from 'multer';

import UserController from '../controllers/UserController.js';

const userRouter = Router();

const upload = multer(uploadConfig.upload('./tmp'));

userRouter.get('/', UserController.list);

userRouter.get('/:useremail', UserController.show);

userRouter.post('/', UserController.create);

userRouter.put('/', UserController.update);

userRouter.patch(
'/avatar',
upload.single('avatar'),
UserController.updateAvatar
);
userRouter.patch('/location', UserController.updateLocation);

export default userRouter;
10 changes: 10 additions & 0 deletions src/utils/file.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import fs from 'fs';

export const deleteFile = async filename => {
try {
await fs.promises.stat(filename);
} catch (err) {
return;
}
await fs.promises.unlink(filename);
};
Empty file added tmp/.gitkeep
Empty file.

0 comments on commit ae0fb17

Please sign in to comment.