From 526d861685214017a856cdb0edadef27e4040563 Mon Sep 17 00:00:00 2001 From: trivernis Date: Thu, 23 Jan 2020 14:50:16 +0100 Subject: [PATCH] Add post file uploading and processing - Add processing of videos via ffmpeg - Add files for posts --- src/app/components/feed/feed.component.ts | 4 +-- src/app/models/post.ts | 5 +++- src/app/services/feed/feed.service.ts | 36 ++++++++++++++++++----- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/app/components/feed/feed.component.ts b/src/app/components/feed/feed.component.ts index a99eea9..9bae09b 100644 --- a/src/app/components/feed/feed.component.ts +++ b/src/app/components/feed/feed.component.ts @@ -70,7 +70,7 @@ export class FeedComponent implements OnInit { */ createPost(postElement, activityId: string) { if (postElement && activityId && this.checked) { - this.feedService.createPostActivity(postElement.value, activityId).subscribe(() => { + this.feedService.createPostActivity(postElement.value, activityId, this.file).subscribe(() => { postElement.value = ''; this.textInputValue = ''; this.checked = false; @@ -82,7 +82,7 @@ export class FeedComponent implements OnInit { this.errorMessage = error.error.errors[0].message; }); } else if (postElement) { - this.feedService.createPost(postElement.value).subscribe(() => { + this.feedService.createPost(postElement.value, this.file).subscribe(() => { postElement.value = ''; this.textInputValue = ''; this.checked = false; diff --git a/src/app/models/post.ts b/src/app/models/post.ts index eb4cb67..36fb5ac 100644 --- a/src/app/models/post.ts +++ b/src/app/models/post.ts @@ -12,6 +12,7 @@ export class Post { deletable: boolean; author: Author; activity: Activity; + mediaUrl: string; constructor( id: number, @@ -23,7 +24,8 @@ export class Post { deletable: boolean, date: string, author: Author, - activity: Activity + activity: Activity, + mediaUrl?: string, ) { this.id = id; this.content = content; @@ -35,5 +37,6 @@ export class Post { this.date = date; this.author = author; this.activity = activity; + this.mediaUrl = mediaUrl; } } diff --git a/src/app/services/feed/feed.service.ts b/src/app/services/feed/feed.service.ts index 1689b91..79f3e80 100644 --- a/src/app/services/feed/feed.service.ts +++ b/src/app/services/feed/feed.service.ts @@ -4,10 +4,11 @@ import {Post} from 'src/app/models/post'; import {Author} from 'src/app/models/author'; import {environment} from 'src/environments/environment'; import {Activity} from 'src/app/models/activity'; -import {BehaviorSubject} from 'rxjs'; +import {BehaviorSubject, Observable} from 'rxjs'; import {tap} from 'rxjs/operators'; import {BaseService} from '../base.service'; import {formatDate} from '@angular/common'; +import {IFileUploadResult} from '../../models/interfaces/IFileUploadResult'; const createPostGqlQuery = `mutation($content: String!) { createPost(content: $content) { @@ -138,47 +139,68 @@ export class FeedService extends BaseService { /** * Creates a new post * @param pContent + * @param file */ - public createPost(pContent: String) { + public createPost(pContent: String, file?: File) { const body = { query: createPostGqlQuery, variables: { content: pContent } }; - return this.createPostRequest(body); + return this.createPostRequest(body, file); } /** * Creates a post with an activity * @param pContent * @param activityId + * @param file */ - public createPostActivity(pContent: String, activityId: String) { + public createPostActivity(pContent: String, activityId: String, file?: File) { const body = { query: createPostActivityGqlQuery, variables: { content: pContent, id: activityId } }; - return this.createPostRequest(body); + return this.createPostRequest(body, file); } /** * Creates a new post with a given request. * @param body + * @param file - a file that is being uploaded with the post */ - private createPostRequest(body: { variables: any; query: string }) { + private createPostRequest(body: { variables: any; query: string }, file?: File) { return this.postGraphql(body, null, 0) .pipe(tap(response => { if (this.activePostList === Sort.NEW) { const updatedPosts = this.posts.getValue(); - updatedPosts.unshift(this.constructPost(response)); + const post = this.constructPost(response); + updatedPosts.unshift(post); this.posts.next(updatedPosts); + if (file) { + this.uploadPostImage(post.id, file).subscribe((result) => { + post.mediaUrl = result.fileName; + }); + } } })); } + /** + * Uploads a file for a post + * @param postId + * @param file + */ + private uploadPostImage(postId: number, file: File): Observable { + const formData = new FormData(); + formData.append('postMedia', file); + formData.append('postId', postId.toString()); + return this.post(environment.greenvironmentUrl + '/upload', formData); + } + /** * Upvotes a post * @param postId