UserService.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import Database from '@ioc:Adonis/Lucid/Database'
  2. import Membership from 'App/Models/Membership'
  3. import Referrer from 'App/Models/Referrer'
  4. import User, { UserRoles } from 'App/Models/User'
  5. import UserBalance from 'App/Models/UserBalance'
  6. import Decimal from 'decimal.js'
  7. import { DateTime } from 'luxon'
  8. import randomstring from 'randomstring'
  9. import { addDays } from 'date-fns'
  10. class UserService {
  11. public async findById(id: number) {
  12. return await User.findByOrFail('id', id)
  13. }
  14. public async findAll() {
  15. return await User.query().paginate(1, 10)
  16. }
  17. public async register(data: { username?: string; password: string; email?: string }) {
  18. const user = new User()
  19. user.merge(data)
  20. if (!user.username) {
  21. user.username = 'fs_' + randomstring.generate(8)
  22. }
  23. const r = await Referrer.findBy('email', data.email)
  24. if (r) {
  25. user.referrer = r.referrer
  26. }
  27. await user.save()
  28. await UserBalance.create({
  29. userId: user.id,
  30. balance: new Decimal('9999')
  31. })
  32. if (r) {
  33. const invited = (
  34. await Database.from('users').where('referrer', r.referrer).count('*', 'count')
  35. )[0].count
  36. if ((invited + 1) % 3 === 0) {
  37. let member = await Membership.query()
  38. .where('userId', r.referrer)
  39. .orderBy('expireAt', 'desc')
  40. .first()
  41. if (member && member.expireAt.toJSDate() < new Date()) {
  42. member = null
  43. }
  44. const startAt = member ? member.expireAt.toJSDate() : new Date()
  45. const expireAt = addDays(startAt, 7)
  46. await Membership.create({
  47. userId: r.referrer,
  48. startAt: DateTime.fromJSDate(startAt),
  49. expireAt: DateTime.fromJSDate(expireAt)
  50. })
  51. }
  52. }
  53. return user
  54. }
  55. public async findReferredUsers(userId: number) {
  56. const result: Partial<User>[] = []
  57. const findChildren = async (referrerId: number) => {
  58. const users = await User.query()
  59. .select(['id', 'username', 'role', 'referrer'])
  60. .where('visitor', false)
  61. .where('referrer', referrerId)
  62. result.push(...users)
  63. for (const user of users) {
  64. await findChildren(user.id)
  65. }
  66. }
  67. await findChildren(userId)
  68. if (result.length === 0) {
  69. return [
  70. {
  71. username: 'nouser',
  72. role: UserRoles.Api
  73. }
  74. ]
  75. }
  76. return result
  77. }
  78. }
  79. export default new UserService()