AuthController.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { AuthenticationException } from '@adonisjs/auth/build/standalone'
  2. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  3. import User, { UserRoles } from 'App/Models/User'
  4. import { schema, rules } from '@ioc:Adonis/Core/Validator'
  5. import UserBalance from 'App/Models/UserBalance'
  6. import Decimal from 'decimal.js'
  7. export default class AuthController {
  8. public async login({ request, auth }: HttpContextContract) {
  9. const { username, password } = request.all()
  10. return await auth.use('api').attempt(username, password, {
  11. expiresIn: '30 days'
  12. })
  13. }
  14. public async loginAdmin({ request, auth }: HttpContextContract) {
  15. const { username, password } = request.all()
  16. let token
  17. try {
  18. token = await auth.use('api').attempt(username, password, {
  19. expiresIn: '30 days'
  20. })
  21. } catch (error) {
  22. throw new AuthenticationException(error.message, error.code)
  23. }
  24. if (token.user.role !== UserRoles.Admin) {
  25. throw new AuthenticationException('Unauthorized access', 'E_UNAUTHORIZED_ACCESS')
  26. }
  27. return token
  28. }
  29. public async register({ request, auth }: HttpContextContract) {
  30. const data = await request.validate({
  31. schema: schema.create({
  32. username: schema.string({ trim: true }, [
  33. rules.regex(/^[a-zA-Z0-9_]{4,16}$/),
  34. rules.unique({ table: 'users', column: 'username' })
  35. ]),
  36. email: schema.string({ trim: true }, [
  37. rules.email(),
  38. rules.unique({ table: 'users', column: 'email' })
  39. ]),
  40. password: schema.string({ trim: true }, [rules.minLength(6), rules.maxLength(18)])
  41. }),
  42. messages: {
  43. minLength: '{{field}} 最小长度为 {{ options.minLength }}',
  44. maxLength: '{{field}} 最大长度为 {{ options.maxLength }}',
  45. unique: '{{field}} 不可用',
  46. email: '{{field}} 不是有效的邮箱',
  47. regex: '{{field}} 只能包含字母、数字和下划线,长度为4-16位'
  48. }
  49. })
  50. const user = new User()
  51. user.merge(data)
  52. await user.save()
  53. await UserBalance.create({
  54. userId: user.id,
  55. balance: new Decimal('9999')
  56. })
  57. return await auth.use('api').login(user)
  58. }
  59. }