From 7df9c61763bfd150545858c809b3e0e5fc161be2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20L=C3=A1szl=C3=B3?= Date: Fri, 10 May 2024 00:46:02 +0200 Subject: [PATCH] fix getPosts --- src/app/services/data/post.service.ts | 87 +++++++++++---------- src/app/services/data/user.service.ts | 2 +- src/app/shared/views/post/post.component.ts | 8 +- src/app/user/user.component.ts | 11 +-- 4 files changed, 52 insertions(+), 56 deletions(-) diff --git a/src/app/services/data/post.service.ts b/src/app/services/data/post.service.ts index a5de58c..28a2f7d 100644 --- a/src/app/services/data/post.service.ts +++ b/src/app/services/data/post.service.ts @@ -4,6 +4,7 @@ import { AuthService } from '../auth/auth.service'; import { AngularFirestore, Reference } from '@angular/fire/compat/firestore'; import { User } from '../../../model/User'; import { UserService } from './user.service'; +import { firstValueFrom } from 'rxjs'; import { DocumentReference } from '@angular/fire/firestore'; @Injectable({ @@ -53,50 +54,50 @@ export class PostService { }); } - getPosts(username: String, lenght: Number, start: Number) { - return new Promise>((resolve, reject) => { - if (this.auth.checkAllowed()) { - if (username == undefined) { - this.auth.getUser().subscribe(cred => { - // get the user by id - this.afs.collection('user', ref => ref.where('id', '==', cred?.uid)).valueChanges().subscribe(user => { - // get their posts - this.afs.collection('post', ref => ref.where('user', '==', this.afs.doc('/user/' + user[0].username).ref)).valueChanges({ idField: 'id' }).subscribe(posts => { - posts.forEach(post => { - // get how many likes it has - this.afs.collection('like', ref => ref.where('post', '==', this.afs.doc('/post/' + post.id).ref)).valueChanges().subscribe(likes => { - // check if we liked this post - post.liked = likes.filter(like => (like as any).user.id == user[0].username).length != 0; - post.user = user[0] as User; - post.likes = likes.length; - }) - resolve(posts) - }) - }); - }) - }); - } else { - this.usersvc.getCurrentUser() - .then(currentUser => { - // get the user by username - this.afs.collection('user').doc(username as string).valueChanges().subscribe(user => { - // get their posts - this.afs.collection('post', ref => ref.where('user', '==', this.afs.doc('/user/' + username).ref)).valueChanges({ idField: 'id' }).subscribe(posts => { - posts.forEach(post => { - // get how many likes it has - this.afs.collection('like', ref => ref.where('post', '==', this.afs.doc('/post/' + post.id).ref)).valueChanges().subscribe(likes => { - post.liked = likes.filter(like => (like as any).user.id == currentUser.username).length != 0; - post.user = user as User; - post.likes = likes.length; - }) - resolve(posts) - }) - }); - }); - }) - } - } else { + getPosts(username: String | undefined): Promise> { + return new Promise>(async (resolve, reject) => { + + if (!this.auth.checkAllowed()) reject() + + let result: Array = new Array; + + if (username == undefined) { + // /user -> currentUser + let user = await this.usersvc.getCurrentUser(); + let userRef = this.afs.doc('/user/' + user.username).ref; + let posts = (await firstValueFrom(this.afs.collection('post', ref => ref.where('user', '==', userRef)).valueChanges())); + posts.forEach(async (post) => { + let likes = await firstValueFrom(this.afs.collection('like', ref => ref.where('post', '==', this.afs.doc('/post/' + post.id).ref)).valueChanges()); + result.push({ + user: user, + content: post.content, + image: post.image, + likes: likes.length, + liked: likes.filter(like => (like as any).user.id == user.username).length != 0, + id: post.id + }) + + }) + resolve(result); + } else { + // /user/name + let user = await this.usersvc.getUser(username); + let userRef = this.afs.doc('/user/' + user.username).ref; + let currentUser = await this.usersvc.getCurrentUser(); + let posts = (await firstValueFrom(this.afs.collection('post', ref => ref.where('user', '==', userRef)).valueChanges())); + posts.forEach(async (post) => { + let likes = await firstValueFrom(this.afs.collection('like', ref => ref.where('post', '==', this.afs.doc('/post/' + post.id).ref)).valueChanges()); + result.push({ + user: user, + content: post.content, + image: post.image, + likes: likes.length, + liked: likes.filter(like => (like as any).user.id == currentUser.username).length != 0, + id: post.id + }) + }) + resolve(result); } }); } diff --git a/src/app/services/data/user.service.ts b/src/app/services/data/user.service.ts index 0237745..3c472fc 100644 --- a/src/app/services/data/user.service.ts +++ b/src/app/services/data/user.service.ts @@ -13,7 +13,7 @@ export class UserService { return new Promise((resolve, reject) => { if (this.auth.checkAllowed()) { if (username != undefined) { - this.afs.collection('user', ref => ref.where('username', '==', username)).valueChanges().subscribe(data => { resolve(data[0] as User) }); + this.afs.collection('user').doc(username as string).valueChanges().subscribe(data => { resolve(data as User) }); } else { this.auth.getUser().subscribe(cred => { this.afs.collection('user', ref => ref.where('id', '==', cred?.uid)).valueChanges().subscribe(user => { resolve(user[0]) }) diff --git a/src/app/shared/views/post/post.component.ts b/src/app/shared/views/post/post.component.ts index fdd1ce0..2499464 100644 --- a/src/app/shared/views/post/post.component.ts +++ b/src/app/shared/views/post/post.component.ts @@ -3,8 +3,8 @@ import { CommonModule } from '@angular/common'; import { SmallUserComponent } from '../small-user/small-user.component'; import { Post } from '../../../../model/Post'; import { NgIf } from '@angular/common'; -import { AuthService } from '../../../services/auth/auth.service'; import { PostService } from '../../../services/data/post.service'; +import { UserService } from '../../../services/data/user.service'; @Component({ selector: 'app-post', @@ -19,11 +19,11 @@ export class PostComponent implements OnInit { isOwned: boolean = false; deleted: boolean = false; - constructor(private auth: AuthService, private postSv: PostService) { } + constructor(private userSv: UserService, private postSv: PostService) { } ngOnInit(): void { - this.auth.getUser().subscribe(user => { - this.isOwned = user?.email == this.post?.user.email; + this.userSv.getCurrentUser().then(user => { + this.isOwned = user?.username == this.post?.user.username; }); } diff --git a/src/app/user/user.component.ts b/src/app/user/user.component.ts index f542a63..f26aff8 100644 --- a/src/app/user/user.component.ts +++ b/src/app/user/user.component.ts @@ -16,13 +16,8 @@ export class UserComponent implements OnInit{ constructor(private postService: PostService, private userService: UserService, private route: ActivatedRoute) { } - ngOnInit(): void { - this.userService.getUser(this.route.snapshot.params['username']) - .then(user => { this.user = user }) - .catch(() => alert('failed to get user')); - - this.postService.getPosts(this.route.snapshot.params['username'], 10, 0) - .then(posts => { this.posts = posts; }) - .catch(()=> { alert('failed to fetch feed'); }); + async ngOnInit(): Promise { + this.user = await this.userService.getUser(this.route.snapshot.params['username']); + this.posts = await this.postService.getPosts(this.route.snapshot.params['username']); } }