From a67e4a43e475c1958985b817ec11536013b66ecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20L=C3=A1szl=C3=B3?= Date: Fri, 10 May 2024 01:22:53 +0200 Subject: [PATCH] rewrite postervice with await --- src/app/services/data/post.service.ts | 146 +++++++++++--------------- 1 file changed, 61 insertions(+), 85 deletions(-) diff --git a/src/app/services/data/post.service.ts b/src/app/services/data/post.service.ts index 28a2f7d..408bcea 100644 --- a/src/app/services/data/post.service.ts +++ b/src/app/services/data/post.service.ts @@ -5,7 +5,6 @@ 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({ providedIn: 'root' @@ -14,44 +13,30 @@ export class PostService { constructor(private auth: AuthService, private afs: AngularFirestore, private usersvc: UserService) { } getFeed(length: Number, start: Number): Promise> { - return new Promise>((resolve, reject) => { - let result = Array(); + return new Promise>(async (resolve, reject) => { + if (!this.auth.checkAllowed()) + reject(); - if (this.auth.checkAllowed()) { - this.usersvc.getCurrentUser() - .then(currentUser => { - // get posts - this.afs.collection('post').valueChanges({ idField: 'id' }).subscribe(posts => { - posts.forEach(post => { - // get the user who made this post - this.afs.doc((post as any).user).valueChanges().subscribe(user => { - // 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 - let liked: boolean = likes.filter(like => (like as any).user.id == currentUser.username).length != 0; - result.push({ - user: { - username: (user as User).username, - email: (user as User).email, - picture: (user as User).picture, - followed: (user as User).followed - }, - content: post.content, - image: post.image, - likes: likes.length, - liked: liked, - id: post.id - }) - }) - }); - }); - resolve(result); - }); - }) - } else { - reject() - } - }); + let result: Array = new Array(); + let currentUser = await this.usersvc.getCurrentUser(); + + let posts = await firstValueFrom(this.afs.collection('post').valueChanges({ idField: 'id' })); + posts.forEach(async post=>{ + let user = await firstValueFrom(this.afs.doc((post as any).user).valueChanges()) as User; + + 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 as any).content, + image: (post as any).image, + likes: likes.length, + liked: likes.filter(like => (like as any).user.id == currentUser.username).length != 0, + id: post.id + }) + resolve(result); + }) + }) } getPosts(username: String | undefined): Promise> { @@ -66,7 +51,7 @@ export class PostService { // /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())); + let posts = (await firstValueFrom(this.afs.collection('post', ref => ref.where('user', '==', userRef)).valueChanges({ idField: 'id' }))); 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({ @@ -85,7 +70,7 @@ export class PostService { 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())); + let posts = (await firstValueFrom(this.afs.collection('post', ref => ref.where('user', '==', userRef)).valueChanges({ idField: 'id' }))); 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({ @@ -102,25 +87,19 @@ export class PostService { }); } - // FIX: duplicate posts - newPost(content: String, image: String) { - return new Promise((resolve, reject) => { - console.log('new post') - if (this.auth.checkAllowed()) { - this.auth.getUser().subscribe(data => { - this.afs.collection('user', ref => ref.where('id', '==', data?.uid)).valueChanges().subscribe(user => { - this.afs.collection('post').add({ - user: this.afs.doc('/user/' + user[0].username).ref, - content: content, - image: image, - }) - .then(() => resolve()) - .catch(() => reject()); - }); - }); - } else { + newPost(content: String, image: String): Promise { + return new Promise(async (resolve, reject) => { + if (!this.auth.checkAllowed()) reject(); - } + + let user = await this.usersvc.getCurrentUser(); + this.afs.collection('post').add({ + user: this.afs.doc('/user/' + user.username).ref, + content: content, + image: image + }) + .then(() => resolve()) + .catch(() => reject()) }); } @@ -129,33 +108,30 @@ export class PostService { } toggleLike(postId: String): Promise { - return new Promise((resolve, reject) => { - if (this.auth.checkAllowed()) { - this.usersvc.getCurrentUser() - .then(user => { - let userRef = this.afs.doc('/user/' + user.username).ref; - let postRef = this.afs.doc('/post/' + postId).ref; - this.afs.collection('like', ref => ref.where('user', '==', userRef).where('post', '==', postRef)).get().subscribe(likes => { - if (likes.docs.length == 0) { - // like - this.afs.collection('like').add({ - user: userRef, - post: postRef - }) - resolve(true); - } else { - // dislike - likes.docs.forEach(likes => { - likes.ref.delete() - }) - resolve(false); - } - }) - }) - .catch(() => reject()) - } else { + return new Promise(async (resolve, reject) => { + if (!this.auth.checkAllowed()) reject(); - } - }); + + let user = await this.usersvc.getCurrentUser(); + let userRef = this.afs.doc('/user/' + user.username).ref; + let postRef = this.afs.doc('/post/' + postId).ref; + + firstValueFrom(this.afs.collection('like', ref => ref.where('user', '==', userRef).where('post', '==', postRef)).valueChanges({ idField: 'id' })) + .then(async likes => { + if (likes.length == 0) { + await this.afs.collection('like').add({ + user: userRef, + post: postRef + }) + resolve(true); + } else { + likes.forEach(async like => { + await this.afs.doc('/like/' + like.id).delete(); + resolve(false); + }) + } + console.log(likes) + }) + }) } }