@@ -237,60 +237,76 @@ const addOrChangeCopies = async (
237237 purchaseIds : ( number | null ) [ ] ,
238238 labelIds : ( number [ ] | undefined ) [ ]
239239) : Promise < TransactionResults > => {
240- const operations = issueIds . map ( ( issueId , copyNumber ) => {
241- if ( issueId && conditions [ copyNumber ] === null ) {
242- return prismaDm . issue . delete ( {
243- where : { id : issueId } ,
244- } ) ;
245- }
246-
247- const common = {
248- condition : conditions [ copyNumber ] ! ,
249- purchaseId : purchaseIds [ copyNumber ] || - 2 ,
250- } ;
251-
252- const createInput = {
253- ...common ,
254- issuecode,
240+ let operations = [ ] , deleteOperations = [ ] ;
241+ const previousIssueIds = await prismaDm . issue . findMany ( {
242+ where : {
255243 userId,
256- creationDate : new Date ( ) ,
257- } ;
258- const updateInput = {
259- ...common ,
260- labels : {
261- deleteMany : { } ,
262- } ,
263- } ;
264- console . log ( "upsert" , {
265- create : createInput ,
266- update : updateInput ,
267- where : { id : issueId || 0 } ,
268- } ) ;
269- return prismaDm . issue . upsert ( {
270- create : createInput ,
271- update : updateInput ,
272- where : {
273- id : issueId || 0 ,
274- } ,
275- } ) ;
244+ issuecode,
245+ } ,
276246 } ) ;
277- const upsertResults = await prismaDm . $transaction ( operations ) ;
278- const newIssueLabelsOperations = upsertResults
279- . map ( ( result , copyNumber ) => ( { result, copyNumber } ) )
280- . filter ( ( { result } ) => "id" in result )
281- . map ( ( { result : { id : issueId } , copyNumber } ) =>
282- prismaDm . issueLabel . createMany ( {
283- data :
284- labelIds [ copyNumber ] ?. map ( ( labelId ) => ( {
285- labelId,
286- issueId,
287- } ) ) || [ ] ,
288- } )
289- ) ;
290- await prismaDm . $transaction ( newIssueLabelsOperations ) ;
247+ const deletedIssueIds = previousIssueIds . filter ( ( { id } ) => ! issueIds . includes ( id ) ) ;
248+ if ( deletedIssueIds . length ) {
249+ deleteOperations = deletedIssueIds . map ( ( { id } ) => prismaDm . issue . delete ( {
250+ where : { id } ,
251+ } ) ) ;
252+ await prismaDm . $transaction ( deleteOperations ) ;
253+ }
254+ if ( issueIds . length ) {
255+ operations = issueIds . map ( ( issueId , copyNumber ) => {
256+ if ( issueId && conditions [ copyNumber ] === null ) {
257+ return prismaDm . issue . delete ( {
258+ where : { id : issueId } ,
259+ } ) ;
260+ }
261+
262+ const common = {
263+ condition : conditions [ copyNumber ] ! ,
264+ purchaseId : purchaseIds [ copyNumber ] || - 2 ,
265+ } ;
266+
267+ const createInput = {
268+ ...common ,
269+ issuecode,
270+ userId,
271+ creationDate : new Date ( ) ,
272+ } ;
273+ const updateInput = {
274+ ...common ,
275+ labels : {
276+ deleteMany : { } ,
277+ } ,
278+ } ;
279+ console . log ( "upsert" , {
280+ create : createInput ,
281+ update : updateInput ,
282+ where : { id : issueId || 0 } ,
283+ } ) ;
284+ return prismaDm . issue . upsert ( {
285+ create : createInput ,
286+ update : updateInput ,
287+ where : {
288+ id : issueId || 0 ,
289+ } ,
290+ } ) ;
291+ } ) ;
292+ const upsertResults = await prismaDm . $transaction ( operations ) ;
293+ const newIssueLabelsOperations = upsertResults
294+ . map ( ( result , copyNumber ) => ( { result, copyNumber } ) )
295+ . filter ( ( { result } ) => "id" in result )
296+ . map ( ( { result : { id : issueId } , copyNumber } ) =>
297+ prismaDm . issueLabel . createMany ( {
298+ data :
299+ labelIds [ copyNumber ] ?. map ( ( labelId ) => ( {
300+ labelId,
301+ issueId,
302+ } ) ) || [ ] ,
303+ } )
304+ ) ;
305+ await prismaDm . $transaction ( newIssueLabelsOperations ) ;
306+ }
291307
292308 return {
293- operations : operations . length ,
309+ operations : operations . length + deleteOperations . length ,
294310 } ;
295311} ;
296312
0 commit comments