| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import Database from '@ioc:Adonis/Lucid/Database'
- import Membership from 'App/Models/Membership'
- import Referrer from 'App/Models/Referrer'
- import User, { UserRoles } from 'App/Models/User'
- import UserBalance from 'App/Models/UserBalance'
- import Decimal from 'decimal.js'
- import { DateTime } from 'luxon'
- import randomstring from 'randomstring'
- import { addDays } from 'date-fns'
- class UserService {
- public async findById(id: number) {
- return await User.findByOrFail('id', id)
- }
- public async findAll() {
- return await User.query().paginate(1, 10)
- }
- public async register(data: { username?: string; password: string; email?: string }) {
- const user = new User()
- user.merge(data)
- if (!user.username) {
- user.username = 'fs_' + randomstring.generate(8)
- }
- const r = await Referrer.findBy('email', data.email)
- if (r) {
- user.referrer = r.referrer
- }
- await user.save()
- await UserBalance.create({
- userId: user.id,
- balance: new Decimal('9999')
- })
- if (r) {
- const invited = (
- await Database.from('users').where('referrer', r.referrer).count('*', 'count')
- )[0].count
- if ((invited + 1) % 3 === 0) {
- let member = await Membership.query()
- .where('userId', r.referrer)
- .orderBy('expireAt', 'desc')
- .first()
- if (member && member.expireAt.toJSDate() < new Date()) {
- member = null
- }
- const startAt = member ? member.expireAt.toJSDate() : new Date()
- const expireAt = addDays(startAt, 7)
- await Membership.create({
- userId: r.referrer,
- startAt: DateTime.fromJSDate(startAt),
- expireAt: DateTime.fromJSDate(expireAt)
- })
- }
- }
- return user
- }
- public async findReferredUsers(userId: number) {
- const result: Partial<User>[] = []
- const findChildren = async (referrerId: number) => {
- const users = await User.query()
- .select(['id', 'username', 'role', 'referrer'])
- .where('visitor', false)
- .where('referrer', referrerId)
- result.push(...users)
- for (const user of users) {
- await findChildren(user.id)
- }
- }
- await findChildren(userId)
- if (result.length === 0) {
- return [
- {
- username: 'nouser',
- role: UserRoles.Api
- }
- ]
- }
- return result
- }
- }
- export default new UserService()
|