11import { FolderVO , FolderVOData , ItemVO } from '@root/app/models' ;
22import { BaseResponse , BaseRepo } from '@shared/services/api/base' ;
3- import { Observable } from 'rxjs' ;
3+ import { firstValueFrom , Observable } from 'rxjs' ;
44import { DataStatus } from '@models/data-status.enum' ;
5+ import {
6+ convertStelaLocationToLocnVOData ,
7+ convertStelaRecordToRecordVO ,
8+ convertStelaSharetoShareVO ,
9+ convertStelaTagToTagVO ,
10+ StelaLocation ,
11+ StelaShare ,
12+ StelaTag ,
13+ type StelaRecord ,
14+ } from './record.repo' ;
515
616const MIN_WHITELIST : ( keyof FolderVO ) [ ] = [
717 'folderId' ,
@@ -17,6 +27,115 @@ const DEFAULT_WHITELIST: (keyof FolderVO)[] = [
1727 'view' ,
1828] ;
1929
30+ interface StelaFolder {
31+ folderId : string ;
32+ size : number ;
33+ location : StelaLocation ;
34+ parentFolder : {
35+ id : string ;
36+ } ;
37+ shares : Array < StelaShare > ;
38+ tags : Array < StelaTag > ;
39+ archive : {
40+ id : string ;
41+ name : string ;
42+ } ;
43+ createdAt : string ;
44+ updatedAt : string ;
45+ description : string ;
46+ displayTimestamp : string ;
47+ displayEndTimestamp : string ;
48+ displayName : string ;
49+ downloadName : string ;
50+ imageRatio : number ;
51+ paths : {
52+ names : string [ ] ;
53+ } ;
54+ publicAt : string ;
55+ sort : string ;
56+ thumbnailUrls : {
57+ '200' : string ;
58+ '256' : string ;
59+ '500' : string ;
60+ '1000' : string ;
61+ '2000' : string ;
62+ } ;
63+ type : string ;
64+ status : string ;
65+ view : string ;
66+ children ?: StelaFolderChild [ ] ;
67+ }
68+
69+ interface PagedStelaResponse < T > {
70+ items : Array < T > ;
71+ }
72+
73+ type StelaFolderChild = StelaFolder | StelaRecord ;
74+
75+ const isStelaRecord = ( child : StelaFolderChild ) : child is StelaRecord =>
76+ child && 'recordId' in child ;
77+
78+ const convertStelaFolderToFolderVO = ( stelaFolder : StelaFolder ) : FolderVO => {
79+ stelaFolder . children ??= [ ] ;
80+ const childFolderVOs = stelaFolder . children
81+ . filter ( ( child ) : child is StelaFolder => ! isStelaRecord ( child ) )
82+ . map ( convertStelaFolderToFolderVO ) ;
83+ const childRecordVOs = stelaFolder . children
84+ . filter ( isStelaRecord )
85+ . map ( convertStelaRecordToRecordVO ) ;
86+ return new FolderVO ( {
87+ ...stelaFolder ,
88+ folderId : stelaFolder . folderId ,
89+ archiveId : stelaFolder . archive . id ,
90+ displayName : stelaFolder . displayName ,
91+ displayDT : stelaFolder . displayTimestamp ,
92+ displayEndDT : stelaFolder . displayEndTimestamp ,
93+ derivedDT : stelaFolder . displayTimestamp ,
94+ derivedEndDT : stelaFolder . displayEndTimestamp ,
95+ note : '' ,
96+ description : stelaFolder . description ,
97+ sort : stelaFolder . sort ,
98+ locnId : stelaFolder . location . id ,
99+ timeZoneId : 88 , // Hard coded for now
100+ view : stelaFolder . view ,
101+ imageRatio : stelaFolder . imageRatio ,
102+ type : stelaFolder . type ,
103+ thumbStatus : stelaFolder . status ,
104+ thumbURL200 : stelaFolder . thumbnailUrls [ '200' ] ,
105+ thumbURL500 : stelaFolder . thumbnailUrls [ '500' ] ,
106+ thumbURL1000 : stelaFolder . thumbnailUrls [ '1000' ] ,
107+ thumbURL2000 : stelaFolder . thumbnailUrls [ '2000' ] ,
108+ thumbDT : stelaFolder . displayTimestamp ,
109+ thumbnail256 : stelaFolder . thumbnailUrls [ '256' ] ,
110+ thumbnail256CloudPath : stelaFolder . thumbnailUrls [ '256' ] ,
111+ status : stelaFolder . status ,
112+ publicDT : stelaFolder . publicAt ,
113+ parentFolderId : stelaFolder . parentFolder . id ,
114+ pathAsText : stelaFolder . paths . names ,
115+ ParentFolderVOs : [ new FolderVO ( { folderId : stelaFolder . parentFolder . id } ) ] ,
116+ ChildFolderVOs : childFolderVOs ,
117+ RecordVOs : childRecordVOs ,
118+ LocnVO : convertStelaLocationToLocnVOData ( stelaFolder . location ) ,
119+ TimezoneVO : {
120+ timeZoneId : 88 ,
121+ displayName : 'Central Time' ,
122+ timeZonePlace : 'America/Chicago' ,
123+ stdName : 'Central Standard Time' ,
124+ stdAbbrev : 'CST' ,
125+ stdOffset : '-06:00' ,
126+ dstName : 'Central Daylight Time' ,
127+ dstAbbrev : 'CDT' ,
128+ dstOffset : '-05:00' ,
129+ } ,
130+ TagVOs : ( stelaFolder . tags ?? [ ] ) . map ( ( stelaTag ) =>
131+ convertStelaTagToTagVO ( stelaTag , stelaFolder . archive . id ) ,
132+ ) ,
133+ ChildItemVOs : [ ...childRecordVOs , ...childFolderVOs ] ,
134+ ShareVOs : ( stelaFolder . shares ?? [ ] ) . map ( convertStelaSharetoShareVO ) ,
135+ isFolder : true ,
136+ } ) ;
137+ } ;
138+
20139export class FolderRepo extends BaseRepo {
21140 public async getRoot ( ) : Promise < FolderResponse > {
22141 return await this . http . sendRequestPromise < FolderResponse > (
@@ -46,20 +165,73 @@ export class FolderRepo extends BaseRepo {
46165 ) ;
47166 }
48167
168+ private async getStelaFolder ( folderVO : FolderVO ) : Promise < StelaFolder > {
169+ const queryData = {
170+ folderIds : [ folderVO . folderId ] ,
171+ } ;
172+ const folderResponse = (
173+ await firstValueFrom (
174+ this . httpV2 . get < PagedStelaResponse < StelaFolder > > (
175+ `v2/folder` ,
176+ queryData ,
177+ ) ,
178+ )
179+ ) [ 0 ] ;
180+ return folderResponse . items [ 0 ] ;
181+ }
182+
183+ private async getStelaFolderChildren (
184+ folderVO : FolderVO ,
185+ ) : Promise < StelaFolderChild [ ] > {
186+ const queryData = {
187+ pageSize : 99999999 , // We want all results in one request
188+ } ;
189+ const childrenResponse = (
190+ await firstValueFrom (
191+ this . httpV2 . get < PagedStelaResponse < StelaFolderChild > > (
192+ `v2/folder/${ folderVO . folderId } /children` ,
193+ queryData ,
194+ ) ,
195+ )
196+ ) [ 0 ] ;
197+ return childrenResponse . items ;
198+ }
199+
49200 public async getWithChildren ( folderVOs : FolderVO [ ] ) : Promise < FolderResponse > {
50- const data = folderVOs . map ( ( folderVO ) => ( {
51- FolderVO : {
52- archiveNbr : folderVO . archiveNbr ,
53- folder_linkId : folderVO . folder_linkId ,
54- folderId : folderVO . folderId ,
55- } ,
56- } ) ) ;
201+ // Stela has two separate endpoints -- one for loading the folder, one for loading the children.
202+ const requests = folderVOs . map ( async ( folderVO ) => {
203+ const stelaFolder = await this . getStelaFolder ( folderVO ) ;
204+ const stelaFolderChildren = await this . getStelaFolderChildren ( folderVO ) ;
205+ return {
206+ ...stelaFolder ,
207+ children : stelaFolderChildren ,
208+ } ;
209+ } ) ;
57210
58- return await this . http . sendRequestPromise < FolderResponse > (
59- '/folder/getWithChildren' ,
60- data ,
61- { responseClass : FolderResponse } ,
211+ const stelaFolders = ( await Promise . all ( requests ) ) . flat ( ) ;
212+
213+ // We need the `Results` to look the way v1 results look, for now.
214+ const simulatedV1FolderResponseResults = stelaFolders . map (
215+ ( stelaFolder ) => ( {
216+ data : [
217+ {
218+ FolderVO : convertStelaFolderToFolderVO ( stelaFolder ) ,
219+ } ,
220+ ] ,
221+ message : [ 'Folder retrieved' ] ,
222+ status : true ,
223+ resultDT : new Date ( ) . toISOString ( ) ,
224+ createdDT : null ,
225+ updatedDT : null ,
226+ } ) ,
62227 ) ;
228+
229+ const folderResponse = new FolderResponse ( {
230+ isSuccessful : true ,
231+ isSystemUp : true ,
232+ Results : simulatedV1FolderResponseResults ,
233+ } ) ;
234+ return folderResponse ;
63235 }
64236
65237 public navigate ( folderVO : FolderVO ) : Observable < FolderResponse > {
@@ -94,13 +266,7 @@ export class FolderRepo extends BaseRepo {
94266 }
95267
96268 public getLeanItems ( folderVOs : FolderVO [ ] ) : Observable < FolderResponse > {
97- const data = folderVOs . map ( ( folderVO ) => ( {
98- FolderVO : new FolderVO ( folderVO ) ,
99- } ) ) ;
100-
101- return this . http . sendRequest < FolderResponse > ( '/folder/getLeanItems' , data , {
102- responseClass : FolderResponse ,
103- } ) ;
269+ return this . getWithChildren ( folderVOs ) ;
104270 }
105271
106272 public async post ( folderVOs : FolderVO [ ] ) : Promise < FolderResponse > {
0 commit comments