diff --git a/srcs/requirements/nestjs/api_back/src/friendship/dto/create-friendship.dto.ts b/srcs/requirements/nestjs/api_back/src/friendship/dto/create-friendship.dto.ts index 2f4128fa..a5a0dd4c 100644 --- a/srcs/requirements/nestjs/api_back/src/friendship/dto/create-friendship.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/friendship/dto/create-friendship.dto.ts @@ -1,10 +1,7 @@ -import { IsEnum, IsNotEmpty, IsString, IsPositive } from 'class-validator'; +import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; import { FriendshipStatus } from '../entities/friendship.entity'; export class CreateFriendshipDto { - // @IsPositive() - // @Max(1000) ? - // readonly receiverId: number; @IsNotEmpty() @IsString() readonly receiverUsername: string; diff --git a/srcs/requirements/nestjs/api_back/src/friendship/entities/friendship.entity.ts b/srcs/requirements/nestjs/api_back/src/friendship/entities/friendship.entity.ts index 29538e0a..4d25f813 100644 --- a/srcs/requirements/nestjs/api_back/src/friendship/entities/friendship.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/friendship/entities/friendship.entity.ts @@ -20,23 +20,9 @@ export class Friendship { @ManyToOne(type => User, user => user.username) sender: User; - // hold on do i want this instead? - // @ManyToOne(type => User, user => user.id) @ManyToOne(type => User, user => user.username) receiver: User; - // ok so the username is still here because i think it might be useful for the frontend to have access to it, but really all i need is the ID's - // since i have the ID's do i even need the User ? - // @Column() - // senderUsername : string; - // @Column() - // senderId : number; - - // @Column() - // receiverUsername : string; - // @Column() - // receiverId : number; - @Column({ type: 'enum', enum: FriendshipStatus, default: FriendshipStatus.REQUESTED}) status: FriendshipStatus; } diff --git a/srcs/requirements/nestjs/api_back/src/friendship/friendship.controller.ts b/srcs/requirements/nestjs/api_back/src/friendship/friendship.controller.ts index da0f656e..5500c0f6 100644 --- a/srcs/requirements/nestjs/api_back/src/friendship/friendship.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/friendship/friendship.controller.ts @@ -8,18 +8,7 @@ import { FriendshipService } from './friendship.service'; export class FriendshipController { constructor(private readonly friendshipService: FriendshipService) { } - // GET http://transcendance:8080/api/v2/network/myfriends - // @Get('myfriends') - // @UseGuards(AuthenticateGuard) - // @UseGuards(TwoFactorGuard) - // findEmpty(@Req() req) { - // const user = req.user; - // console.log('GET myfriends') - // return this.friendshipService.findAllFriends(user.id); - // } - -// @Query('username') username: string, - + // new and improved finder of people // GET http://transcendance:8080/api/v2/network/myfriends @Get('myfriends') @@ -32,23 +21,10 @@ export class FriendshipController { console.log('my friend: ' + otherUsername) return this.friendshipService.findOneRelationshipByUsername(otherUsername, user.username); } - // might change this - return this.friendshipService.findAllFriends(user.id); - // return this.friendshipService.findOneRelationshipByUsername(friendUsername, user.username); + return this.friendshipService.findAllFriendships(user.id); + // return this.friendshipService.findAllFriends(user.id); } - - // GET http://transcendance:8080/api/v2/network/:friendUsername - // @Get('myfriends/:friendUsername') - // @UseGuards(AuthenticateGuard) - // @UseGuards(TwoFactorGuard) - // findOneRelationByUsername(@Param('friendUsername') friendUsername : string, @Req() req) { - // console.log('GET myfriend') - // console.log(friendUsername); - // const user = req.user; - // return this.friendshipService.findOneRelationshipByUsername(friendUsername, user.username); - // } - // POST http://transcendance:8080/api/v2/network/relations @Post('relations') @HttpCode(HttpStatus.CREATED) diff --git a/srcs/requirements/nestjs/api_back/src/friendship/friendship.service.ts b/srcs/requirements/nestjs/api_back/src/friendship/friendship.service.ts index 7bd4ed08..2a4395eb 100644 --- a/srcs/requirements/nestjs/api_back/src/friendship/friendship.service.ts +++ b/srcs/requirements/nestjs/api_back/src/friendship/friendship.service.ts @@ -1,6 +1,7 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { User } from 'src/users/entities/user.entity'; +import { SendableUser } from 'src/users/sendableUsers'; import { Repository, Brackets } from 'typeorm'; import { CreateFriendshipDto } from './dto/create-friendship.dto'; import { Friendship, FriendshipStatus } from './entities/friendship.entity'; @@ -30,6 +31,7 @@ export class FriendshipService { // return ret; // }; + //kinda useless but someone else might use it async findOneRelationshipById(friendId : number, userId : number) { const friendship = await this.friendshipRepository .createQueryBuilder('friendship') @@ -45,16 +47,16 @@ export class FriendshipService { ) .orWhere( new Brackets((subBQb) => { - subBQb.where('sender.id = :friendId', {friendId : friendId}) - .andWhere('receiver.id = :userId', {userId : userId}) + subBQb.where('sender.id = :friendId2', {friendId2 : friendId}) + .andWhere('receiver.id = :userId2', {userId2 : userId}) }) ) }), ) - .andWhere('friendship.status != :status', {status : FriendshipStatus.BLOCKED}) + // .andWhere('friendship.status != :status', {status : FriendshipStatus.BLOCKED}) .getOne() - console.log('END Find one friend by username: ') + console.log('END Find one friend by ID: ') console.log({...friendship}) if (!friendship) { @@ -65,7 +67,6 @@ export class FriendshipService { return new SendableFriendship(friendship); } - // basically useless now async findOneRelationshipByUsername(friendUsername : string, username : string) { // This seems to work, finding friendships by username but checking the actual users not the friendship const friendship = await this.friendshipRepository @@ -82,13 +83,13 @@ export class FriendshipService { ) .orWhere( new Brackets((subBQb) => { - subBQb.where('sender.username = :friendUsername', {friendUsername : friendUsername}) - .andWhere('receiver.username = :username', {username : username}) + subBQb.where('sender.username = :friendUsername2', {friendUsername2 : friendUsername}) + .andWhere('receiver.username = :username2', {username2 : username}) }) ) }), ) - .andWhere('friendship.status != :status', {status : FriendshipStatus.BLOCKED}) + // .andWhere('friendship.status != :status', {status : FriendshipStatus.BLOCKED}) .getOne() console.log('END Find one friend by username: ') @@ -101,8 +102,9 @@ export class FriendshipService { return new SendableFriendship(friendship); } - // lets see what happens here, doing directly receiver.id not LeftJoinAndSelect ... - async findAllFriends(userId: number) { + // maybe i should be returning a list of users not a list of friendships + // async findAllFriends(userId: number) { + async findAllFriendships(userId: number) { const friendships = await this.friendshipRepository .createQueryBuilder('friendship') .leftJoinAndSelect('friendship.sender', 'sender') @@ -115,13 +117,28 @@ export class FriendshipService { // for (const friend of friendship) // console.log("FRIENDSHIP : " + friend.status); // return friendship; - // return new SendableFriendship(friendship); - let sendFrienships: SendableFriendship[] = [] + let sendFrienships: SendableFriendship[] = []; for (const friendship of friendships) { sendFrienships.push(new SendableFriendship(friendship)); } // return new SendableFriendship(friendship); + console.log('friendship.service my friends:') + console.log({...sendFrienships}) return sendFrienships; + + // let sendFriends: SendableUser[] = []; + // for (const friendship of friendships) { + // let user: User; + // if (friendship.sender.id !== userId) + // user = friendship.sender; + // else + // user = friendship.receiver; + // sendFriends.push(new SendableUser(user)); + // } + // console.log('friendship.service my friends as Users:') + // console.log({...sendFriends}) + // return sendFriends; + } async findOneBlocked(friendshipId: number, userId: number) { @@ -153,7 +170,6 @@ export class FriendshipService { if (!friendship) { throw new HttpException(`The requested blocked not found.`, HttpStatus.NOT_FOUND); } - // return friendship; return new SendableFriendship(friendship); } @@ -191,16 +207,10 @@ export class FriendshipService { .where('sender.id = :requestee', { requestee: userId }) .andWhere('friendship.status = :status', { status: FriendshipStatus.REQUESTED }) .getMany(); - // let partialFriendship : Partial[] = []; - // for (const friend of friendships) { - // console.log("FRIENDSHIP : " + friend); - // partialFriendship.push({id: friend.id, senderUsername: friend.senderUsername, receiverUsername: friend.receiverUsername, status: friend.status}); - // } - // console.log("Pendant requests : " + partialFriendship); - // return partialFriendship; + console.log('friendships services pendant friendships:') console.log({...friendships}) - // return friendships; + let sendFrienships: SendableFriendship[] = [] for (const friendship of friendships) { sendFrienships.push(new SendableFriendship(friendship)); @@ -216,14 +226,10 @@ export class FriendshipService { .where('receiver.id = :addressee', { addressee: userId }) .andWhere('friendship.status = :status', { status: FriendshipStatus.REQUESTED }) .getMany(); - // let partialFriendship : Partial[] = []; - // for (const friend of friendship) { - // partialFriendship.push({id: friend.id, senderUsername: friend.senderUsername, receiverUsername: friend.receiverUsername, status: friend.status}); - // } - // return partialFriendship; + console.log('friendship service received requests') console.log({...friendships}) - // return friendships; + let sendFrienships: SendableFriendship[] = [] for (const friendship of friendships) { sendFrienships.push(new SendableFriendship(friendship)); @@ -239,8 +245,8 @@ export class FriendshipService { // These throws don't seem to work... const receiver = await this.userRepository.findOneBy({username: createFriendshipDto.receiverUsername}); - console.log('receiver: ') - console.log({...receiver}) + // console.log('receiver: ') + // console.log({...receiver}) if (!receiver) throw new HttpException(`The addressee does not exist.`, HttpStatus.NOT_FOUND); if (createFriendshipDto.status !== FriendshipStatus.REQUESTED && createFriendshipDto.status !== FriendshipStatus.BLOCKED) @@ -291,10 +297,10 @@ export class FriendshipService { // } // console.log('friendship.service create friendship, partial friendship') // console.log({...partialFriendship}) - console.log('friendship.service create friendship, NEW friendship') - console.log({...newFriendship}) - console.log('friendship.service create friendship, SAVED friendship') - console.log({...savedFriendship}) + // console.log('friendship.service create friendship, NEW friendship') + // console.log({...newFriendship}) + // console.log('friendship.service create friendship, SAVED friendship') + // console.log({...savedFriendship}) // return partialFriendship; return new SendableFriendship(savedFriendship); } @@ -347,15 +353,6 @@ export class FriendshipService { } relation.status = FriendshipStatus.DECLINED; const savedFriendship = await this.friendshipRepository.save(relation); - // const partialFriendship : Partial = { - // id : (await savedFriendship).id, - // date : (await savedFriendship).date, - // receiverUsername: (await savedFriendship).receiverUsername, - // status : (await savedFriendship).status - // } - // console.log('decline friend request') - // console.log({...partialFriendship}) - // return partialFriendship return new SendableFriendship(savedFriendship); } @@ -403,8 +400,6 @@ export class FriendshipService { } async removeFriendship(relationshipId: number, user : User) { - // const friendship = await this.friendshipRepository.findOneBy({ id: +relationshipId }); - // once again we need find() not findOneBy() so once again have to grab first elem of an array const friendship = await this.friendshipRepository .createQueryBuilder('friendship') .leftJoinAndSelect('friendship.sender', 'sender') @@ -422,12 +417,10 @@ export class FriendshipService { } console.log('.service deleted a friendship') return this.friendshipRepository.remove(friendship); + // what is the return here? am i getting something right? } - - //i think maybe i should be using ID rather than username... - - // async findIfUserIsBlockedOrHasBlocked(userConnectedUsername: string, userToFindUsername: string) { + // ok for some reason this isn't working... async findIfUserIsBlockedOrHasBlocked(userConnectedId: number, userToFindId: number) { console.log("finding if user is blocked") console.log('user connected: ' + userConnectedId) @@ -447,8 +440,8 @@ export class FriendshipService { ) .orWhere( new Brackets((subBQb) => { - subBQb.where('sender.id = :senderId', {senderId : userToFindId}) - .andWhere('receiver.id = :receiverId', {receiverUsername : userConnectedId}) + subBQb.where('sender.id = :senderId2', {senderId2 : userToFindId}) + .andWhere('receiver.id = :receiverId2', {receiverId2 : userConnectedId}) }) ) }), @@ -457,9 +450,8 @@ export class FriendshipService { .getOne() - - // console.log('printing friendship queried') - // console.log({...friendship}) + console.log('printing friendship queried') + console.log({...friendship}) if (friendship) { console.log('we are blocked in friendship.service') return true; diff --git a/srcs/requirements/nestjs/api_back/src/friendship/sendableFriendship.ts b/srcs/requirements/nestjs/api_back/src/friendship/sendableFriendship.ts index d2c3be30..64e0736c 100644 --- a/srcs/requirements/nestjs/api_back/src/friendship/sendableFriendship.ts +++ b/srcs/requirements/nestjs/api_back/src/friendship/sendableFriendship.ts @@ -10,9 +10,7 @@ export class SendableFriendship { id: number; date: Date; senderUsername: string; - // senderId: number; receiverUsername: string; - // receiverId: number; status: FriendshipStatus; // if my constructor is here won't it get sent all over the place too? @@ -20,9 +18,7 @@ export class SendableFriendship { this.id = friendship.id; this.date = friendship.date this.senderUsername = friendship.sender.username; - // this.senderId = friendship.sender.id; this.receiverUsername = friendship.receiver.username; - // this.receiverId = friendship.receiver.id; this.status = friendship.status; }; } \ No newline at end of file diff --git a/srcs/requirements/nestjs/api_back/src/users/sendableUsers.ts b/srcs/requirements/nestjs/api_back/src/users/sendableUsers.ts new file mode 100644 index 00000000..fca212bb --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/users/sendableUsers.ts @@ -0,0 +1,18 @@ + +import { User } from "./entities/user.entity"; +import { UserStats } from "./entities/userStat.entities"; + +export class SendableUser { + username: string; + image_url : string; + status: string; + stats: UserStats; + + // if my constructor is here won't it get sent all over the place too? + constructor(user: User) { + this.username = user.username; + this.image_url = user.image_url; + this.status = user.status; + this.stats = user.stats; + }; +} \ No newline at end of file diff --git a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts index 5739b49b..19682e8d 100644 --- a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts @@ -24,11 +24,7 @@ export class UsersController { @UseGuards(TwoFactorGuard) @Get('all') findAll(@Req() req) { - // findAll(@Query() paginationquery : PaginationQueryDto, @Req() req) { - //const { limit, offset } = query; - // not convinced i want pagination... i mean maybe for loading and such, we shall see const user : User = req.user; - // return this.usersService.findAll(paginationquery, user); return this.usersService.findAll(user); } @@ -71,7 +67,6 @@ export class UsersController { return this.usersService.findOne(req.user.username); else return this.usersService.findOne(usernameToFind); - // i would rather just use numbers but i'm guessing Cherif uses this all over } // also seems useless... diff --git a/srcs/requirements/nestjs/api_back/src/users/users.service.ts b/srcs/requirements/nestjs/api_back/src/users/users.service.ts index 0fe72cc6..68b75721 100644 --- a/srcs/requirements/nestjs/api_back/src/users/users.service.ts +++ b/srcs/requirements/nestjs/api_back/src/users/users.service.ts @@ -64,49 +64,21 @@ export class UsersService { return true; } - // ok yea this shit makes no fucking sense any more since we're always gonna have the id, this is meant to return someone by username, fuck that - // async findOneById(userId : number, toFindId: number) { - // const userToFind : User = await this.userRepository.createQueryBuilder('user') - // .leftJoinAndSelect('user.stats', 'stats') - // .where('user.id = :toFindId', { toFindId: toFindId }) - // .getOne(); - // console.log('USERNAME OF FOUND USER : ' + userToFind.username); - // // console.log({...user}) - // // you can't do that, you need to do user === undefined - // // if (user === undefined) - // if (!userToFind) - // throw new HttpException(`The user could not be found 1.`,HttpStatus.NOT_FOUND); - // if (await this.friendshipService.findIfUserIsBlockedOrHasBlocked(userConnectedId, userToFind.id)) { - // console.log('we are blocked in user.service') - // throw new HttpException(`The user could not be found 2.`,HttpStatus.NOT_FOUND); - // } - // const partialUser : Partial = { - // username: userToFind.username, - // image_url: userToFind.image_url, - // status: userToFind.status, - // stats: userToFind.stats, - // }; - // return partialUser; - // } - - // fuck pagination Query - // async findAll(paginationquery : PaginationQueryDto, currentUser: User) { async findAll(currentUser: User) { - // const { limit, offset } = paginationquery; // const otherUsers = await this.userRepository.find({where: {id: Not(+currentUser.id)}, order: {username: "ASC"}, skip: offset, take: limit,}); const otherUsers = await this.userRepository.find({where: {id: Not(+currentUser.id)}, order: {username: "ASC"}}); let partialUsers : Partial[] = []; for (const otherUser of otherUsers) { - // console.log('other user: ') - // console.log({...otherUser}) - // let tmp = await this.friendshipService.findIfUserIsBlockedOrHasBlocked(user.username, otherUser.username); - // console.log('user.services findIF Blocked... : ') - // console.log(tmp) - // if (tmp === false) { - if (await this.friendshipService.findIfUserIsBlockedOrHasBlocked(currentUser.id, otherUser.id) === false) { - partialUsers.push({id: otherUser.id, username: otherUser.username, image_url: otherUser.image_url, status: otherUser.status, stats: otherUser.stats}); + 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:') diff --git a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte index 610a1d97..7f10bbe3 100644 --- a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte @@ -11,7 +11,7 @@ let user; let allUsers; - let myFriends; + let myFriendships; let requestsMade, requestsRecieved; let blockedUsers; let usernameBeingViewed; @@ -45,7 +45,7 @@ const fetchAll = async() => { // no need to await i think it can load in the background fetchAllUsers(); - fetchMyFriends(); + fetchMyFriendships(); fetchRequestsMade(); fetchRequestsReceived(); fetchBlockedUsers(); @@ -59,11 +59,13 @@ console.log({...allUsers}) }; - const fetchMyFriends = async() => { - myFriends = await fetch('http://transcendance:8080/api/v2/network/myfriends') + // it's more like fetch friendships + // then i need to extract the users + const fetchMyFriendships = async() => { + myFriendships = await fetch('http://transcendance:8080/api/v2/network/myfriends') .then( x => x.json() ); console.log('got my friends ') - console.log({...myFriends}) + console.log({...myFriendships}) }; const fetchRequestsMade = async() => { @@ -127,12 +129,11 @@ console.log('Friendship Status Full') console.log({...friendshipStatusFull}) - }; const acceptFriendRequest = async(relationshipId) => { console.log('accept friend request') - // PATCH http://transcendance:8080/api/v2/network/myfriends/:relationshipId/accept + const resp = await fetch(`http://transcendance:8080/api/v2/network/relations/${relationshipId}/accept`, { method: "PATCH"}) .then( x => x.json()); @@ -147,7 +148,6 @@ const declineFriendRequest = async(relationshipId) => { console.log('decline friend request') - // PATCH http://transcendance:8080/api/v2/network/myfriends/:relationshipId/decline const resp = await fetch(`http://transcendance:8080/api/v2/network/relations/${relationshipId}/decline`, { method: "PATCH"}) .then( x => x.json()); @@ -173,16 +173,15 @@ activeTabItem = activeTabItem; }; - const blockANonFriendUser = async(aUser) => { + const blockANonFriendUser = async(aUsername) => { console.log('Block a non friend user, their username') - console.log({...aUser}) + console.log(aUsername) const blockResp = await fetch("http://transcendance:8080/api/v2/network/relations", { method : "POST", headers: { 'Content-Type': 'application/json'}, body: JSON.stringify({ - "receiverUsername": aUser.username, - "receiverId": aUser.username, + "receiverUsername": aUsername, "status": "B" }) }) @@ -222,7 +221,7 @@ if (activeTabItem === 'All Users') { await fetchAllUsers(); } else if (activeTabItem === 'My Friends') { - await fetchMyFriends(); + await fetchMyFriendships(); } else if (activeTabItem === 'Friend Requests') { await fetchRequestsReceived(); } else if (activeTabItem === 'Blocked Users') { @@ -265,15 +264,18 @@
{/each} - {:else if activeTabItem === 'My Friends' && myFriends !== undefined} + {:else if activeTabItem === 'My Friends' && myFriendships !== undefined}

{activeTabItem}

- {#if Object.keys(myFriends).length === 0} + {#if Object.keys(myFriendships).length === 0}
You don't have any Friends... Yet!
{/if} - {#each myFriends as aUser} - - + {#each myFriendships as aFriendship} + {#if aFriendship.senderUsername !== user.username} + + {:else if aFriendship.receiverUsername !== user.username} + + {/if}
{/each} {:else if activeTabItem === 'Friend Requests' && requestsRecieved !== undefined} @@ -340,7 +342,7 @@ {/if} - + {:else}
diff --git a/srcs/requirements/svelte/api_front/src/pieces/DisplayAUser.svelte b/srcs/requirements/svelte/api_front/src/pieces/DisplayAUser.svelte index 7fa528af..39c53c8c 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/DisplayAUser.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/DisplayAUser.svelte @@ -11,7 +11,7 @@ // console.log('Display aUser username: '+ aUsername) // http://transcendance:8080/api/v2/user?username=NomDuUserATrouver // user = await fetch(`http://transcendance:8080/api/v2/user?username=${aUsername}`) - user = await fetch(`http://transcendance:8080/api/v2/user?id=${aUsername}`) + user = await fetch(`http://transcendance:8080/api/v2/user?username=${aUsername}`) .then( (x) => x.json() ); // console.log('Display a user: ') @@ -32,7 +32,7 @@ // console.log('Display Update aUser username: '+ aUsername) // http://transcendance:8080/api/v2/user?username=NomDuUserATrouver // user = await fetch(`http://transcendance:8080/api/v2/user?username=${aUsername}`) - user = await fetch(`http://transcendance:8080/api/v2/user?id=${aUsername}`) + user = await fetch(`http://transcendance:8080/api/v2/user?username=${aUsername}`) .then( (x) => x.json() ); };