From 154e682a79966032d64dc9339a7e37e355540def Mon Sep 17 00:00:00 2001 From: Lucas Orts Date: Fri, 23 Aug 2024 11:05:19 +0200 Subject: [PATCH] create handlers update email, update product price and create product and tests from api #101 --- .../api/handlers/createProductHandler.js | 15 ++++++++ .../lucas-orts/project/api/handlers/index.js | 14 +++++++- .../api/handlers/updateEmailHandler.js | 15 ++++++++ .../api/handlers/updatePasswordHandler.js | 4 +-- .../api/handlers/updateProductPriceHandler.js | 17 ++++++++++ .../api/handlers/updateUserAddressHandler.js | 2 +- .../api/handlers/updateUserPhoneHandler.js | 2 +- staff/lucas-orts/project/api/index.js | 18 ++++++++++ .../project/api/test/update-address.sh | 1 + .../project/api/test/update-email.sh | 1 + .../project/api/test/update-password.sh | 1 + .../project/api/test/update-phone.sh | 1 + staff/lucas-orts/project/cor/logic/index.js | 6 +++- .../project/cor/logic/updateEmail.spec.js | 34 ++++++------------- .../project/cor/logic/updateEmail.test.js | 2 +- .../project/cor/logic/updateProductPrice.js | 8 ++--- 16 files changed, 107 insertions(+), 34 deletions(-) create mode 100644 staff/lucas-orts/project/api/handlers/createProductHandler.js create mode 100644 staff/lucas-orts/project/api/handlers/updateEmailHandler.js create mode 100644 staff/lucas-orts/project/api/handlers/updateProductPriceHandler.js create mode 100644 staff/lucas-orts/project/api/test/update-address.sh create mode 100644 staff/lucas-orts/project/api/test/update-email.sh create mode 100644 staff/lucas-orts/project/api/test/update-password.sh create mode 100644 staff/lucas-orts/project/api/test/update-phone.sh diff --git a/staff/lucas-orts/project/api/handlers/createProductHandler.js b/staff/lucas-orts/project/api/handlers/createProductHandler.js new file mode 100644 index 000000000..dd9046d20 --- /dev/null +++ b/staff/lucas-orts/project/api/handlers/createProductHandler.js @@ -0,0 +1,15 @@ +import { logic } from 'cor' + +export default (req, res, next) => { + const { userId } = req + + const { name, type, minprice, maxprice, image } = req.body + + try { + logic.createProduct(userId, name, type, minprice, maxprice, image) + .then(() => res.status(201).send()) + .catch(error => next(error)) + } catch (error) { + next(error) + } +} \ No newline at end of file diff --git a/staff/lucas-orts/project/api/handlers/index.js b/staff/lucas-orts/project/api/handlers/index.js index 2edfdacb1..4cf43021a 100644 --- a/staff/lucas-orts/project/api/handlers/index.js +++ b/staff/lucas-orts/project/api/handlers/index.js @@ -1,9 +1,21 @@ import registerUserHandler from './registerUserHandler.js' import authenticateUserHandler from './authenticateUserHandler.js' import getUserNameHandler from './getUserNameHandler.js' +import updatePasswordHandler from './updatePasswordHandler.js' +import updateUserAddressHandler from './updateUserAddressHandler.js' +import updateUserPhoneHandler from './updateUserPhoneHandler.js' +import updateEmailHandler from './updateEmailHandler.js' +import createProductHandler from './createProductHandler.js' +import updateProductPriceHandler from './updateProductPriceHandler.js' export { registerUserHandler, authenticateUserHandler, - getUserNameHandler + getUserNameHandler, + updatePasswordHandler, + updateUserAddressHandler, + updateUserPhoneHandler, + updateEmailHandler, + createProductHandler, + updateProductPriceHandler } diff --git a/staff/lucas-orts/project/api/handlers/updateEmailHandler.js b/staff/lucas-orts/project/api/handlers/updateEmailHandler.js new file mode 100644 index 000000000..a2b360c93 --- /dev/null +++ b/staff/lucas-orts/project/api/handlers/updateEmailHandler.js @@ -0,0 +1,15 @@ +import { logic } from 'cor' + +export default (req, res, next) => { + const { userId } = req + + const { email, password } = req.body + + try { + logic.updateEmail(userId, email, password) + .then(() => res.status(204).send()) + .catch(error => next(error)) + } catch (error) { + next(error) + } +} \ No newline at end of file diff --git a/staff/lucas-orts/project/api/handlers/updatePasswordHandler.js b/staff/lucas-orts/project/api/handlers/updatePasswordHandler.js index 617e8536d..4b96fd4a0 100644 --- a/staff/lucas-orts/project/api/handlers/updatePasswordHandler.js +++ b/staff/lucas-orts/project/api/handlers/updatePasswordHandler.js @@ -3,10 +3,10 @@ import { logic } from '../../cor/index.js' export default (req, res, next) => { const { userId } = req - const { oldPassword, newPassword } = req.body + const { oldPassword, newPassword, newPasswordRepeat } = req.body try { - logic.updatePassword(userId, oldPassword, newPassword) + logic.updatePassword(userId, oldPassword, newPassword, newPasswordRepeat) .then(() => res.status(204).send()) .catch(error => next(error)) } catch (error) { diff --git a/staff/lucas-orts/project/api/handlers/updateProductPriceHandler.js b/staff/lucas-orts/project/api/handlers/updateProductPriceHandler.js new file mode 100644 index 000000000..4ce629bf6 --- /dev/null +++ b/staff/lucas-orts/project/api/handlers/updateProductPriceHandler.js @@ -0,0 +1,17 @@ +import { logic } from 'cor' + +export default (req, res, next) => { + const { userId } = req + + const { productId } = req.params + + const { minprice, maxprice } = req.body + + try { + logic.updateProductPrice(userId, productId, minprice, maxprice) + .then(() => res.status(204).send()) + .catch(error => next(error)) + } catch (error) { + next(error) + } +} \ No newline at end of file diff --git a/staff/lucas-orts/project/api/handlers/updateUserAddressHandler.js b/staff/lucas-orts/project/api/handlers/updateUserAddressHandler.js index 789799c75..6f1883125 100644 --- a/staff/lucas-orts/project/api/handlers/updateUserAddressHandler.js +++ b/staff/lucas-orts/project/api/handlers/updateUserAddressHandler.js @@ -1,4 +1,4 @@ -import { logic } from '../../cor/index.js' +import { logic } from 'cor' export default (req, res, next) => { const { userId } = req diff --git a/staff/lucas-orts/project/api/handlers/updateUserPhoneHandler.js b/staff/lucas-orts/project/api/handlers/updateUserPhoneHandler.js index cfdb3820e..1ffd81ed8 100644 --- a/staff/lucas-orts/project/api/handlers/updateUserPhoneHandler.js +++ b/staff/lucas-orts/project/api/handlers/updateUserPhoneHandler.js @@ -1,4 +1,4 @@ -import { logic } from '../../cor/index.js' +import { logic } from 'cor' export default (req, res, next) => { const { userId } = req diff --git a/staff/lucas-orts/project/api/index.js b/staff/lucas-orts/project/api/index.js index 031a43141..d4a161f74 100644 --- a/staff/lucas-orts/project/api/index.js +++ b/staff/lucas-orts/project/api/index.js @@ -8,6 +8,12 @@ import { registerUserHandler, authenticateUserHandler, getUserNameHandler, + updatePasswordHandler, + updateUserAddressHandler, + updateUserPhoneHandler, + updateEmailHandler, + createProductHandler, + updateProductPriceHandler } from './handlers/index.js' mongoose.connect(process.env.MONGODB_URI) @@ -24,6 +30,18 @@ mongoose.connect(process.env.MONGODB_URI) api.get('/users/:targetUserId/name', jwtVerifier, getUserNameHandler) + api.patch('/users/password', jwtVerifier, jsonBodyParser, updatePasswordHandler) + + api.patch('/users/address', jwtVerifier, jsonBodyParser, updateUserAddressHandler) + + api.patch('/users/phone', jwtVerifier, jsonBodyParser, updateUserPhoneHandler) + + api.patch('/users/email', jwtVerifier, jsonBodyParser, updateEmailHandler) + + api.post('/products', jwtVerifier, jsonBodyParser, createProductHandler) + + api.patch('/products/price', jwtVerifier, jsonBodyParser, updateProductPriceHandler) + api.use(errorHandler) api.listen(process.env.PORT, () => console.info(`API listening on PORT ${process.env.PORT}`)) diff --git a/staff/lucas-orts/project/api/test/update-address.sh b/staff/lucas-orts/project/api/test/update-address.sh new file mode 100644 index 000000000..d071b37db --- /dev/null +++ b/staff/lucas-orts/project/api/test/update-address.sh @@ -0,0 +1 @@ +curl -v http://localhost:8080/users/address -X PATCH -d '{"address":"Calle Loturia 5, Marbella"}' -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmM3NGM4YTM2MGNmY2UwN2U3OWI5YTIiLCJpYXQiOjE3MjQzMzczNTN9.XbsybN3JliqNyBnOcK59BNJ88Btz_lbdaWRD8Tk4xTY" \ No newline at end of file diff --git a/staff/lucas-orts/project/api/test/update-email.sh b/staff/lucas-orts/project/api/test/update-email.sh new file mode 100644 index 000000000..16c92b90e --- /dev/null +++ b/staff/lucas-orts/project/api/test/update-email.sh @@ -0,0 +1 @@ +curl -v http://localhost:8080/users/email -X PATCH -d '{"email":"peta2@zeta.com", "password":"123456789"}' -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmM3NGM4YTM2MGNmY2UwN2U3OWI5YTIiLCJpYXQiOjE3MjQzMzczNTN9.XbsybN3JliqNyBnOcK59BNJ88Btz_lbdaWRD8Tk4xTY" \ No newline at end of file diff --git a/staff/lucas-orts/project/api/test/update-password.sh b/staff/lucas-orts/project/api/test/update-password.sh new file mode 100644 index 000000000..3f4377c14 --- /dev/null +++ b/staff/lucas-orts/project/api/test/update-password.sh @@ -0,0 +1 @@ +curl -v http://localhost:8080/users/password -X PATCH -d '{"oldPassword":"123123123", "newPassword":"123456789", "newPasswordRepeat":"123456789"}' -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmM3NGM4YTM2MGNmY2UwN2U3OWI5YTIiLCJpYXQiOjE3MjQzMzczNTN9.XbsybN3JliqNyBnOcK59BNJ88Btz_lbdaWRD8Tk4xTY" \ No newline at end of file diff --git a/staff/lucas-orts/project/api/test/update-phone.sh b/staff/lucas-orts/project/api/test/update-phone.sh new file mode 100644 index 000000000..52622103c --- /dev/null +++ b/staff/lucas-orts/project/api/test/update-phone.sh @@ -0,0 +1 @@ +curl -v http://localhost:8080/users/phone -X PATCH -d '{"phone":"+34 965152331"}' -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmM3NGM4YTM2MGNmY2UwN2U3OWI5YTIiLCJpYXQiOjE3MjQzMzczNTN9.XbsybN3JliqNyBnOcK59BNJ88Btz_lbdaWRD8Tk4xTY" \ No newline at end of file diff --git a/staff/lucas-orts/project/cor/logic/index.js b/staff/lucas-orts/project/cor/logic/index.js index e5db6bcbc..bd7d8a1c2 100644 --- a/staff/lucas-orts/project/cor/logic/index.js +++ b/staff/lucas-orts/project/cor/logic/index.js @@ -5,6 +5,8 @@ import updateEmail from './updateEmail.js' import updatePassword from './updatePassword.js' import updateUserAddress from './updateUserAddress.js' import updateUserPhone from './updateUserPhone.js' +import createProduct from './createProduct.js' +import updateProductPrice from './updateProductPrice.js' const logic = { registerUser, @@ -13,7 +15,9 @@ const logic = { updateEmail, updatePassword, updateUserAddress, - updateUserPhone + updateUserPhone, + createProduct, + updateProductPrice } export default logic \ No newline at end of file diff --git a/staff/lucas-orts/project/cor/logic/updateEmail.spec.js b/staff/lucas-orts/project/cor/logic/updateEmail.spec.js index 524f0e23e..d58714139 100644 --- a/staff/lucas-orts/project/cor/logic/updateEmail.spec.js +++ b/staff/lucas-orts/project/cor/logic/updateEmail.spec.js @@ -11,7 +11,7 @@ import { User } from '../data/models.js' import errors from '../../com/errors.js' -const { NotFoundError, ValidationError } = errors +const { NotFoundError, ValidationError, CredentialsError } = errors describe('updateEmail', () => { before(() => mongoose.connect(process.env.MONGODB_URI)) @@ -22,10 +22,10 @@ describe('updateEmail', () => { debugger return bcrypt.hash('123123123', 8) .then(hash => User.create({ name: 'Ester', surname: 'Colero', email: 'ester@colero.com', phone: '966234731', address: 'calle Tertulia 3, Cuenca', password: hash })) - .then(user => updateEmail(user.id, 'Peta@zeta.com', '123123123') - .then(() => User.findOne({ email: 'Peta@zeta.com' }).lean() + .then(user => updateEmail(user.id, 'peta@zeta.com', '123123123') + .then(() => User.findOne({ email: 'peta@zeta.com' }).lean() .then(user => { - expect(user.email).to.equal('Peta@zeta.com') + expect(user.email).to.equal('peta@zeta.com') }) .then(match => expect(match).to.be.true) ) @@ -35,7 +35,7 @@ describe('updateEmail', () => { it('fails on non-existing user', () => { let _error - return updateEmail(new ObjectId().toString(), 'Peta@zeta.com', '123123123') + return updateEmail(new ObjectId().toString(), 'peta@zeta.com', '123123123') .catch(error => _error = error) .finally(() => { expect(_error).to.be.instanceOf(NotFoundError) @@ -43,23 +43,11 @@ describe('updateEmail', () => { }) }) - it('fails on non matching passwords', () => { - let _error - - return User.create({ name: 'Ester', surname: 'Colero', email: 'ester@colero.com', phone: '966234731', address: 'calle Tertulia 3, Cuenca', password: '123123123' }) - .then(user => updateEmail(user.id, 'Peta@zeta.com', '123123124')) - .catch(error => _error = error) - .finally(() => { - expect(_error).to.be.instanceOf(ValidationError) - expect(_error.message).to.equal('wrong password') - }) - }) - it('fails on non-string userId', () => { let error try { - updateEmail(123, 'Peta@zeta.com', '123123123') + updateEmail(123, 'peta@zeta.com', '123123123') } catch (_error) { error = _error } finally { @@ -72,7 +60,7 @@ describe('updateEmail', () => { let error try { - updateEmail(new ObjectId().toString(), 'Peta@zeta.com', 123123123) + updateEmail(new ObjectId().toString(), 'peta@zeta.com', 123123123) } catch (_error) { error = _error } finally { @@ -85,7 +73,7 @@ describe('updateEmail', () => { let error try { - updateEmail(new ObjectId().toString(), 'Peta@zeta.com', '123123') + updateEmail(new ObjectId().toString(), 'peta@zeta.com', '123123') } catch (_error) { error = _error } finally { @@ -98,7 +86,7 @@ describe('updateEmail', () => { let error try { - updateEmail(new ObjectId().toString(), 'Peta@zeta.com', '123123 123') + updateEmail(new ObjectId().toString(), 'peta@zeta.com', '123123 123') } catch (_error) { error = _error } finally { @@ -111,11 +99,11 @@ describe('updateEmail', () => { let error try { - updateEmail(new ObjectId().toString(), 'Peta@zeta.com', '123123123') + updateEmail(new ObjectId().toString(), 'peta@zeta.com', '123123123') } catch (_error) { error = _error } finally { - expect(error).to.be.instanceOf(Error) + expect(error).to.be.instanceOf(CredentialsError) expect(error.message).to.equal('passwords do not match') } }) diff --git a/staff/lucas-orts/project/cor/logic/updateEmail.test.js b/staff/lucas-orts/project/cor/logic/updateEmail.test.js index 05c3aaeb3..9d210f733 100644 --- a/staff/lucas-orts/project/cor/logic/updateEmail.test.js +++ b/staff/lucas-orts/project/cor/logic/updateEmail.test.js @@ -3,7 +3,7 @@ import updateEmail from './updateEmail.js' import mongoose from 'mongoose' mongoose.connect(process.env.MONGODB_URI) - .then(() => updateEmail('66c44943fedca00b82f34b98', 'ester1@colero.com', '123123123')) + .then(() => updateEmail('66c7435ea25f13cef7c37a31', 'ester1@colero.com', '123123123')) .then(() => console.log('Email updated')) .catch(error => console.error(error)) .finally(() => mongoose.disconnect()) \ No newline at end of file diff --git a/staff/lucas-orts/project/cor/logic/updateProductPrice.js b/staff/lucas-orts/project/cor/logic/updateProductPrice.js index d4616fa9a..ebcf87e93 100644 --- a/staff/lucas-orts/project/cor/logic/updateProductPrice.js +++ b/staff/lucas-orts/project/cor/logic/updateProductPrice.js @@ -2,11 +2,11 @@ import { User, Product } from '../data/models.js' import { validate, errors } from '../../com/index.js' const { NotFoundError, SystemError } = errors -export default (userId, productId, minprize, maxprize) => { +export default (userId, productId, minprice, maxprice) => { validate.string(userId, 'userId') validate.string(productId, 'productId') - validate.number(minprize, 'minprize') - validate.number(maxprize, 'maxprize') + validate.number(minprice, 'minprice') + validate.number(maxprice, 'maxprice') return User.findById(userId).lean() .catch(error => { throw new SystemError(error.message) }) @@ -18,7 +18,7 @@ export default (userId, productId, minprize, maxprize) => { .then(product => { if (!product) throw new NotFoundError('product not found') - return Product.updateOne({ _id: productId }, { $set: { minprize, maxprize } }) + return Product.updateOne({ _id: productId }, { $set: { minprice, maxprice } }) .catch(error => { throw new SystemError(error.message) }) }) })