Skip to content
This repository was archived by the owner on Apr 14, 2026. It is now read-only.

Commit dc87ed3

Browse files
committed
preliminary
1 parent a28878b commit dc87ed3

6 files changed

Lines changed: 97 additions & 5 deletions

File tree

app/guid-node/addons/index/controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { tracked } from 'tracked-built-ins';
66
enum FilterTypes {
77
STORAGE = 'additional-storage',
88
CITATION_MANAGER = 'citation-manager',
9+
VERIFIED_LINK = 'verified-link',
910
// CLOUD_COMPUTING = 'cloud-computing', // disabled because BOA is down
1011
}
1112
export default class GuidNodeAddonsController extends Controller {

app/models/configured-link-addon.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default class ConfiguredLinkAddonModel extends ConfiguredAddonModel {
1515
@belongsTo('external-link-service', { inverse: null })
1616
externalLinkService!: AsyncBelongsTo<ExternalLinkServiceModel> & ExternalLinkServiceModel;
1717

18-
@belongsTo('authorized-storage-account')
18+
@belongsTo('authorized-link-account')
1919
baseAccount!: AsyncBelongsTo<AuthorizedLinkAccountModel> & AuthorizedLinkAccountModel;
2020

2121
@belongsTo('resource-reference', { inverse: 'configuredLinkAddons' })

app/packages/addons-service/provider.ts

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,25 @@ import ExternalComputingServiceModel from 'ember-osf-web/models/external-computi
2525
import ExternalCitationServiceModel from 'ember-osf-web/models/external-citation-service';
2626
import { notifyPropertyChange } from '@ember/object';
2727
import captureException, { getApiErrorMessage } from 'ember-osf-web/utils/capture-exception';
28+
import ExternalLinkServiceModel from 'ember-osf-web/models/external-link-service';
29+
import AuthorizedLinkAccountModel from 'ember-osf-web/models/authorized-link-account';
30+
import ConfiguredLinkAddonModel from 'ember-osf-web/models/configured-link-addon';
2831

2932
export type AllProviderTypes =
3033
ExternalStorageServiceModel |
3134
ExternalComputingServiceModel |
32-
ExternalCitationServiceModel;
35+
ExternalCitationServiceModel |
36+
ExternalLinkServiceModel;
3337
export type AllAuthorizedAccountTypes =
3438
AuthorizedStorageAccountModel |
3539
AuthorizedCitationAccountModel |
36-
AuthorizedComputingAccountModel;
40+
AuthorizedComputingAccountModel |
41+
AuthorizedLinkAccountModel;
3742
export type AllConfiguredAddonTypes =
3843
ConfiguredStorageAddonModel |
3944
ConfiguredCitationAddonModel |
40-
ConfiguredComputingAddonModel;
45+
ConfiguredComputingAddonModel |
46+
ConfiguredLinkAddonModel;
4147

4248
interface ProviderTypeMapper {
4349
getAuthorizedAccounts: Task<any, any>;
@@ -82,6 +88,11 @@ export default class Provider {
8288
createAuthorizedAccount: taskFor(this.createAuthorizedCitationAccount),
8389
createConfiguredAddon: taskFor(this.createConfiguredCitationAddon),
8490
},
91+
externalLinkService: {
92+
getAuthorizedAccounts: taskFor(this.getAuthorizedLinkAccounts),
93+
createAuthorizedAccount: taskFor(this.createAuthorizedLinkAccount),
94+
createConfiguredAddon: taskFor(this.createConfiguredLinkAddon),
95+
},
8596
};
8697

8798
@tracked configuredAddon?: AllConfiguredAddonTypes;
@@ -134,6 +145,8 @@ export default class Provider {
134145
this.providerMap = this.providerTypeMapper.externalComputingService;
135146
} else if (provider instanceof ExternalCitationServiceModel) {
136147
this.providerMap = this.providerTypeMapper.externalCitationService;
148+
} else if (provider instanceof ExternalLinkServiceModel) {
149+
this.providerMap = this.providerTypeMapper.externalLinkService;
137150
}
138151
taskFor(this.initialize).perform();
139152
}
@@ -211,6 +224,14 @@ export default class Provider {
211224
.filterBy('externalComputingService.id', this.provider.id).toArray();
212225
}
213226

227+
@task
228+
@waitFor
229+
async getAuthorizedLinkAccounts() {
230+
const authorizedLinkAccounts = await this.userReference.authorizedLinkAccounts;
231+
this.authorizedAccounts = authorizedLinkAccounts
232+
.filterBy('externalLinkService.id', this.provider.id).toArray();
233+
}
234+
214235
@task
215236
@waitFor
216237
async getAuthorizedAccounts() {
@@ -278,6 +299,25 @@ export default class Provider {
278299
return newAccount;
279300
}
280301

302+
@task
303+
@waitFor
304+
private async createAuthorizedLinkAccount(arg: AccountCreationArgs) {
305+
const { credentials, apiBaseUrl, displayName, initiateOauth } = arg;
306+
const newAccount = this.store.createRecord('authorized-link-account', {
307+
credentials,
308+
apiBaseUrl,
309+
initiateOauth,
310+
externalUserId: this.currentUser.user?.id,
311+
authorizedCapabilities: ['ACCESS', 'UPDATE'],
312+
scopes: [],
313+
externalLinkService: this.provider,
314+
accountOwner: this.userReference,
315+
displayName,
316+
});
317+
await newAccount.save();
318+
return newAccount;
319+
}
320+
281321
@task
282322
@waitFor
283323
public async createAuthorizedAccount(arg: AccountCreationArgs) {
@@ -339,6 +379,22 @@ export default class Provider {
339379
return await configuredComputingAddon.save();
340380
}
341381

382+
@task
383+
@waitFor
384+
private async createConfiguredLinkAddon(account: AuthorizedComputingAccountModel) {
385+
const configuredLinkAddon = this.store.createRecord('configured-link-addon', {
386+
// rootFolder: '',
387+
externalLinkService: this.provider,
388+
accountOwner: this.userReference,
389+
// authorizedResource: this.serviceNode,
390+
authorizedResourceUri: this.node!.links.iri,
391+
baseAccount: account,
392+
connectedCapabilities: ['ACCESS', 'UPDATE'],
393+
});
394+
return await configuredLinkAddon.save();
395+
}
396+
397+
342398
@task
343399
@waitFor
344400
public async createConfiguredAddon(account: AllAuthorizedAccountTypes) {

lib/osf-components/addon/components/addons-service/manager/component.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ enum PageMode {
4444
export enum FilterTypes {
4545
STORAGE = 'additional-storage',
4646
CITATION_MANAGER = 'citation-manager',
47+
VERIFIED_LINK = 'verified-link',
4748
// CLOUD_COMPUTING = 'cloud-computing', // disabled because BOA is down
4849
}
4950

@@ -78,6 +79,12 @@ export default class AddonsServiceManagerComponent extends Component<Args> {
7879
list: A([]),
7980
configuredAddons: A([]),
8081
},
82+
[FilterTypes.VERIFIED_LINK]: {
83+
modelName: 'external-link-service',
84+
task: taskFor(this.getLinkAddonProviders),
85+
list: A([]),
86+
configuredAddons: A([]),
87+
},
8188
// [FilterTypes.CLOUD_COMPUTING]: {
8289
// modelName: 'external-computing-service',
8390
// task: taskFor(this.getComputingAddonProviders),
@@ -403,6 +410,22 @@ export default class AddonsServiceManagerComponent extends Component<Args> {
403410
activeFilterObject.list = serviceCitationProviders.sort(this.providerSorter);
404411
}
405412

413+
@task
414+
@waitFor
415+
async getLinkAddonProviders() {
416+
const activeFilterObject = this.filterTypeMapper[FilterTypes.VERIFIED_LINK];
417+
418+
if (this.addonServiceNode) {
419+
const configuredAddons = await this.addonServiceNode.configuredLinkAddons;
420+
activeFilterObject.configuredAddons = A(configuredAddons.toArray());
421+
}
422+
423+
const serviceCitationProviders: Provider[] =
424+
await taskFor(this.getExternalProviders)
425+
.perform(activeFilterObject.modelName, activeFilterObject.configuredAddons);
426+
activeFilterObject.list = serviceCitationProviders.sort(this.providerSorter);
427+
}
428+
406429
providerSorter(a: Provider, b: Provider) {
407430
return a.provider.displayName.localeCompare(b.provider.displayName);
408431
}

lib/osf-components/addon/components/addons-service/terms-of-service/component.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { ExternalServiceCapabilities } from 'ember-osf-web/models/external-servi
77
import ExternalStorageServiceModel from 'ember-osf-web/models/external-storage-service';
88
import ExternalComputingServiceModel from 'ember-osf-web/models/external-computing-service';
99
import ExternalCitationServiceModel from 'ember-osf-web/models/external-citation-service';
10+
import ExternalLinkServiceModel from 'ember-osf-web/models/external-link-service';
1011

1112
interface Args {
1213
provider: AllProviderTypes;
@@ -21,7 +22,7 @@ type CapabilityCategory =
2122
ExternalServiceCapabilities.REGISTERING |
2223
ExternalServiceCapabilities.FILE_VERSIONS;
2324

24-
type ServiceTranslationKey = 'storage' | 'computing' | 'citation';
25+
type ServiceTranslationKey = 'storage' | 'computing' | 'citation' | 'link';
2526

2627

2728
const capabilitiesToLabelKeyMap: Record<CapabilityCategory, string> = {
@@ -92,6 +93,11 @@ const capabilitiesToTextKeyMap: Record<ServiceTranslationKey, Partial<Record<Cap
9293
partial: 'addons.terms.computing.registering-partial',
9394
},
9495
},
96+
link: {
97+
[ExternalServiceCapabilities.FORKING]: {
98+
partial: 'addons.terms.computing.forking-partial',
99+
},
100+
},
95101
};
96102

97103

@@ -130,6 +136,11 @@ export default class TermsOfServiceComponent extends Component<Args> {
130136
ExternalServiceCapabilities.REGISTERING,
131137
];
132138
this.baseTranslationKey = 'citation';
139+
} else if (args.provider instanceof ExternalLinkServiceModel) {
140+
this.applicableCapabilities = [
141+
ExternalServiceCapabilities.FORKING,
142+
];
143+
this.baseTranslationKey = 'link';
133144
}
134145
}
135146

translations/en-us.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ addons:
257257
additional-storage: 'Additional Storage'
258258
citation-manager: 'Citation Manager'
259259
cloud-computing: 'Cloud Computing'
260+
verified-link: 'Linked Services'
260261
no-results: 'No results found'
261262
no-connected-accounts: 'No connected accounts'
262263
connect: 'Connect'

0 commit comments

Comments
 (0)