vvandenb
2 years ago
7 changed files with 128 additions and 126 deletions
@ -1,180 +1,181 @@ |
|||||
import { BadRequestException, Catch, Injectable } from "@nestjs/common"; |
import { BadRequestException, Catch, Injectable } from '@nestjs/common' |
||||
import { InjectRepository } from "@nestjs/typeorm"; |
import { InjectRepository } from '@nestjs/typeorm' |
||||
import { EntityNotFoundError, QueryFailedError, Repository } from "typeorm"; |
import { EntityNotFoundError, QueryFailedError, Repository } from 'typeorm' |
||||
import { User } from "./entity/user.entity"; |
import { User } from './entity/user.entity' |
||||
import { type UserDto } from "./dto/user.dto"; |
import { type UserDto } from './dto/user.dto' |
||||
import { type Channel } from "src/chat/entity/channel.entity"; |
import { type Channel } from 'src/chat/entity/channel.entity' |
||||
import type Result from "src/pong/entity/result.entity"; |
import type Result from 'src/pong/entity/result.entity' |
||||
import { Cron } from "@nestjs/schedule"; |
import { Cron } from '@nestjs/schedule' |
||||
import { randomUUID } from "crypto"; |
import { randomUUID } from 'crypto' |
||||
|
|
||||
@Injectable() |
@Injectable() |
||||
@Catch(QueryFailedError, EntityNotFoundError) |
@Catch(QueryFailedError, EntityNotFoundError) |
||||
export class UsersService { |
export class UsersService { |
||||
constructor( |
constructor ( |
||||
@InjectRepository(User) private readonly usersRepository: Repository<User> |
@InjectRepository(User) private readonly usersRepository: Repository<User> |
||||
) {} |
) {} |
||||
|
|
||||
async save(user: User): Promise<void> { |
async save (user: User): Promise<void> { |
||||
await this.usersRepository.save(user); |
await this.usersRepository.save(user) |
||||
} |
} |
||||
|
|
||||
async findUsers(): Promise<User[]> { |
async findUsers (): Promise<User[]> { |
||||
const users = await this.usersRepository.find({}); |
const users = await this.usersRepository.find({}) |
||||
users.forEach((usr) => { |
users.forEach((usr) => { |
||||
usr.socketKey = ""; |
usr.socketKey = '' |
||||
}); |
}) |
||||
return users; |
return users |
||||
} |
} |
||||
|
|
||||
async findUserByName(username: string): Promise<User> { |
async findUserByName (username: string): Promise<User> { |
||||
const user = await this.usersRepository.findOne({ |
const user = await this.usersRepository.findOne({ |
||||
where: { username }, |
where: { username }, |
||||
relations: { results: true }, |
relations: { results: true } |
||||
}); |
}) |
||||
if (user == null) throw new BadRequestException("User not found."); |
if (user == null) throw new BadRequestException('User not found.') |
||||
return user; |
return user |
||||
} |
} |
||||
|
|
||||
@Cron("0 * * * * *") |
@Cron('0 * * * * *') |
||||
async updateStatus(): Promise<void> { |
async updateStatus (): Promise<void> { |
||||
const users = await this.usersRepository.find({}); |
const users = await this.usersRepository.find({}) |
||||
users.forEach((usr) => { |
users.forEach((usr) => { |
||||
if (Date.now() - usr.lastAccess > 60000) { |
if (Date.now() - usr.lastAccess > 60000) { |
||||
usr.status = "offline"; |
usr.status = 'offline' |
||||
this.usersRepository.save(usr).catch((err) => { |
this.usersRepository.save(usr).catch((err) => { |
||||
console.log(err); |
console.log(err) |
||||
}); |
}) |
||||
} |
} |
||||
}); |
}) |
||||
} |
} |
||||
|
|
||||
async findUser(ftId: number): Promise<User | null> { |
async findUser (ftId: number): Promise<User | null> { |
||||
const user = await this.usersRepository.findOneBy({ ftId }); |
const user = await this.usersRepository.findOneBy({ ftId }) |
||||
if (user == null) return null; |
if (user == null) return null |
||||
user.lastAccess = Date.now(); |
user.lastAccess = Date.now() |
||||
if (user.status === "offline") user.status = "online"; |
if (user.status === 'offline') user.status = 'online' |
||||
await this.usersRepository.save(user); |
await this.usersRepository.save(user) |
||||
return user; |
return user |
||||
} |
} |
||||
|
|
||||
async findOnlineUsers(): Promise<User[]> { |
async findOnlineUsers (): Promise<User[]> { |
||||
const users = await this.usersRepository.find({ |
const users = await this.usersRepository.find({ |
||||
where: { status: "online" }, |
where: { status: 'online' } |
||||
}); |
}) |
||||
users.forEach((usr) => { |
users.forEach((usr) => { |
||||
usr.socketKey = ""; |
usr.socketKey = '' |
||||
}); |
}) |
||||
return users; |
return users |
||||
} |
} |
||||
|
|
||||
async create(userData: UserDto): Promise<User | null> { |
async create (userData: UserDto): Promise<User | null> { |
||||
try { |
try { |
||||
const newUser = this.usersRepository.create(userData); |
const newUser = this.usersRepository.create(userData) |
||||
newUser.socketKey = randomUUID() |
newUser.socketKey = randomUUID() |
||||
return await this.usersRepository.save(newUser); |
return await this.usersRepository.save(newUser) |
||||
} catch (err) { |
} catch (err) { |
||||
throw new BadRequestException("User already exists."); |
throw new BadRequestException('User already exists.') |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
async findOnlineInChannel(channel: Channel): Promise<User[]> { |
async findOnlineInChannel (channel: Channel): Promise<User[]> { |
||||
return await this.usersRepository |
return await this.usersRepository |
||||
.createQueryBuilder("user") |
.createQueryBuilder('user') |
||||
.where("user.channel = :chan", { chan: channel }) |
.where('user.channel = :chan', { chan: channel }) |
||||
.andWhere("user.status := status)", { status: "online" }) |
.andWhere('user.status := status)', { status: 'online' }) |
||||
.getMany(); |
.getMany() |
||||
} |
} |
||||
|
|
||||
async update(user: User, changes: UserDto): Promise<User | null> { |
async update (user: User, changes: UserDto): Promise<User | null> { |
||||
this.usersRepository.merge(user, changes); |
this.usersRepository.merge(user, changes) |
||||
return await this.usersRepository.save(user); |
return await this.usersRepository.save(user) |
||||
} |
} |
||||
|
|
||||
async addAvatar(ftId: number, filename: string): Promise<void> { |
async addAvatar (ftId: number, filename: string): Promise<void> { |
||||
await this.usersRepository.update({ ftId }, { avatar: filename }); |
await this.usersRepository.update({ ftId }, { avatar: filename }) |
||||
} |
} |
||||
|
|
||||
async getFriends(ftId: number): Promise<User[]> { |
async getFriends (ftId: number): Promise<User[]> { |
||||
const user = await this.usersRepository.findOne({ |
const user = await this.usersRepository.findOne({ |
||||
where: { ftId }, |
where: { ftId }, |
||||
relations: { friends: true }, |
relations: { friends: true } |
||||
}); |
}) |
||||
if (user == null) throw new BadRequestException("User not found."); |
if (user == null) throw new BadRequestException('User not found.') |
||||
return user.friends; |
return user.friends |
||||
} |
} |
||||
|
|
||||
async getInvits(ftId: number): Promise<User[]> { |
async getInvits (ftId: number): Promise<User[]> { |
||||
const user = await this.usersRepository.findOne({ |
const user = await this.usersRepository.findOne({ |
||||
where: { ftId }, |
where: { ftId }, |
||||
relations: { |
relations: { |
||||
followers: true, |
followers: true |
||||
}, |
} |
||||
}); |
}) |
||||
if (user == null) throw new BadRequestException("User not found."); |
if (user == null) throw new BadRequestException('User not found.') |
||||
return user.followers; |
return user.followers |
||||
} |
} |
||||
|
|
||||
async getResultsById(ftId: number): Promise<Result[]> { |
async getResultsById (ftId: number): Promise<Result[]> { |
||||
const user = await this.usersRepository.findOne({ |
const user = await this.usersRepository.findOne({ |
||||
where: { ftId }, |
where: { ftId }, |
||||
relations: { results: { players: true } }, |
relations: { results: { players: true } } |
||||
}); |
}) |
||||
if (user == null) throw new BadRequestException("User not found."); |
if (user == null) throw new BadRequestException('User not found.') |
||||
return user.results; |
return user.results |
||||
} |
} |
||||
|
|
||||
async getLeaderboard(): Promise<User[]> { |
async getLeaderboard (): Promise<User[]> { |
||||
let leaderboard = await this.usersRepository.find({ |
const leaderboard = await this.usersRepository.find({ |
||||
order: { |
order: { |
||||
winrate: "DESC", |
winrate: 'DESC' |
||||
}, |
} |
||||
}); |
}) |
||||
return leaderboard.filter((user) => user.rank !== 0); |
return leaderboard.filter((user) => user.rank !== 0) |
||||
} |
} |
||||
|
|
||||
async getRank(ftId: number): Promise<number> { |
async getRank (ftId: number): Promise<number> { |
||||
let leaderboard = await this.usersRepository.find({ |
const leaderboard = await this.usersRepository.find({ |
||||
order: { |
order: { |
||||
winrate: "DESC", |
winrate: 'DESC' |
||||
}, |
} |
||||
}); |
}) |
||||
return leaderboard.findIndex((user) => user.ftId === ftId); |
return leaderboard.findIndex((user) => user.ftId === ftId) |
||||
} |
} |
||||
|
|
||||
async invit(ftId: number, targetFtId: number): Promise<string> { |
async invit (ftId: number, targetFtId: number): Promise<string> { |
||||
const user: User | null = await this.usersRepository.findOne({ |
const user: User | null = await this.usersRepository.findOne({ |
||||
where: { ftId }, |
where: { ftId }, |
||||
relations: { |
relations: { |
||||
followers: true, |
followers: true, |
||||
friends: true, |
friends: true |
||||
}, |
} |
||||
}); |
}) |
||||
if (!user) throw new BadRequestException("User not found."); |
if (user === null) throw new BadRequestException('User not found.') |
||||
if (user.friends.findIndex((friend) => friend.ftId === targetFtId) !== -1) { |
if (user.friends.findIndex((friend) => friend.ftId === targetFtId) !== -1) { |
||||
return "You are already friends."; |
return 'You are already friends.' |
||||
} |
} |
||||
const target: User | null = await this.usersRepository.findOne({ |
const target: User | null = await this.usersRepository.findOne({ |
||||
where: { ftId: targetFtId }, |
where: { ftId: targetFtId }, |
||||
relations: { |
relations: { |
||||
followers: true, |
followers: true, |
||||
friends: true, |
friends: true |
||||
}, |
} |
||||
}); |
}) |
||||
if (!target) return "Target not found."; |
if (target === null) return 'Target not found.' |
||||
const id = user.followers.findIndex( |
const id = user.followers.findIndex( |
||||
(follower) => follower.ftId === targetFtId |
(follower) => follower.ftId === targetFtId |
||||
); |
) |
||||
if (target.followers.findIndex((follower) => follower.ftId === user.ftId) !== -1) { |
if (target.followers.findIndex((follower) => follower.ftId === user.ftId) !== -1) { |
||||
return "Invitation already sent."; |
return 'Invitation already sent.' |
||||
}else if (user.followers.findIndex((follower) => follower.ftId === targetFtId) !== -1) { |
} else if (user.followers.findIndex((follower) => follower.ftId === targetFtId) !== -1) { |
||||
user.friends.push(target); |
user.friends.push(target) |
||||
target.friends.push(user); |
target.friends.push(user) |
||||
user.followers.slice(id, 1); |
user.followers.slice(id, 1) |
||||
await this.usersRepository.save(user); |
await this.usersRepository.save(user) |
||||
} else |
} else { |
||||
target.followers.push(user); |
target.followers.push(user) |
||||
await this.usersRepository.save(target); |
} |
||||
return "OK" |
await this.usersRepository.save(target) |
||||
|
return 'OK' |
||||
} |
} |
||||
} |
} |
||||
|
Loading…
Reference in new issue