added the thing so you can see other people's avatars, fixed checks on frontend routes like game and such that other people created, need help understanding ValidationPipe() to make it so a user must have a unique username. TBH this shit is still being held together by Duct Tape and Holy Water

This commit is contained in:
Me
2023-01-05 22:37:56 +01:00
parent b35082148c
commit 0470676c5d
5 changed files with 102 additions and 46 deletions

View File

@@ -84,6 +84,7 @@ export class UsersController {
@UseGuards(TwoFactorGuard)
@Patch()
async update(@Req() req, @Body(new ValidationPipe()) usersUpdateDto: UpdateUsersDto, @Res() response : Response) {
console.log('user.controller updating user info')
const user = await this.usersService.update(req.user.id, usersUpdateDto);
if (user.isEnabledTwoFactorAuth === false && user.isTwoFactorAuthenticated === true)
this.usersService.setIsTwoFactorAuthenticatedWhenLogout(user.id);
@@ -103,6 +104,7 @@ export class UsersController {
return this.usersService.remove(req.user.id);
}
// POST http://transcendance:8080/user/avatar
@UseGuards(AuthenticateGuard)
@UseGuards(TwoFactorGuard)
@@ -118,15 +120,24 @@ export class UsersController {
return res.status(HttpStatus.UNSUPPORTED_MEDIA_TYPE).json({message : "Unsupported media type. Please use a valid image file."});
}
// GET http://transcendance:8080/user/avatar
// GET http://transcendance:8080/user/avatar?username=username
@UseGuards(AuthenticateGuard)
@UseGuards(TwoFactorGuard)
@Get('avatar')
getAvatar(@Req() request, @Res() response) {
const promise = this.usersService.getAvatarUrl(request.user.id).then((url) =>
async getAvatar(@Query('username') username: string, @Req() request, @Res() response) {
let usernameToFind;
if (username !== undefined) {
usernameToFind = username;
} else {
usernameToFind = request.user.username;
}
const promise = this.usersService.getAvatarUrl(usernameToFind).then((url) =>
{
if (url)
if (url) {
console.log('what is the URL: ' + url)
return of(response.sendFile(process.cwd() + '/uploads/avatars/' + url));
}
else
throw new NotFoundException('Avatar not found');
});

View File

@@ -68,13 +68,13 @@ export class UsersService {
let partialUsers : Partial<User>[] = [];
for (const otherUser of otherUsers) {
console.log('other user: ')
console.log({...otherUser})
let tmp = await this.friendshipService.findIfUserIsBlockedOrHasBlocked(currentUser.id, otherUser.id);
console.log('user.services findIF Blocked... : ')
console.log(tmp)
if (tmp === false) {
// if (await this.friendshipService.findIfUserIsBlockedOrHasBlocked(currentUser.id, otherUser.id) === false) {
// console.log('other user: ')
// console.log({...otherUser})
// let tmp = await this.friendshipService.findIfUserIsBlockedOrHasBlocked(currentUser.id, otherUser.id);
// console.log('user.services findIF Blocked... : ')
// console.log(tmp)
// if (tmp === false) {
if (await this.friendshipService.findIfUserIsBlockedOrHasBlocked(currentUser.id, otherUser.id) === false) {
partialUsers.push({username: otherUser.username, image_url: otherUser.image_url, status: otherUser.status, stats: otherUser.stats});
}
}
@@ -83,30 +83,6 @@ export class UsersService {
return partialUsers;
}
// async findAbsolutelyAll() {
// // const otherUsers = await this.userRepository.find({where: {id: Not(+currentUser.id)}, order: {username: "ASC"}, skip: offset, take: limit,});
// const otherUsers = await this.userRepository.find({order: {username: "ASC"}});
// let partialUsers : Partial<User>[] = [];
// for (const otherUser of otherUsers) {
// console.log('other user: ')
// console.log({...otherUser})
// let tmp = await this.friendshipService.findIfUserIsBlockedOrHasBlocked(currentUser.id, otherUser.id);
// console.log('user.services findIF Blocked... : ')
// console.log(tmp)
// if (tmp === false) {
// // if (await this.friendshipService.findIfUserIsBlockedOrHasBlocked(currentUser.id, otherUser.id) === false) {
// partialUsers.push({username: otherUser.username, image_url: otherUser.image_url, status: otherUser.status, stats: otherUser.stats});
// }
// }
// console.log('user.services findAll, partialUsers:')
// console.log({...partialUsers})
// return partialUsers;
// }
async create(createUserDto: CreateUsersDto) {
if (await this.userRepository.findOneBy({fortyTwoId: createUserDto.fortyTwoId}))
throw new HttpException(`The user already exists.`,HttpStatus.CONFLICT);
@@ -158,13 +134,16 @@ export class UsersService {
return this.userRepository.update(id, {image_url: avatar});
}
async getAvatarUrl(id: number) {
const user = await this.userRepository.findOneBy({id: id});
// doing search with username not id because userService.findOne doesn't return an Id anymore, just username... fuck this architecture is big trash...
// async getAvatarUrl(id: number) {
async getAvatarUrl(username: string) {
const user = await this.userRepository.findOneBy({username: username});
if (!user)
throw new HttpException(`The user could not be found.`,HttpStatus.NOT_FOUND);
// console.log('user.service getAvatarUrl of ' + user.username)
if (!user.image_url)
throw new HttpException(`The user has no avatar.`,HttpStatus.NOT_FOUND);
console.log(user.image_url);
// console.log('User.service Avatar URL ' + user.image_url);
return user.image_url;
}

View File

@@ -39,7 +39,7 @@
{#if user !== undefined}
<GenerateUserDisplay user={user} primary={true}/>
<GenerateUserDisplay user={user} primary={false}/>
<!-- <GenerateUserDisplay user={user} primary={true}/> -->
{:else}
<h2>Sorry</h2>

View File

@@ -4,20 +4,39 @@
export let user;
export let primary;
export let primary; // kinda useless, not sure what i was going for... Might be userful after all
let rank = '';
let avatar;
// avatar needs to be updated!!!
console.log('Generate User Display, BEFORE on mount ' + avatar)
onMount( async() => {
console.log('Generate User Display, on mount ' + user.username)
// using this for now cuz for some reason there is yet to be a way to fet another person's avatar
if (primary) {
// await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user/avatar?username=${user.username}`, {method: "GET"})
// .then(response => {return response.blob()})
// .then(data => {
// const url = URL.createObjectURL(data);
// avatar = url;
// });
await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user/avatar`, {method: "GET"})
.then(response => {return response.blob()})
.then(data => {
const url = URL.createObjectURL(data);
avatar = url;
});
})
.catch(() => errors.avatar = 'Sorry your avatar could not be loaded' );
console.log('avatar: ')
console.log(avatar)
} else {
await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user/avatar?username=${user.username}`, {method: "GET"})
.then(response => {return response.blob()})
.then(data => {
const url = URL.createObjectURL(data);
avatar = url;
})
.catch(() => errors.avatar = 'Sorry your avatar could not be loaded' );
}
})

View File

@@ -13,9 +13,57 @@ import GameSpectator from '../pages/game/GameSpectator.svelte';
export const primaryRoutes = {
'/': SplashPage,
'/2fa': TwoFactorAuthentication,
'/game': Game,
'/spectator': GameSpectator,
'/ranking' : Ranking,
'/game': wrap({
component: Game,
conditions: [
async(detail) => {
const user = await fetch('http://' + process.env.WEBSITE_HOST + ":" + process.env.WEBSITE_PORT + '/api/v2/user')
.then((resp) => resp.json())
console.log('in /profile what is in user')
console.log(user)
if (user && user.username)
return true;
else
return false;
}
]
}),
'/spectator': wrap({
component: GameSpectator,
conditions: [
async(detail) => {
const user = await fetch('http://' + process.env.WEBSITE_HOST + ":" + process.env.WEBSITE_PORT + '/api/v2/user')
.then((resp) => resp.json())
console.log('in /profile what is in user')
console.log(user)
if (user && user.username)
return true;
else
return false;
}
]
}),
'/ranking': wrap({
component: Ranking,
conditions: [
async(detail) => {
const user = await fetch('http://' + process.env.WEBSITE_HOST + ":" + process.env.WEBSITE_PORT + '/api/v2/user')
.then((resp) => resp.json())
console.log('in /profile what is in user')
console.log(user)
if (user && user.username)
return true;
else
return false;
}
]
}),
'/profile': wrap({
component: ProfilePage,
conditions: [
@@ -50,7 +98,6 @@ export const primaryRoutes = {
}
]
}),
'/unauthorized-access': UnauthorizedAccessPage,
'*': NotFound
};