33 lines
1.2 KiB
Nim
33 lines
1.2 KiB
Nim
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]
|
|
|