userKeys.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /* global WIKI */
  2. const Model = require('objection').Model
  3. const { DateTime } = require('luxon')
  4. const { nanoid } = require('nanoid')
  5. /**
  6. * Users model
  7. */
  8. module.exports = class UserKey extends Model {
  9. static get tableName() { return 'userKeys' }
  10. static get jsonSchema () {
  11. return {
  12. type: 'object',
  13. required: ['kind', 'token', 'validUntil'],
  14. properties: {
  15. id: {type: 'string'},
  16. kind: {type: 'string'},
  17. token: {type: 'string'},
  18. createdAt: {type: 'string'},
  19. validUntil: {type: 'string'}
  20. }
  21. }
  22. }
  23. static get relationMappings() {
  24. return {
  25. user: {
  26. relation: Model.BelongsToOneRelation,
  27. modelClass: require('./users'),
  28. join: {
  29. from: 'userKeys.userId',
  30. to: 'users.id'
  31. }
  32. }
  33. }
  34. }
  35. async $beforeInsert(context) {
  36. await super.$beforeInsert(context)
  37. this.createdAt = DateTime.utc().toISO()
  38. }
  39. static async generateToken ({ userId, kind, meta }, context) {
  40. const token = await nanoid()
  41. await WIKI.db.userKeys.query().insert({
  42. kind,
  43. token,
  44. meta,
  45. validUntil: DateTime.utc().plus({ days: 1 }).toISO(),
  46. userId
  47. })
  48. return token
  49. }
  50. static async validateToken ({ kind, token, skipDelete }, context) {
  51. const res = await WIKI.db.userKeys.query().findOne({ kind, token }).withGraphJoined('user')
  52. if (res) {
  53. if (skipDelete !== true) {
  54. await WIKI.db.userKeys.query().deleteById(res.id)
  55. }
  56. if (DateTime.utc() > DateTime.fromISO(res.validUntil)) {
  57. throw new WIKI.Error.AuthValidationTokenInvalid()
  58. }
  59. return {
  60. ...res.meta,
  61. user: res.user
  62. }
  63. } else {
  64. throw new WIKI.Error.AuthValidationTokenInvalid()
  65. }
  66. }
  67. static async destroyToken ({ token }) {
  68. return WIKI.db.userKeys.query().findOne({ token }).delete()
  69. }
  70. }