Skip to content

Commit 26af20f

Browse files
committed
fix(addons): show provider icon for project connected addons
1 parent 38a1a4c commit 26af20f

File tree

6 files changed

+62
-9
lines changed

6 files changed

+62
-9
lines changed

src/app/shared/mappers/addon.mapper.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,27 @@ export class AddonMapper {
8080
};
8181
}
8282

83-
static fromConfiguredAddonResponse(response: ConfiguredAddonGetResponseJsonApi): ConfiguredAddonModel {
83+
static fromConfiguredAddonResponse(
84+
response: ConfiguredAddonGetResponseJsonApi,
85+
included?: IncludedAddonData[]
86+
): ConfiguredAddonModel {
8487
const isLinkAddon = response.type === ConfiguredAddonType.LINK;
88+
const externalServiceData =
89+
response.relationships?.external_storage_service?.data ||
90+
response.relationships?.external_citation_service?.data ||
91+
response.relationships?.external_link_service?.data;
92+
93+
const externalServiceId = externalServiceData?.id;
94+
95+
const matchingService = included?.find(
96+
(item) =>
97+
(item.type === AddonCategory.EXTERNAL_STORAGE_SERVICES ||
98+
item.type === AddonCategory.EXTERNAL_CITATION_SERVICES ||
99+
item.type === AddonCategory.EXTERNAL_LINK_SERVICES) &&
100+
item.id === externalServiceId
101+
)?.attributes;
102+
const iconUrl = (matchingService?.['icon_url'] as string) || '';
103+
85104
return {
86105
type: response.type,
87106
id: response.id,
@@ -97,6 +116,7 @@ export class AddonMapper {
97116
baseAccountType: response.relationships.base_account.data.type,
98117
externalStorageServiceId: response.relationships?.external_storage_service?.data?.id,
99118
rootFolderId: response.attributes.root_folder,
119+
iconUrl,
100120
};
101121
}
102122

src/app/shared/models/addons/addon-json-api.models.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,19 @@ export interface ConfiguredAddonGetResponseJsonApi {
8686
id: string;
8787
};
8888
};
89-
external_storage_service: {
89+
external_storage_service?: {
90+
data: {
91+
type: string;
92+
id: string;
93+
};
94+
};
95+
external_citation_service?: {
96+
data: {
97+
type: string;
98+
id: string;
99+
};
100+
};
101+
external_link_service?: {
90102
data: {
91103
type: string;
92104
id: string;

src/app/shared/services/addons/addons.service.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ describe('Service: Addons', () => {
5656
});
5757

5858
const request = httpMock.expectOne(
59-
'http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/'
59+
'http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/?include=external-storage-service'
6060
);
6161
expect(request.request.method).toBe('GET');
6262
request.flush(getConfiguredAddonsData());
@@ -77,6 +77,7 @@ describe('Service: Addons', () => {
7777
selectedStorageItemId: '0AIl0aR4C9JAFUk9PVA',
7878
targetUrl: undefined,
7979
type: 'configured-storage-addons',
80+
iconUrl: 'https://osf.io/assets/images/logo.svg',
8081
})
8182
);
8283

src/app/shared/services/addons/addons.service.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,16 @@ export class AddonsService {
112112
}
113113

114114
getConfiguredAddons(addonType: string, referenceId: string): Observable<ConfiguredAddonModel[]> {
115+
const params = {
116+
[`fields[external-${addonType}-services]`]: 'external_service_name,credentials_format,icon_url',
117+
};
115118
return this.jsonApiService
116119
.get<
117-
JsonApiResponse<ConfiguredAddonGetResponseJsonApi[], null>
118-
>(`${this.apiUrl}/resource-references/${referenceId}/configured_${addonType}_addons/`)
119-
.pipe(map((response) => response.data.map((item) => AddonMapper.fromConfiguredAddonResponse(item))));
120+
JsonApiResponse<ConfiguredAddonGetResponseJsonApi[], IncludedAddonData[]>
121+
>(`${this.apiUrl}/resource-references/${referenceId}/configured_${addonType}_addons/?include=external-${addonType}-service`, params)
122+
.pipe(
123+
map((response) => response.data.map((item) => AddonMapper.fromConfiguredAddonResponse(item, response.included)))
124+
);
120125
}
121126

122127
createAuthorizedAddon(

src/app/shared/stores/addons/addons.state.spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ describe('State: Addons', () => {
130130
expect(loading()).toBeTruthy();
131131

132132
const request = httpMock.expectOne(
133-
'http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/'
133+
'http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/?include=external-storage-service'
134134
);
135135
expect(request.request.method).toBe('GET');
136136
request.flush(getConfiguredAddonsData());
@@ -151,6 +151,7 @@ describe('State: Addons', () => {
151151
targetUrl: undefined,
152152
type: 'configured-storage-addons',
153153
externalStorageServiceId: '8aeb85e9-3a73-426f-a89b-5624b4b9d418',
154+
iconUrl: 'https://osf.io/assets/images/logo.svg',
154155
})
155156
);
156157

@@ -177,7 +178,7 @@ describe('State: Addons', () => {
177178
expect(loading()).toBeTruthy();
178179

179180
const req = httpMock.expectOne(
180-
'http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/'
181+
'http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/?include=external-storage-service'
181182
);
182183
expect(req.request.method).toBe('GET');
183184

@@ -186,7 +187,7 @@ describe('State: Addons', () => {
186187
expect(result).toEqual({
187188
data: [],
188189
error:
189-
'Http failure response for http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/: 500 Server Error',
190+
'Http failure response for http://addons.localhost:8000/resource-references/reference-id/configured_storage_addons/?include=external-storage-service: 500 Server Error',
190191
isLoading: false,
191192
isSubmitting: false,
192193
});

src/testing/data/addons/addons.configured.data.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ const ConfiguredAddons = {
5858
},
5959
},
6060
],
61+
included: [
62+
{
63+
type: 'external-storage-services',
64+
id: '8aeb85e9-3a73-426f-a89b-5624b4b9d418',
65+
attributes: {
66+
external_service_name: 'googledrive',
67+
credentials_format: 'OAUTH2',
68+
icon_url: 'https://osf.io/assets/images/logo.svg',
69+
},
70+
links: {
71+
self: 'https://addons.staging4.osf.io/v1/external-storage-services/8aeb85e9-3a73-426f-a89b-5624b4b9d418',
72+
},
73+
},
74+
],
6175
};
6276

6377
export function getConfiguredAddonsData(index?: number, asArray?: boolean) {

0 commit comments

Comments
 (0)