Skip to content

Commit 22c3d46

Browse files
committed
Update getWithChildren to use stela
1 parent c51157e commit 22c3d46

File tree

2 files changed

+202
-31
lines changed

2 files changed

+202
-31
lines changed

src/app/shared/services/api/folder.repo.ts

Lines changed: 185 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
import { FolderVO, FolderVOData, ItemVO } from '@root/app/models';
22
import { BaseResponse, BaseRepo } from '@shared/services/api/base';
3-
import { Observable } from 'rxjs';
3+
import { firstValueFrom, Observable } from 'rxjs';
44
import { 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

616
const 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+
20139
export 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> {

src/app/shared/services/api/record.repo.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class MultipartUploadUrlsList {
5252
// to simply use what stela provides, but there is work to be done regarding
5353
// overall type safety in this code base before we want to take that project
5454
// on.
55-
interface StelaTag {
55+
export interface StelaTag {
5656
id: string;
5757
name: string;
5858
type: string;
@@ -67,8 +67,8 @@ interface StelaFile {
6767
updatedAt: string;
6868
downloadUrl: string;
6969
}
70-
interface StelaLocation {
71-
id: number;
70+
export interface StelaLocation {
71+
id: string;
7272
streetNumber: string;
7373
streetName: string;
7474
locality: string;
@@ -85,17 +85,17 @@ interface StelaArchive {
8585
archiveNumber: string;
8686
name: string;
8787
}
88-
interface StelaShare {
88+
export interface StelaShare {
8989
id: string;
9090
status: ShareStatus;
9191
accessRole: AccessRoleType;
9292
archive: {
93-
id: number;
94-
name: string;
93+
id: string;
9594
thumbUrl200: string;
95+
name: string;
9696
};
9797
}
98-
type StelaRecord = Omit<RecordVO, 'files'> & {
98+
export type StelaRecord = Omit<RecordVO, 'files'> & {
9999
tags: Array<StelaTag>;
100100
archiveNumber: string;
101101
displayDate: string;
@@ -122,7 +122,10 @@ const resolveTagName = (tag: StelaTag): string => {
122122
return tag.name;
123123
};
124124

125-
const convertStelaTagToTagVO = (stelaTag: StelaTag, archiveId: string): TagVO =>
125+
export const convertStelaTagToTagVO = (
126+
stelaTag: StelaTag,
127+
archiveId: string,
128+
): TagVO =>
126129
new TagVO({
127130
tagId: Number.parseInt(stelaTag.id),
128131
name: resolveTagName(stelaTag),
@@ -138,7 +141,7 @@ const convertStelaFileToPermanentFile = (
138141
downloadURL: stelaFile.downloadUrl,
139142
});
140143

141-
const convertStelaSharetoShareVO = (stelaShare: StelaShare): ShareVO =>
144+
export const convertStelaSharetoShareVO = (stelaShare: StelaShare): ShareVO =>
142145
new ShareVO({
143146
shareId: stelaShare.id,
144147
status: stelaShare.status,
@@ -150,17 +153,19 @@ const convertStelaSharetoShareVO = (stelaShare: StelaShare): ShareVO =>
150153
},
151154
});
152155

153-
const convertStelaLocationToLocnVOData = (
156+
export const convertStelaLocationToLocnVOData = (
154157
stelaLocation: StelaLocation,
155158
): LocnVOData =>
156159
stelaLocation.id
157160
? {
158161
...stelaLocation,
159-
locnId: stelaLocation.id,
162+
locnId: Number.parseInt(stelaLocation.id, 10),
160163
}
161164
: null;
162165

163-
const convertStelaRecordToRecordVO = (stelaRecord: StelaRecord): RecordVO =>
166+
export const convertStelaRecordToRecordVO = (
167+
stelaRecord: StelaRecord,
168+
): RecordVO =>
164169
new RecordVO({
165170
...stelaRecord,
166171
TagVOs: stelaRecord.tags.map((stelaTag) =>

0 commit comments

Comments
 (0)