UsersController.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  2. import User, { UserRoles } from 'App/Models/User'
  3. import PaginationService from 'App/Services/PaginationService'
  4. import { schema, rules } from '@ioc:Adonis/Core/Validator'
  5. import randomstring from 'randomstring'
  6. import Database from '@ioc:Adonis/Lucid/Database'
  7. import { HttpException } from '@adonisjs/http-server/build/src/Exceptions/HttpException'
  8. import { HttpStatusCode } from 'axios'
  9. export default class UsersController {
  10. private paginationService = new PaginationService(User)
  11. public async index({ request }: HttpContextContract) {
  12. return await this.paginationService.paginate(request.all())
  13. }
  14. public async store({ request }: HttpContextContract) {
  15. await request.validate({
  16. schema: schema.create({
  17. username: schema.string([])
  18. })
  19. })
  20. return await User.create(request.all())
  21. }
  22. public async newAdminUser({ request, bouncer }: HttpContextContract) {
  23. await bouncer.authorize('admin')
  24. const data = await request.validate({
  25. schema: schema.create({
  26. username: schema.string([]),
  27. password: schema.string([]),
  28. email: schema.string.optional([rules.email()])
  29. })
  30. })
  31. return await User.create({
  32. ...data,
  33. role: UserRoles.Admin
  34. })
  35. }
  36. public async show({ params }: HttpContextContract) {
  37. return await User.findOrFail(params.id)
  38. }
  39. public async update({ params, request }: HttpContextContract) {
  40. const user = await User.findOrFail(params.id)
  41. const payload = await request.validate({
  42. schema: schema.create({
  43. username: schema.string.optional([rules.maxLength(20)]),
  44. avatar: schema.string.optional([rules.maxLength(255)])
  45. })
  46. })
  47. user.merge(payload)
  48. return await user.save()
  49. }
  50. public async updatePassword({ params, request, auth }: HttpContextContract) {
  51. if (!auth.user) {
  52. throw new HttpException('Unauthorized', HttpStatusCode.BadRequest)
  53. }
  54. const user = await User.findOrFail(auth.user.id)
  55. const payload = await request.validate({
  56. schema: schema.create({
  57. password: schema.string([rules.minLength(6), rules.maxLength(18)])
  58. })
  59. })
  60. user.password = payload.password
  61. return await user.save()
  62. }
  63. public async destroy({ params }: HttpContextContract) {
  64. const user = await User.findOrFail(params.id)
  65. await user.delete()
  66. }
  67. public async my({ auth }: HttpContextContract) {
  68. return auth.user
  69. }
  70. public async myAdmin({ auth, bouncer }: HttpContextContract) {
  71. // await bouncer.authorize('admin')
  72. return auth.user
  73. }
  74. public async guest({ auth }: HttpContextContract) {
  75. const user = await User.create({
  76. username: 'fs_' + randomstring.generate(8),
  77. email: randomstring.generate(8) + '@guest.com',
  78. visitor: true
  79. })
  80. return {
  81. user,
  82. token: (await auth.use('api').generate(user)).token
  83. }
  84. }
  85. public async invited({ auth }: HttpContextContract) {
  86. return (
  87. await Database.from('users').where('referrer', auth.user!.id).count('*', 'count')
  88. )[0]
  89. }
  90. }