diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index 0e9d6f959..82fdea13a 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -577,14 +577,14 @@ export const MultiMediaComponent: FC<{
window.open(mediaDirectory.set(media.path))} + onClick={() => window.open(mediaDirectory.set(media?.path))} > - {media.path.indexOf('mp4') > -1 ? ( - + {media?.path?.indexOf('mp4') > -1 ? ( + ) : ( )}
diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts index 06696e125..a2b5da582 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts @@ -19,6 +19,14 @@ export class MediaRepository { }); } + getMediaById(id: string) { + return this._media.model.media.findUnique({ + where: { + id, + }, + }); + } + deleteMedia(org: string, id: string) { return this._media.model.media.update({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts index 53840fa0a..921ebc117 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts @@ -16,6 +16,10 @@ export class MediaService { return this._mediaRepository.deleteMedia(org, id); } + getMediaById(id: string) { + return this._mediaRepository.getMediaById(id); + } + async generateImage( prompt: string, org: Organization, diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts index 9f4c8523d..3b0d25ed7 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -51,6 +51,17 @@ export class PostsRepository { }); } + updateImages(id: string, images: string) { + return this._post.model.post.update({ + where: { + id, + }, + data: { + image: images, + }, + }); + } + getPostUrls(orgId: string, ids: string[]) { return this._post.model.post.findMany({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 5265ed887..d6d2155e0 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -20,6 +20,7 @@ import { BullMqClient } from '@gitroom/nestjs-libraries/bull-mq-transport-new/cl import { timer } from '@gitroom/helpers/utils/timer'; import { AuthTokenDetails } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import utc from 'dayjs/plugin/utc'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; dayjs.extend(utc); type PostWithConditionals = Post & { @@ -36,7 +37,8 @@ export class PostsService { private _notificationService: NotificationService, private _messagesService: MessagesService, private _stripeService: StripeService, - private _integrationService: IntegrationService + private _integrationService: IntegrationService, + private _mediaService: MediaService ) {} async getPostsRecursively( @@ -73,18 +75,63 @@ export class PostsService { return this._postRepository.getPosts(orgId, query); } + async updateMedia(id: string, imagesList: any[]) { + let imageUpdateNeeded = false; + const getImageList = ( + await Promise.all( + imagesList.map(async (p: any) => { + if (!p.path && p.id) { + imageUpdateNeeded = true; + return this._mediaService.getMediaById(p.id); + } + + return p; + }) + ) + ).map((m) => { + return { + ...m, + url: + m.path.indexOf('http') === -1 + ? process.env.FRONTEND_URL + + '/' + + process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY + + m.path + : m.path, + type: 'image', + path: + m.path.indexOf('http') === -1 + ? process.env.UPLOAD_DIRECTORY + m.path + : m.path, + }; + }); + + if (imageUpdateNeeded) { + await this._postRepository.updateImages(id, JSON.stringify(getImageList)); + } + + return getImageList; + } + async getPost(orgId: string, id: string) { const posts = await this.getPostsRecursively(id, true, orgId, true); - return { + const list = { group: posts?.[0]?.group, - posts: posts.map((post) => ({ - ...post, - image: JSON.parse(post.image || '[]'), - })), + posts: await Promise.all( + posts.map(async (post) => ({ + ...post, + image: await this.updateMedia( + post.id, + JSON.parse(post.image || '[]') + ), + })) + ), integrationPicture: posts[0]?.integration?.picture, integration: posts[0].integrationId, settings: JSON.parse(posts[0].settings || '{}'), }; + + return list; } async getOldPosts(orgId: string, date: string) { @@ -280,25 +327,14 @@ export class PostsService { const publishedPosts = await getIntegration.post( integration.internalId, integration.token, - newPosts.map((p) => ({ - id: p.id, - message: p.content, - settings: JSON.parse(p.settings || '{}'), - media: (JSON.parse(p.image || '[]') as Media[]).map((m) => ({ - url: - m.path.indexOf('http') === -1 - ? process.env.FRONTEND_URL + - '/' + - process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY + - m.path - : m.path, - type: 'image', - path: - m.path.indexOf('http') === -1 - ? process.env.UPLOAD_DIRECTORY + m.path - : m.path, - })), - })), + await Promise.all( + newPosts.map(async (p) => ({ + id: p.id, + message: p.content, + settings: JSON.parse(p.settings || '{}'), + media: await this.updateMedia(p.id, JSON.parse(p.image || '[]')), + })) + ), integration ); @@ -802,7 +838,12 @@ export class PostsService { return this._postRepository.getComments(postId); } - createComment(orgId: string, userId: string, postId: string, comment: string) { + createComment( + orgId: string, + userId: string, + postId: string, + comment: string + ) { return this._postRepository.createComment(orgId, userId, postId, comment); } } diff --git a/libraries/react-shared-libraries/src/helpers/video.or.image.tsx b/libraries/react-shared-libraries/src/helpers/video.or.image.tsx index 47e6b5a89..7cbded76d 100644 --- a/libraries/react-shared-libraries/src/helpers/video.or.image.tsx +++ b/libraries/react-shared-libraries/src/helpers/video.or.image.tsx @@ -7,7 +7,7 @@ export const VideoOrImage: FC<{ isContain?: boolean; }> = (props) => { const { src, autoplay, isContain } = props; - if (src.indexOf('mp4') > -1) { + if (src?.indexOf('mp4') > -1) { return (