@@ -24,6 +24,10 @@ import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/me
24
24
import { ShortLinkService } from '@gitroom/nestjs-libraries/short-linking/short.link.service' ;
25
25
import { WebhooksService } from '@gitroom/nestjs-libraries/database/prisma/webhooks/webhooks.service' ;
26
26
import { CreateTagDto } from '@gitroom/nestjs-libraries/dtos/posts/create.tag.dto' ;
27
+ import axios from 'axios' ;
28
+ import sharp from 'sharp' ;
29
+ import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory' ;
30
+ import { Readable } from 'stream' ;
27
31
dayjs . extend ( utc ) ;
28
32
29
33
type PostWithConditionals = Post & {
@@ -33,6 +37,7 @@ type PostWithConditionals = Post & {
33
37
34
38
@Injectable ( )
35
39
export class PostsService {
40
+ private storage = UploadFactory . createStorage ( ) ;
36
41
constructor (
37
42
private _postRepository : PostsRepository ,
38
43
private _workerServiceProducer : BullMqClient ,
@@ -92,36 +97,90 @@ export class PostsService {
92
97
return this . _postRepository . getPosts ( orgId , query ) ;
93
98
}
94
99
95
- async updateMedia ( id : string , imagesList : any [ ] ) {
100
+ async updateMedia ( id : string , imagesList : any [ ] , convertToJPEG = false ) {
96
101
let imageUpdateNeeded = false ;
97
- const getImageList = (
98
- await Promise . all (
99
- imagesList . map ( async ( p : any ) => {
100
- if ( ! p . path && p . id ) {
102
+ const getImageList = await Promise . all (
103
+ (
104
+ await Promise . all (
105
+ imagesList . map ( async ( p : any ) => {
106
+ if ( ! p . path && p . id ) {
107
+ imageUpdateNeeded = true ;
108
+ return this . _mediaService . getMediaById ( p . id ) ;
109
+ }
110
+
111
+ return p ;
112
+ } )
113
+ )
114
+ )
115
+ . map ( ( m ) => {
116
+ return {
117
+ ...m ,
118
+ url :
119
+ m . path . indexOf ( 'http' ) === - 1
120
+ ? process . env . FRONTEND_URL +
121
+ '/' +
122
+ process . env . NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY +
123
+ m . path
124
+ : m . path ,
125
+ type : 'image' ,
126
+ path :
127
+ m . path . indexOf ( 'http' ) === - 1
128
+ ? process . env . UPLOAD_DIRECTORY + m . path
129
+ : m . path ,
130
+ } ;
131
+ } )
132
+ . map ( async ( m ) => {
133
+ if ( ! convertToJPEG ) {
134
+ return m ;
135
+ }
136
+
137
+ if ( m . path . indexOf ( '.png' ) > - 1 ) {
101
138
imageUpdateNeeded = true ;
102
- return this . _mediaService . getMediaById ( p . id ) ;
139
+ const response = await axios . get ( m . url , {
140
+ responseType : 'arraybuffer' ,
141
+ } ) ;
142
+
143
+ const imageBuffer = Buffer . from ( response . data ) ;
144
+
145
+ // Use sharp to get the metadata of the image
146
+ const buffer = await sharp ( imageBuffer )
147
+ . jpeg ( { quality : 100 } )
148
+ . toBuffer ( ) ;
149
+
150
+ const { path, originalname } = await this . storage . uploadFile ( {
151
+ buffer,
152
+ mimetype : 'image/jpeg' ,
153
+ size : buffer . length ,
154
+ path : '' ,
155
+ fieldname : '' ,
156
+ destination : '' ,
157
+ stream : new Readable ( ) ,
158
+ filename : '' ,
159
+ originalname : '' ,
160
+ encoding : '' ,
161
+ } ) ;
162
+
163
+ return {
164
+ ...m ,
165
+ name : originalname ,
166
+ url :
167
+ path . indexOf ( 'http' ) === - 1
168
+ ? process . env . FRONTEND_URL +
169
+ '/' +
170
+ process . env . NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY +
171
+ path
172
+ : path ,
173
+ type : 'image' ,
174
+ path :
175
+ path . indexOf ( 'http' ) === - 1
176
+ ? process . env . UPLOAD_DIRECTORY + path
177
+ : path ,
178
+ } ;
103
179
}
104
180
105
- return p ;
181
+ return m ;
106
182
} )
107
- )
108
- ) . map ( ( m ) => {
109
- return {
110
- ...m ,
111
- url :
112
- m . path . indexOf ( 'http' ) === - 1
113
- ? process . env . FRONTEND_URL +
114
- '/' +
115
- process . env . NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY +
116
- m . path
117
- : m . path ,
118
- type : 'image' ,
119
- path :
120
- m . path . indexOf ( 'http' ) === - 1
121
- ? process . env . UPLOAD_DIRECTORY + m . path
122
- : m . path ,
123
- } ;
124
- } ) ;
183
+ ) ;
125
184
126
185
if ( imageUpdateNeeded ) {
127
186
await this . _postRepository . updateImages ( id , JSON . stringify ( getImageList ) ) ;
@@ -130,7 +189,7 @@ export class PostsService {
130
189
return getImageList ;
131
190
}
132
191
133
- async getPost ( orgId : string , id : string ) {
192
+ async getPost ( orgId : string , id : string , convertToJPEG = false ) {
134
193
const posts = await this . getPostsRecursively ( id , true , orgId , true ) ;
135
194
const list = {
136
195
group : posts ?. [ 0 ] ?. group ,
@@ -139,7 +198,8 @@ export class PostsService {
139
198
...post ,
140
199
image : await this . updateMedia (
141
200
post . id ,
142
- JSON . parse ( post . image || '[]' )
201
+ JSON . parse ( post . image || '[]' ) ,
202
+ convertToJPEG ,
143
203
) ,
144
204
} ) )
145
205
) ,
@@ -361,7 +421,11 @@ export class PostsService {
361
421
id : p . id ,
362
422
message : p . content ,
363
423
settings : JSON . parse ( p . settings || '{}' ) ,
364
- media : await this . updateMedia ( p . id , JSON . parse ( p . image || '[]' ) ) ,
424
+ media : await this . updateMedia (
425
+ p . id ,
426
+ JSON . parse ( p . image || '[]' ) ,
427
+ getIntegration . convertToJPEG
428
+ ) ,
365
429
} ) )
366
430
) ,
367
431
integration
0 commit comments