diff --git a/api/coverage/cobertura-coverage.xml b/api/coverage/cobertura-coverage.xml index b417b806..c933af7f 100644 --- a/api/coverage/cobertura-coverage.xml +++ b/api/coverage/cobertura-coverage.xml @@ -1,6 +1,6 @@ - + C:\dev\movinin\src\api @@ -49,22 +49,52 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + @@ -76,107 +106,90 @@ + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - + - + - + - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -193,6 +206,7 @@ + @@ -230,52 +244,52 @@ - + - + - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -312,27 +326,27 @@ - + - + - + - + - + @@ -342,18 +356,19 @@ - + - + - + + @@ -363,6 +378,7 @@ + @@ -382,6 +398,7 @@ + @@ -409,6 +426,7 @@ + @@ -419,6 +437,7 @@ + @@ -432,35 +451,36 @@ + - - + + - + - + - + - + - + @@ -470,12 +490,12 @@ - + - + @@ -490,7 +510,7 @@ - + @@ -500,7 +520,7 @@ - + @@ -510,7 +530,7 @@ - + @@ -520,18 +540,19 @@ - + - + + @@ -539,6 +560,7 @@ + @@ -551,6 +573,7 @@ + @@ -599,6 +622,7 @@ + @@ -632,6 +656,7 @@ + @@ -657,6 +682,7 @@ + @@ -671,6 +697,7 @@ + @@ -678,6 +705,7 @@ + @@ -695,6 +723,7 @@ + @@ -734,6 +763,7 @@ + @@ -742,6 +772,7 @@ + @@ -757,17 +788,17 @@ - + - + - + @@ -777,12 +808,12 @@ - + - + @@ -792,18 +823,19 @@ - + - + + @@ -813,6 +845,7 @@ + @@ -826,6 +859,7 @@ + @@ -845,6 +879,7 @@ + @@ -857,6 +892,7 @@ + @@ -868,6 +904,7 @@ + @@ -878,6 +915,7 @@ + @@ -891,17 +929,17 @@ - + - + - + @@ -911,7 +949,7 @@ - + @@ -921,7 +959,7 @@ - + @@ -933,6 +971,7 @@ + @@ -943,6 +982,7 @@ + @@ -952,6 +992,7 @@ + @@ -971,6 +1012,7 @@ + @@ -990,6 +1032,7 @@ + @@ -1010,37 +1053,37 @@ - + - + - + - + - + - + - + @@ -1050,7 +1093,7 @@ - + @@ -1060,7 +1103,7 @@ - + @@ -1070,12 +1113,12 @@ - + - + @@ -1087,6 +1130,7 @@ + @@ -1122,6 +1166,7 @@ + @@ -1190,6 +1235,7 @@ + @@ -1199,6 +1245,7 @@ + @@ -1213,6 +1260,7 @@ + @@ -1222,6 +1270,7 @@ + @@ -1230,6 +1279,7 @@ + @@ -1246,6 +1296,7 @@ + @@ -1259,6 +1310,7 @@ + @@ -1288,6 +1340,7 @@ + @@ -1300,6 +1353,7 @@ + @@ -1324,618 +1378,646 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - - + + - - - - + + + + - + - - - - - + + + + + - + - - - - + + + + + + + - - + + - + - - - - + + + + - + - - - + + + - - - + + + - + - - + + + - - - - - - - - - - + + + + + + + + + + - - + + + - - - - + + + + - - - - - - - - - - + + + + + + + + + + + - + - - - - + + + + - - + + - + + - - - - - - - - + + + + + + + + - + - - - + + + - + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + - - + + - - - - - + + + + + + - + - + + - - - - - - - - + + + + + + + + - - + + + - - - - - + + + + + - + - - + + - - - + + + - + - + + - - - - - - + + + + + + - - - + + + - + - + - + - + + - - - - - + + + + + - - - - + + + + - + - - - - - - + + + + + + - + - - + + + - - - - - + + + + + - + - - + + - + + - - - - - + + + + + - + - + - + + - - - - - + + + + + - - + + - - - - + + + + + - + - - - - - - + + + + + + + - - - - - - - + + + + + + + - + - + - + - - + + + - - - - - - - + + + + + + + - + - + - - + + + - - - - - + + + + + - - - - - - - - + + + + + + + + + - - + + - - + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + + - - - - - + + + + + - + - - - + + + + - - - - - - + + + + + + - + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - + + + + @@ -1959,7 +2041,7 @@ - + @@ -1971,6 +2053,7 @@ + @@ -2000,7 +2083,7 @@ - + @@ -2042,11 +2125,11 @@ - + - + - + @@ -2054,16 +2137,16 @@ - - + + - + - + @@ -2071,16 +2154,16 @@ - + - + - + - + - + @@ -2088,8 +2171,8 @@ - - + + @@ -2144,7 +2227,7 @@ - + @@ -2164,9 +2247,9 @@ - - - + + + diff --git a/api/src/common/AuthHelper.ts b/api/src/common/AuthHelper.ts new file mode 100644 index 00000000..adab2607 --- /dev/null +++ b/api/src/common/AuthHelper.ts @@ -0,0 +1,42 @@ +import { Request } from 'express' +import * as Helper from './Helper' +import * as env from '../config/env.config' + +/** + * Check whether the request is from the backend or not. + * + * @export + * @param {Request} req + * @returns {boolean} + */ +export const isBackend = (req: Request): boolean => !!req.headers.origin && Helper.trim(req.headers.origin, '/') === Helper.trim(env.BACKEND_HOST, '/') + +/** + * Check whether the request is from the frontend or not. + * + * @export + * @param {Request} req + * @returns {boolean} + */ +export const isFrontend = (req: Request): boolean => !!req.headers.origin && Helper.trim(req.headers.origin, '/') === Helper.trim(env.FRONTEND_HOST, '/') + +/** + * Get authentification cookie name. + * + * @param {Request} req + * @returns {string} + */ +export const getAuthCookieName = (req: Request): string => { + if (isBackend(req)) { + // Backend auth cookie name + return env.BACKEND_AUTH_COOKIE_NAME + } + + if (isFrontend(req)) { + // Frontend auth cookie name + return env.FRONTEND_AUTH_COOKIE_NAME + } + + // Mobile app and unit tests auth header name + return env.X_ACCESS_TOKEN +} diff --git a/api/src/common/DatabaseHelper.ts b/api/src/common/DatabaseHelper.ts index ca613d1f..ee4ab58d 100644 --- a/api/src/common/DatabaseHelper.ts +++ b/api/src/common/DatabaseHelper.ts @@ -9,7 +9,7 @@ import * as env from '../config/env.config' * @param {boolean} debug * @returns {Promise} */ -export async function Connect(debug: boolean = false): Promise { +export const Connect = async (debug: boolean = false): Promise => { let options: ConnectOptions = {} if (env.DB_SSL) { @@ -41,6 +41,6 @@ export async function Connect(debug: boolean = false): Promise { * @param {boolean} force * @returns {Promise} */ -export async function Close(force: boolean = false): Promise { +export const Close = async (force: boolean = false): Promise => { await mongoose.connection.close(force) } diff --git a/api/src/common/Helper.ts b/api/src/common/Helper.ts index 7ad35e66..c8e93f55 100644 --- a/api/src/common/Helper.ts +++ b/api/src/common/Helper.ts @@ -1,9 +1,7 @@ import fs from 'node:fs/promises' import path from 'node:path' -import { Request } from 'express' import mongoose from 'mongoose' import validator from 'validator' -import * as env from '../config/env.config' /** * Convert string to boolean. @@ -12,7 +10,7 @@ import * as env from '../config/env.config' * @param {string} input * @returns {boolean} */ -export function StringToBoolean(input: string): boolean { +export const StringToBoolean = (input: string): boolean => { try { return Boolean(JSON.parse(input.toLowerCase())) } catch { @@ -28,7 +26,7 @@ export function StringToBoolean(input: string): boolean { * @param {string} filePath * @returns {Promise} */ -export async function exists(filePath: string): Promise { +export const exists = async (filePath: string): Promise => { try { await fs.access(filePath) return true @@ -46,7 +44,7 @@ export async function exists(filePath: string): Promise { * @param {boolean} recursive * @returns {Promise} */ -export async function mkdir(folder: string) { +export const mkdir = async (folder: string) => { await fs.mkdir(folder, { recursive: true }) } @@ -58,7 +56,7 @@ export async function mkdir(folder: string) { * @param {string} char * @returns {string} */ -export function trim(str: string, char: string): string { +export const trim = (str: string, char: string): string => { let res = str while (res.charAt(res.length - 1) === char) { res = res.substring(0, res.length - 1) @@ -74,7 +72,7 @@ export function trim(str: string, char: string): string { * @param {string} part2 * @returns {string} */ -export function joinURL(part1: string, part2: string): string { +export const joinURL = (part1: string, part2: string): string => { const p1 = trim(part1, '/') let p2 = part2 @@ -92,9 +90,7 @@ export function joinURL(part1: string, part2: string): string { * @param {string} filename * @returns {string} */ -export function getFilenameWithoutExtension(filename: string): string { - return path.parse(filename).name -} +export const getFilenameWithoutExtension = (filename: string): string => path.parse(filename).name /** * Clone an object or an array. @@ -104,58 +100,13 @@ export function getFilenameWithoutExtension(filename: string): string { */ export const clone = (obj: any) => (Array.isArray(obj) ? Array.from(obj) : ({ ...obj })) -/** - * Check whether the request is from the backend or not. - * - * @export - * @param {Request} req - * @returns {boolean} - */ -export function isBackend(req: Request): boolean { - return !!req.headers.origin && trim(req.headers.origin, '/') === trim(env.BACKEND_HOST, '/') -} - -/** - * Check whether the request is from the frontend or not. - * - * @export - * @param {Request} req - * @returns {boolean} - */ -export function isFrontend(req: Request): boolean { - return !!req.headers.origin && trim(req.headers.origin, '/') === trim(env.FRONTEND_HOST, '/') -} - -/** - * Get authentification cookie name. - * - * @param {Request} req - * @returns {string} - */ -export const getAuthCookieName = (req: Request): string => { - if (isBackend(req)) { - // Backend auth cookie name - return env.BACKEND_AUTH_COOKIE_NAME - } - - if (isFrontend(req)) { - // Frontend auth cookie name - return env.FRONTEND_AUTH_COOKIE_NAME - } - - // Mobile app and unit tests auth header name - return env.X_ACCESS_TOKEN -} - /** * Check ObjectId. * * @param {?string} id * @returns {boolean} */ -export function isValidObjectId(id?: string) { - return mongoose.isValidObjectId(id) -} +export const isValidObjectId = (id?: string) => mongoose.isValidObjectId(id) /** * Check email. @@ -163,6 +114,4 @@ export function isValidObjectId(id?: string) { * @param {string} email * @returns {boolean} */ -export function isValidEmail(email?: string) { - return !!email && validator.isEmail(email) -} +export const isValidEmail = (email?: string) => !!email && validator.isEmail(email) diff --git a/api/src/common/MailHelper.ts b/api/src/common/MailHelper.ts index 950dbf73..65a02ab2 100644 --- a/api/src/common/MailHelper.ts +++ b/api/src/common/MailHelper.ts @@ -9,7 +9,7 @@ import * as env from '../config/env.config' * @param {nodemailer.SendMailOptions} mailOptions * @returns {Promise} */ -export function sendMail(mailOptions: nodemailer.SendMailOptions) { +export const sendMail = (mailOptions: nodemailer.SendMailOptions) => { const transporterOptions: SMTPTransport.Options = { host: env.SMTP_HOST, port: env.SMTP_PORT, diff --git a/api/src/controllers/agencyController.ts b/api/src/controllers/agencyController.ts index 113d1a25..7f998642 100644 --- a/api/src/controllers/agencyController.ts +++ b/api/src/controllers/agencyController.ts @@ -21,7 +21,7 @@ import * as Helper from '../common/Helper' * @param {Response} res * @returns {unknown} */ -export async function validate(req: Request, res: Response) { +export const validate = async (req: Request, res: Response) => { const { body }: { body: movininTypes.ValidateAgencyPayload } = req const { fullName } = body @@ -48,7 +48,7 @@ export async function validate(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function update(req: Request, res: Response) { +export const update = async (req: Request, res: Response) => { const { body }: { body: movininTypes.UpdateAgencyPayload } = req const { _id } = body @@ -100,7 +100,7 @@ export async function update(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteAgency(req: Request, res: Response) { +export const deleteAgency = async (req: Request, res: Response) => { const { id } = req.params try { @@ -154,7 +154,7 @@ export async function deleteAgency(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getAgency(req: Request, res: Response) { +export const getAgency = async (req: Request, res: Response) => { const { id } = req.params try { @@ -201,7 +201,7 @@ export async function getAgency(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getAgencies(req: Request, res: Response) { +export const getAgencies = async (req: Request, res: Response) => { try { const page = Number.parseInt(req.params.page, 10) const size = Number.parseInt(req.params.size, 10) @@ -253,7 +253,7 @@ export async function getAgencies(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getAllAgencies(req: Request, res: Response) { +export const getAllAgencies = async (req: Request, res: Response) => { try { let data = await User.aggregate( [ diff --git a/api/src/controllers/bookingController.ts b/api/src/controllers/bookingController.ts index 39e2ed9d..8a88766b 100644 --- a/api/src/controllers/bookingController.ts +++ b/api/src/controllers/bookingController.ts @@ -26,7 +26,7 @@ import * as Helper from '../common/Helper' * @param {Response} res * @returns {unknown} */ -export async function create(req: Request, res: Response) { +export const create = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.Booking } = req const booking = new Booking(body) @@ -49,7 +49,7 @@ export async function create(req: Request, res: Response) { * @param {string} notificationMessage * @returns {*} */ -async function notifyAgency(user: env.User, bookingId: string, agency: env.User, notificationMessage: string) { +const notifyAgency = async (user: env.User, bookingId: string, agency: env.User, notificationMessage: string) => { // notification const message = `${user.fullName} ${notificationMessage} ${bookingId}.` const notification = new Notification({ @@ -94,7 +94,7 @@ async function notifyAgency(user: env.User, bookingId: string, agency: env.User, * @param {Response} res * @returns {unknown} */ -export async function checkout(req: Request, res: Response) { +export const checkout = async (req: Request, res: Response) => { try { let user: env.User | null const { body }: { body: movininTypes.CheckoutPayload } = req @@ -211,7 +211,7 @@ export async function checkout(req: Request, res: Response) { * @param {env.Booking} booking * @returns {*} */ -async function notifyRenter(booking: env.Booking) { +const notifyRenter = async (booking: env.Booking) => { const renter = await User.findById(booking.renter) if (!renter) { @@ -314,7 +314,7 @@ async function notifyRenter(booking: env.Booking) { * @param {Response} res * @returns {unknown} */ -export async function update(req: Request, res: Response) { +export const update = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.Booking } = req if (!body._id) { @@ -374,7 +374,7 @@ export async function update(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function updateStatus(req: Request, res: Response) { +export const updateStatus = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.UpdateStatusPayload } = req const { ids: _ids, status } = body @@ -406,7 +406,7 @@ export async function updateStatus(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteBookings(req: Request, res: Response) { +export const deleteBookings = async (req: Request, res: Response) => { try { const { body }: { body: string[] } = req const ids = body.map((id) => new mongoose.Types.ObjectId(id)) @@ -429,7 +429,7 @@ export async function deleteBookings(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getBooking(req: Request, res: Response) { +export const getBooking = async (req: Request, res: Response) => { const { id } = req.params try { @@ -504,7 +504,7 @@ export async function getBooking(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getBookings(req: Request, res: Response) { +export const getBookings = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.GetBookingsPayload } = req const page = Number.parseInt(req.params.page, 10) @@ -688,7 +688,7 @@ export async function getBookings(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function hasBookings(req: Request, res: Response) { +export const hasBookings = async (req: Request, res: Response) => { const { renter } = req.params try { @@ -719,7 +719,7 @@ export async function hasBookings(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function cancelBooking(req: Request, res: Response) { +export const cancelBooking = async (req: Request, res: Response) => { const { id } = req.params try { diff --git a/api/src/controllers/locationController.ts b/api/src/controllers/locationController.ts index 76226380..e10305ae 100644 --- a/api/src/controllers/locationController.ts +++ b/api/src/controllers/locationController.ts @@ -17,7 +17,7 @@ import Property from '../models/Property' * @param {Response} res * @returns {unknown} */ -export async function validate(req: Request, res: Response) { +export const validate = async (req: Request, res: Response) => { const { body }: { body: movininTypes.ValidateLocationPayload } = req const { language, name } = body @@ -45,7 +45,7 @@ export async function validate(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function create(req: Request, res: Response) { +export const create = async (req: Request, res: Response) => { const { body }: { body: movininTypes.LocationName[] } = req const names = body @@ -78,7 +78,7 @@ export async function create(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function update(req: Request, res: Response) { +export const update = async (req: Request, res: Response) => { const { id } = req.params try { @@ -122,7 +122,7 @@ export async function update(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteLocation(req: Request, res: Response) { +export const deleteLocation = async (req: Request, res: Response) => { const { id } = req.params try { @@ -150,7 +150,7 @@ export async function deleteLocation(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getLocation(req: Request, res: Response) { +export const getLocation = async (req: Request, res: Response) => { const { id } = req.params try { @@ -179,7 +179,7 @@ export async function getLocation(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getLocations(req: Request, res: Response) { +export const getLocations = async (req: Request, res: Response) => { try { const page = Number.parseInt(req.params.page, 10) const size = Number.parseInt(req.params.size, 10) @@ -239,7 +239,7 @@ export async function getLocations(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function checkLocation(req: Request, res: Response) { +export const checkLocation = async (req: Request, res: Response) => { const { id } = req.params try { diff --git a/api/src/controllers/notificationController.ts b/api/src/controllers/notificationController.ts index d2b4f505..2470bb43 100644 --- a/api/src/controllers/notificationController.ts +++ b/api/src/controllers/notificationController.ts @@ -13,7 +13,7 @@ import NotificationCounter from '../models/NotificationCounter' * @param {Response} res * @returns {unknown} */ -export async function notificationCounter(req: Request, res: Response) { +export const notificationCounter = async (req: Request, res: Response) => { const { userId } = req.params try { const counter = await NotificationCounter.findOne({ user: userId }) @@ -40,7 +40,7 @@ export async function notificationCounter(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getNotifications(req: Request, res: Response) { +export const getNotifications = async (req: Request, res: Response) => { const { userId: _userId, page: _page, size: _size } = req.params try { @@ -78,7 +78,7 @@ export async function getNotifications(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function markAsRead(req: Request, res: Response) { +export const markAsRead = async (req: Request, res: Response) => { try { const { body }: { body: { ids: string[] } } = req const { ids: _ids } = body @@ -125,7 +125,7 @@ export async function markAsRead(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function markAsUnRead(req: Request, res: Response) { +export const markAsUnRead = async (req: Request, res: Response) => { try { const { body }: { body: { ids: string[] } } = req const { ids: _ids } = body @@ -172,7 +172,7 @@ export async function markAsUnRead(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteNotifications(req: Request, res: Response) { +export const deleteNotifications = async (req: Request, res: Response) => { try { const { body }: { body: { ids: string[] } } = req const { ids: _ids } = body diff --git a/api/src/controllers/propertyController.ts b/api/src/controllers/propertyController.ts index e1ae3895..020d6948 100644 --- a/api/src/controllers/propertyController.ts +++ b/api/src/controllers/propertyController.ts @@ -20,7 +20,7 @@ import * as Helper from '../common/Helper.js' * @param {Response} res * @returns {unknown} */ -export async function create(req: Request, res: Response) { +export const create = async (req: Request, res: Response) => { const { body }: { body: movininTypes.CreatePropertyPayload } = req try { @@ -129,7 +129,7 @@ export async function create(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function update(req: Request, res: Response) { +export const update = async (req: Request, res: Response) => { const { body }: { body: movininTypes.UpdatePropertyPayload } = req const { _id } = body @@ -265,7 +265,7 @@ export async function update(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function checkProperty(req: Request, res: Response) { +export const checkProperty = async (req: Request, res: Response) => { const { id } = req.params try { @@ -295,7 +295,7 @@ export async function checkProperty(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteProperty(req: Request, res: Response) { +export const deleteProperty = async (req: Request, res: Response) => { const { id } = req.params try { @@ -329,7 +329,7 @@ export async function deleteProperty(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function uploadImage(req: Request, res: Response) { +export const uploadImage = async (req: Request, res: Response) => { try { if (!req.file) { throw new Error('[property.uploadImage] req.file not found') @@ -355,7 +355,7 @@ export async function uploadImage(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteTempImage(req: Request, res: Response) { +export const deleteTempImage = async (req: Request, res: Response) => { try { const imageFile = path.join(env.CDN_TEMP_PROPERTIES, req.params.fileName) if (!await Helper.exists(imageFile)) { @@ -380,7 +380,7 @@ export async function deleteTempImage(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteImage(req: Request, res: Response) { +export const deleteImage = async (req: Request, res: Response) => { try { const { property: propertyId, image: imageFileName } = req.params @@ -418,7 +418,7 @@ export async function deleteImage(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getProperty(req: Request, res: Response) { +export const getProperty = async (req: Request, res: Response) => { const { id, language } = req.params try { @@ -471,7 +471,7 @@ export async function getProperty(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getProperties(req: Request, res: Response) { +export const getProperties = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.GetPropertiesPayload } = req const page = Number.parseInt(req.params.page, 10) @@ -606,7 +606,7 @@ export async function getProperties(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getBookingProperties(req: Request, res: Response) { +export const getBookingProperties = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.GetBookingPropertiesPayload } = req const agency = new mongoose.Types.ObjectId(body.agency) @@ -649,7 +649,7 @@ export async function getBookingProperties(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getFrontendProperties(req: Request, res: Response) { +export const getFrontendProperties = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.GetPropertiesPayload } = req const page = Number.parseInt(req.params.page, 10) diff --git a/api/src/controllers/userController.ts b/api/src/controllers/userController.ts index 69946629..800c8ee4 100644 --- a/api/src/controllers/userController.ts +++ b/api/src/controllers/userController.ts @@ -14,10 +14,11 @@ import Booking from '../models/Booking' import Token from '../models/Token' import PushToken from '../models/PushToken' import * as Helper from '../common/Helper' +import * as AuthHelper from '../common/AuthHelper' +import * as MailHelper from '../common/MailHelper' import NotificationCounter from '../models/NotificationCounter' import Notification from '../models/Notification' import Property from '../models/Property' -import * as MailHelper from '../common/MailHelper' /** * Get status message as HTML. @@ -44,7 +45,7 @@ const generateToken = () => `${uuid()}-${Date.now()}` * @param {bookcarsTypes.UserType} userType * @returns {unknown} */ -async function _signup(req: Request, res: Response, userType: movininTypes.UserType) { +const _signup = async (req: Request, res: Response, userType: movininTypes.UserType) => { const { body }: { body: movininTypes.SignUpPayload } = req try { @@ -108,7 +109,7 @@ async function _signup(req: Request, res: Response, userType: movininTypes.UserT * @param {Response} res * @returns {unknown} */ -export async function signup(req: Request, res: Response) { +export const signup = async (req: Request, res: Response) => { await _signup(req, res, movininTypes.UserType.User) } @@ -121,7 +122,7 @@ export async function signup(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function adminSignup(req: Request, res: Response) { +export const adminSignup = async (req: Request, res: Response) => { await _signup(req, res, movininTypes.UserType.Admin) } @@ -134,7 +135,7 @@ export async function adminSignup(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function create(req: Request, res: Response) { +export const create = async (req: Request, res: Response) => { const { body }: { body: movininTypes.CreateUserPayload } = req try { @@ -206,7 +207,7 @@ export async function create(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function checkToken(req: Request, res: Response) { +export const checkToken = async (req: Request, res: Response) => { const { userId, email } = req.params try { @@ -255,7 +256,7 @@ export async function checkToken(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteTokens(req: Request, res: Response) { +export const deleteTokens = async (req: Request, res: Response) => { const { userId } = req.params try { @@ -283,7 +284,7 @@ export async function deleteTokens(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function resend(req: Request, res: Response) { +export const resend = async (req: Request, res: Response) => { const { email } = req.params try { @@ -350,7 +351,7 @@ export async function resend(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function activate(req: Request, res: Response) { +export const activate = async (req: Request, res: Response) => { const { body }: { body: movininTypes.ActivatePayload } = req const { userId } = body @@ -394,7 +395,7 @@ export async function activate(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function signin(req: Request, res: Response) { +export const signin = async (req: Request, res: Response) => { const { body }: { body: movininTypes.SignInPayload } = req const { email, password, stayConnected, mobile } = body @@ -479,7 +480,7 @@ export async function signin(req: Request, res: Response) { // // On web, we return the token in a httpOnly, signed, secure and strict sameSite cookie. // - const cookieName = Helper.getAuthCookieName(req) + const cookieName = AuthHelper.getAuthCookieName(req) return res .clearCookie(cookieName) @@ -504,8 +505,8 @@ export async function signin(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function signout(req: Request, res: Response) { - const cookieName = Helper.getAuthCookieName(req) +export const signout = async (req: Request, res: Response) => { + const cookieName = AuthHelper.getAuthCookieName(req) return res .clearCookie(cookieName) @@ -521,7 +522,7 @@ export async function signout(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getPushToken(req: Request, res: Response) { +export const getPushToken = async (req: Request, res: Response) => { const { userId } = req.params try { @@ -550,7 +551,7 @@ export async function getPushToken(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function createPushToken(req: Request, res: Response) { +export const createPushToken = async (req: Request, res: Response) => { const { userId, token } = req.params try { @@ -585,7 +586,7 @@ export async function createPushToken(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deletePushToken(req: Request, res: Response) { +export const deletePushToken = async (req: Request, res: Response) => { const { userId } = req.params try { @@ -610,7 +611,7 @@ export async function deletePushToken(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function validateEmail(req: Request, res: Response) { +export const validateEmail = async (req: Request, res: Response) => { const { body }: { body: movininTypes.ValidateEmailPayload } = req const { email } = body @@ -640,7 +641,7 @@ export async function validateEmail(req: Request, res: Response) { * @param {Response} res * @returns {*} */ -export const validateAccessToken = (req: Request, res: Response) => res.sendStatus(200) +export const validateAccessToken = async (req: Request, res: Response) => res.sendStatus(200) /** * Get Validation result as HTML. @@ -651,7 +652,7 @@ export const validateAccessToken = (req: Request, res: Response) => res.sendStat * @param {Response} res * @returns {unknown} */ -export async function confirmEmail(req: Request, res: Response) { +export const confirmEmail = async (req: Request, res: Response) => { try { const { token: _token, email: _email } = req.params @@ -703,7 +704,7 @@ export async function confirmEmail(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function resendLink(req: Request, res: Response) { +export const resendLink = async (req: Request, res: Response) => { const { body }: { body: movininTypes.ResendLinkPayload } = req const { email } = body @@ -762,7 +763,7 @@ export async function resendLink(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function update(req: Request, res: Response) { +export const update = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.UpdateUserPayload } = req const { _id } = body @@ -823,7 +824,7 @@ export async function update(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function updateEmailNotifications(req: Request, res: Response) { +export const updateEmailNotifications = async (req: Request, res: Response) => { const { body }: { body: movininTypes.UpdateEmailNotificationsPayload } = req try { @@ -860,7 +861,7 @@ export async function updateEmailNotifications(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function updateLanguage(req: Request, res: Response) { +export const updateLanguage = async (req: Request, res: Response) => { try { const { body }: { body: movininTypes.UpdateLanguage } = req const { id, language } = body @@ -894,7 +895,7 @@ export async function updateLanguage(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getUser(req: Request, res: Response) { +export const getUser = async (req: Request, res: Response) => { const { id } = req.params try { if (!Helper.isValidObjectId(id)) { @@ -939,7 +940,7 @@ export async function getUser(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function createAvatar(req: Request, res: Response) { +export const createAvatar = async (req: Request, res: Response) => { try { if (!req.file) { throw new Error('[user.createAvatar] req.file not found') @@ -965,7 +966,7 @@ export async function createAvatar(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function updateAvatar(req: Request, res: Response) { +export const updateAvatar = async (req: Request, res: Response) => { const { userId } = req.params try { @@ -1012,7 +1013,7 @@ export async function updateAvatar(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteAvatar(req: Request, res: Response) { +export const deleteAvatar = async (req: Request, res: Response) => { const { userId } = req.params try { @@ -1048,7 +1049,7 @@ export async function deleteAvatar(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteTempAvatar(req: Request, res: Response) { +export const deleteTempAvatar = async (req: Request, res: Response) => { const { avatar } = req.params try { @@ -1075,7 +1076,7 @@ export async function deleteTempAvatar(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function changePassword(req: Request, res: Response) { +export const changePassword = async (req: Request, res: Response) => { const { body }: { body: movininTypes.changePasswordPayload } = req const { _id, @@ -1134,7 +1135,7 @@ export async function changePassword(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function checkPassword(req: Request, res: Response) { +export const checkPassword = async (req: Request, res: Response) => { const { id, password } = req.params try { @@ -1175,7 +1176,7 @@ export async function checkPassword(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function getUsers(req: Request, res: Response) { +export const getUsers = async (req: Request, res: Response) => { try { const keyword: string = escapeStringRegexp(String(req.query.s || '')) const options = 'i' @@ -1251,7 +1252,7 @@ export async function getUsers(req: Request, res: Response) { * @param {Response} res * @returns {unknown} */ -export async function deleteUsers(req: Request, res: Response) { +export const deleteUsers = async (req: Request, res: Response) => { try { const { body }: { body: string[] } = req const ids: mongoose.Types.ObjectId[] = body.map((id: string) => new mongoose.Types.ObjectId(id)) diff --git a/api/src/middlewares/authJwt.ts b/api/src/middlewares/authJwt.ts index 24988be9..59f865f3 100644 --- a/api/src/middlewares/authJwt.ts +++ b/api/src/middlewares/authJwt.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from 'express' import jwt from 'jsonwebtoken' import * as env from '../config/env.config' -import * as Helper from '../common/Helper' +import * as AuthHelper from '../common/AuthHelper' /** * Verify authentication token middleware. @@ -10,12 +10,12 @@ import * as Helper from '../common/Helper' * @param {Response} res * @param {NextFunction} next */ -function verifyToken(req: Request, res: Response, next: NextFunction) { +const verifyToken = (req: Request, res: Response, next: NextFunction) => { let token: string - if (Helper.isBackend(req)) { + if (AuthHelper.isBackend(req)) { token = req.signedCookies[env.BACKEND_AUTH_COOKIE_NAME] as string // backend - } else if (Helper.isFrontend(req)) { + } else if (AuthHelper.isFrontend(req)) { token = req.signedCookies[env.FRONTEND_AUTH_COOKIE_NAME] as string // frontend } else { token = req.headers[env.X_ACCESS_TOKEN] as string // mobile app and unit tests diff --git a/api/tests/TestHelper.ts b/api/tests/TestHelper.ts index 1f268467..4404826d 100644 --- a/api/tests/TestHelper.ts +++ b/api/tests/TestHelper.ts @@ -12,14 +12,12 @@ import Location from '../src/models/Location' import Notification from '../src/models/Notification' import NotificationCounter from '../src/models/NotificationCounter' -export function getName(prefix: string) { +export const getName = (prefix: string) => { expect(prefix.length).toBeGreaterThan(1) return `${prefix}.${uuid()}` } -export function getAgencyName() { - return getName('agency') -} +export const getAgencyName = () => getName('agency') export const ADMIN_EMAIL = `${getName('admin')}@test.movinin.io` export const USER_EMAIL = `${getName('user')}@test.movinin.io` @@ -32,11 +30,11 @@ export const SIZE = 30 let ADMIN_USER_ID: string let USER_ID: string -export function initializeConsole() { +export const initializeConsole = () => { console.error = () => { } } -export async function initialize() { +export const initialize = async () => { const salt = await bcrypt.genSalt(10) const passwordHash = await bcrypt.hash(PASSWORD, salt) const body = { @@ -62,15 +60,11 @@ export async function initialize() { initializeConsole() } -export function getAdminUserId() { - return ADMIN_USER_ID -} +export const getAdminUserId = () => ADMIN_USER_ID -export function getUserId() { - return USER_ID -} +export const getUserId = () => USER_ID -export async function close() { +export const close = async () => { const res = await User.deleteMany({ email: { $in: [ADMIN_EMAIL, USER_EMAIL] } }) expect(res.deletedCount).toBe(2) await Notification.deleteMany({ user: { $in: [ADMIN_USER_ID, USER_ID] } }) @@ -101,15 +95,11 @@ const signin = async (appType: movininTypes.AppType, email: string) => { return token } -export async function signinAsAdmin() { - return signin(movininTypes.AppType.Backend, ADMIN_EMAIL) -} +export const signinAsAdmin = () => signin(movininTypes.AppType.Backend, ADMIN_EMAIL) -export async function signinAsUser() { - return signin(movininTypes.AppType.Frontend, USER_EMAIL) -} +export const signinAsUser = () => signin(movininTypes.AppType.Frontend, USER_EMAIL) -export async function signout(token: string) { +export const signout = async (token: string) => { const res = await request(app) .post('/api/sign-out') .set('Cookie', [`${env.X_ACCESS_TOKEN}=${token};`]) @@ -120,7 +110,7 @@ export async function signout(token: string) { expect(cookies[0]).toContain(`${env.X_ACCESS_TOKEN}=;`) } -export async function createAgency(email: string, fullName: string) { +export const createAgency = async (email: string, fullName: string) => { const salt = await bcrypt.genSalt(10) const passwordHash = await bcrypt.hash(PASSWORD, salt) const body = { @@ -136,7 +126,7 @@ export async function createAgency(email: string, fullName: string) { return agency.id as string } -export async function deleteAgency(id: string) { +export const deleteAgency = async (id: string) => { const res = await User.deleteOne({ _id: id }) expect(res.deletedCount).toBe(1) @@ -144,7 +134,7 @@ export async function deleteAgency(id: string) { await NotificationCounter.deleteMany({ user: id }) } -export async function deleteLocation(id: string) { +export const deleteLocation = async (id: string) => { const location = await Location.findById(id) expect(location).toBeDefined() @@ -155,7 +145,7 @@ export async function deleteLocation(id: string) { expect(res.deletedCount).toBe(1) } -export async function createLocation(nameEN: string, nameFR: string) { +export const createLocation = async (nameEN: string, nameFR: string) => { const locationValueBodyEN = { language: 'en', value: nameEN, @@ -177,14 +167,8 @@ export async function createLocation(nameEN: string, nameFR: string) { return location.id as string } -export function GetRandomEmail() { - return `random.${uuid()}@test.movinin.io` -} +export const GetRandomEmail = () => `random.${uuid()}@test.movinin.io` -export function GetRandromObjectId() { - return new mongoose.Types.ObjectId() -} +export const GetRandromObjectId = () => new mongoose.Types.ObjectId() -export function GetRandromObjectIdAsString() { - return GetRandromObjectId().toString() -} +export const GetRandromObjectIdAsString = () => GetRandromObjectId().toString() diff --git a/api/tests/helper.test.ts b/api/tests/helper.test.ts index 4eb0727d..dd4eac0d 100644 --- a/api/tests/helper.test.ts +++ b/api/tests/helper.test.ts @@ -1,16 +1,16 @@ import 'dotenv/config' import * as Helper from '../src/common/Helper' -describe('test string to boolean helper function', () => { - it('should authenticate through backend HttpOnly cookie', async () => { +describe('test string to boolean', () => { + it('should convert a string to boolean', () => { expect(Helper.StringToBoolean('true')).toBeTruthy() expect(Helper.StringToBoolean('false')).toBeFalsy() expect(Helper.StringToBoolean('')).toBeFalsy() }) }) -describe('test join url helper function', () => { - it('should join two url parts', async () => { +describe('test join url', () => { + it('should join two url parts', () => { expect(Helper.joinURL('part1/', '/part2')).toBe('part1/part2') expect(Helper.joinURL('part1', '/part2')).toBe('part1/part2') expect(Helper.joinURL('part1/', 'part2')).toBe('part1/part2')