1- import { firestore } from 'firebase-admin' ;
1+ import { firestore , storage } from 'firebase-admin' ;
22import * as t from "io-ts" ;
33import { characterChange } from "../characterChange" ;
44import { v4 as uuidv4 } from "uuid" ;
5+ import { generateAvatarUrl , getAvatarPath , METADATA } from "../avatar" ;
56
67const RequestBody = t . interface ( {
78 partyId : t . string ,
89 characterId : t . string ,
910 newName : t . string ,
1011} ) ;
1112
13+ type Character = {
14+ avatarUrl : string | null ;
15+ }
16+
1217export const duplicateCharacter = characterChange ( RequestBody , async ( body , character ) => {
1318 const batch = firestore ( ) . batch ( ) ;
1419 const newCharacterId = uuidv4 ( ) ;
1520 const newCharacter = character . parent . doc ( newCharacterId ) ;
16- const characterData = ( await character . get ( ) ) . data ( ) ;
17-
18- batch . set (
19- newCharacter ,
20- {
21- ...characterData ,
22- id : newCharacterId ,
23- name : body . newName ,
24- }
25- )
21+ const characterData = ( await character . get ( ) ) . data ( ) as Character ;
22+
23+ const newCharacterData = {
24+ ...characterData ,
25+ id : newCharacterId ,
26+ name : body . newName ,
27+ avatarUrl : await copyAvatar ( characterData . avatarUrl , body . partyId , body . characterId , newCharacterId ) ,
28+ } ;
29+
30+ console . log ( "New character data" , newCharacterData ) ;
31+
32+ batch . set ( newCharacter , newCharacterData ) ;
2633
2734 const collections = await character . listCollections ( ) ;
2835
@@ -45,3 +52,34 @@ export const duplicateCharacter = characterChange(RequestBody, async (body, char
4552 status : "success" ,
4653 } ;
4754} )
55+
56+ const copyAvatar = async (
57+ avatarUrl : string | null ,
58+ partyId : string ,
59+ characterId : string ,
60+ newCharacterId : string ,
61+ ) : Promise < string | null > => {
62+ if ( avatarUrl === null ) {
63+ return null ;
64+ }
65+
66+ const bucket = storage ( ) . bucket ( ) ;
67+
68+ try {
69+ const sourceFile = bucket . file ( getAvatarPath ( partyId , characterId ) ) ;
70+
71+ if ( ! ( await sourceFile . exists ( ) ) [ 0 ] ) {
72+ return null ;
73+ }
74+
75+ const copyResponse = await sourceFile . copy (
76+ bucket . file ( getAvatarPath ( partyId , newCharacterId ) ) ,
77+ { metadata : METADATA }
78+ ) ;
79+
80+ return await generateAvatarUrl ( copyResponse , bucket ) ;
81+ } catch ( e ) {
82+ console . error ( e ) ;
83+ return null ;
84+ }
85+ }
0 commit comments