You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.0 KiB
105 lines
3.0 KiB
import { Injectable, NotFoundException } from '@nestjs/common'
|
|
import { InjectRepository } from '@nestjs/typeorm'
|
|
import { Repository } from 'typeorm'
|
|
import { User } from './entity/user.entity'
|
|
import { type UserDto } from './dto/user.dto'
|
|
import { type Channel } from 'src/chat/entity/channel.entity'
|
|
|
|
@Injectable()
|
|
export class UsersService {
|
|
constructor (
|
|
@InjectRepository(User) private readonly usersRepository: Repository<User>
|
|
) {}
|
|
|
|
async findUsers (): Promise<User[]> {
|
|
return await this.usersRepository.find({})
|
|
}
|
|
|
|
async findUserByName (username: string): Promise<User | null> {
|
|
return await this.usersRepository.findOneBy({ username })
|
|
}
|
|
|
|
async findUser (ftId: number): Promise<User | null> {
|
|
return await this.usersRepository.findOneBy({ ftId })
|
|
}
|
|
|
|
async findOnlineUsers (): Promise<User[]> {
|
|
return await this.usersRepository.find({ where: { status: 'online' } })
|
|
}
|
|
|
|
async create (userData: UserDto) {
|
|
try {
|
|
const newUser = this.usersRepository.create(userData)
|
|
return await this.usersRepository.save(newUser)
|
|
} catch (err) {
|
|
throw new Error(`Error creating ${err} user ${err.message}`)
|
|
}
|
|
}
|
|
|
|
async findOnlineInChannel (channel: Channel): Promise<User[]> {
|
|
return await this.usersRepository
|
|
.createQueryBuilder('user')
|
|
.where('user.channel = :chan', { chan: channel })
|
|
.andWhere('user.status := status)', { status: 'online' })
|
|
.getMany()
|
|
}
|
|
|
|
async update (user: User, changes: UserDto):Promise < User | null> {
|
|
this.usersRepository.merge(user, changes)
|
|
return await this.usersRepository.save(user)
|
|
}
|
|
|
|
async addAvatar (ftId: number, filename: string) {
|
|
return await this.usersRepository.update({ftId}, {
|
|
avatar: filename
|
|
})
|
|
}
|
|
|
|
async getFriends (ftId: number): Promise< User[] >{
|
|
const user = await this.usersRepository.findOne({
|
|
where: { ftId },
|
|
relations: {
|
|
friends: true
|
|
}
|
|
})
|
|
if (!user) return []
|
|
return user.friends
|
|
}
|
|
|
|
async getInvits (ftId: number) {
|
|
const user = await this.usersRepository.findOne({
|
|
where: { ftId },
|
|
relations: {
|
|
followers: true
|
|
}
|
|
})
|
|
if (!user) return null
|
|
return user.followers
|
|
}
|
|
|
|
async invit (ftId: number, targetFtId: number) {
|
|
const user = await this.findUser(ftId)
|
|
if (!user) return null
|
|
const target = await this.findUser(targetFtId)
|
|
if (target == null) {
|
|
return new NotFoundException(
|
|
`Error: user id ${targetFtId} isn't in our db.`
|
|
)
|
|
} const id = user.followers.findIndex(
|
|
(follower) => follower.ftId === targetFtId
|
|
)
|
|
if (id != -1) {
|
|
console.log(
|
|
`Friend relation complete between ${user.username} and ${target.username}`
|
|
)
|
|
user.friends.push(target)
|
|
target.friends.push(user)
|
|
user.followers.slice(id, 1)
|
|
this.usersRepository.save(user)
|
|
} else {
|
|
console.log(`You asked ${target.username} to be your friend.`)
|
|
target.followers.push(user)
|
|
}
|
|
this.usersRepository.save(target)
|
|
}
|
|
}
|
|
|