import bcrypt, nre, strutils, uuids import ./configuration import ./db import ./models proc randomString*(cost: int8): string = genSalt(cost) proc hashWithSalt*(pwd: string, salt: string): tuple[hash, salt: string] = result = (hash: hash(pwd, salt), salt: salt) proc hashPwd*(pwd: string, cost: int8): tuple[pwd, salt:string] = let hashed = hashWithSalt(pwd, genSalt(cost)) result = (pwd: hashed.hash, salt: hashed.salt) proc validatePwd*(u: User, givenPwd: string): bool = let salt = u.salt result = compare(u.hashedPwd, hash(givenPwd, salt)) proc nameToSlug*(name: string): string = result = name.replace(re"\W+", "-").toLower proc getMeasureForSlug*(ctx: PMApiContext, userId: UUID, slug: string): Measure = let measures = ctx.db.findMeasuresByUserIdAndSlug($userId, slug) if measures.len < 1: raiseEx NotFoundError, "no measure named '" & slug & "'" result = measures[0] proc getMeasurementForMeasure*(ctx: PMApiContext, measureId, measurementId: UUID): Measurement = let measurements = ctx.db.findMeasurementsByMeasureIdAndId($measureId, $measurementId) if measurements.len < 1: raiseEx NotFoundError, "no measurement for is '" & $measurementId & "'" result = measurements[0]