Skip to content

Commit

Permalink
Implement basic management component and providers
Browse files Browse the repository at this point in the history
  • Loading branch information
brianjgeiger committed Dec 11, 2023
1 parent 739c9f7 commit 8c7785c
Show file tree
Hide file tree
Showing 8 changed files with 222 additions and 1 deletion.
1 change: 1 addition & 0 deletions app/adapters/external-account.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import OsfAdapter from './osf-adapter';

export default class ExternalAccountAdapter extends OsfAdapter {
parentRelationship = 'user-addon';
}

declare module 'ember-data/types/registries/adapter' {
Expand Down
1 change: 1 addition & 0 deletions app/adapters/node-addon.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import OsfAdapter from './osf-adapter';

export default class NodeAddonAdapter extends OsfAdapter {
parentRelationship = 'node';
}

declare module 'ember-data/types/registries/adapter' {
Expand Down
1 change: 1 addition & 0 deletions app/adapters/user-addon.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import OsfAdapter from './osf-adapter';

export default class UserAddonAdapter extends OsfAdapter {
parentRelationship = 'user';
}

declare module 'ember-data/types/registries/adapter' {
Expand Down
2 changes: 1 addition & 1 deletion app/models/addon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import OsfModel from './osf-model';

export default class AddonModel extends OsfModel {
@attr('string') name!: string;
@attr('array') categories!: string[];
@attr('array') category!: string;
}

declare module 'ember-data/types/registries/model' {
Expand Down
101 changes: 101 additions & 0 deletions app/packages/addons-service/legacy-provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { inject as service } from '@ember/service';
import Store from '@ember-data/store';

import AddonModel from 'ember-osf-web/models/addon';
import ExternalAccountsModel from 'ember-osf-web/models/external-accounts';
import NodeModel from 'ember-osf-web/models/node';
import NodeAddonModel from 'ember-osf-web/models/node-addon';
import UserAddonModel from 'ember-osf-web/models/user-addon';
import CurrentUserService from 'ember-osf-web/services/current-user';

export default class LegacyProvider {
provider: AddonModel;
currentUser: CurrentUserService;
node: NodeModel;

userAddon?: UserAddonModel;
nodeAddon?: NodeAddonModel;
externalAccounts?: ExternalAccountsModel[];

@service store!: Store;


constructor(provider: AddonModel, currentUser: CurrentUserService, node: NodeModel) {
this.currentUser = currentUser;
this.node = node;
this.provider = provider;
}

async userAddonAccounts(){
if (this.userAddon){
this.externalAccounts = (await this.userAddon.externalAccounts).toArray();
return this.externalAccounts;
}
if (this.currentUser.user){
const userAddons = await this.currentUser.user.queryHasMany(
'userAddons',
{'filter[provider]': this.provider.name},
) as unknown as UserAddonModel[];
if (userAddons.length > 0){
const userAddon = userAddons[0];
this.userAddon = userAddon;
this.externalAccounts = (await userAddon.externalAccounts).toArray();
return this.externalAccounts;
}
}
this.externalAccounts = [];
return [];
}

async createAccountForNodeAddon() {
this.nodeAddon = this.store.createRecord('node-addon', {
node: this.node,
provider: this.provider,
});
await this.nodeAddon?.save();
}

async setNodeAddonCredentials(externalAccount: ExternalAccountsModel) {
if (!this.nodeAddon) {
this.nodeAddon = await this.node.queryHasMany(
'nodeAddons',
{'filter[provider]': this.provider.name},
) as unknown as NodeAddonModel;
}
this.nodeAddon.set('externalAccount', externalAccount);
await this.nodeAddon.save();

return undefined;
}

async disableProjectAddon() {
if (!this.nodeAddon) {
this.nodeAddon = await this.node.queryHasMany(
'nodeAddons',
{'filter[provider]': this.provider.name},
) as unknown as NodeAddonModel;
}
this.nodeAddon.deleteRecord();
await this.nodeAddon.save();

return undefined;
}

listOfFolders() {
return;
}

async setRootFolder(rootFolder: string) {
if (!this.nodeAddon) {
this.nodeAddon = await this.node.queryHasMany(
'nodeAddons',
{'filter[provider]': this.provider.name},
) as unknown as NodeAddonModel;
}
this.nodeAddon.set('folderPath', rootFolder);
await this.nodeAddon.save();

return undefined;
}

}
53 changes: 53 additions & 0 deletions app/packages/addons-service/provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { getOwner, setOwner } from '@ember/application';
import { inject as service } from '@ember/service';
import Store from '@ember-data/store';
import { tracked } from '@glimmer/tracking';

import NodeModel from 'ember-osf-web/models/node';
import CurrentUserService from 'ember-osf-web/services/current-user';
import InternalUserModel from 'ember-osf-web/models/internal-user';

export default class Provider {
@tracked node: NodeModel;
currentUser: CurrentUserService;
internalUser!: InternalUserModel;
provider: any; // TODO: Fix this

@service store!: Store;

constructor(provider: any, currentUser: CurrentUserService, node: NodeModel) {
setOwner(this, getOwner(node));
this.node = node;
this.currentUser = currentUser;
this.getInternalUser();
this.provider = provider;
}

async getInternalUser() {
this.internalUser = await this.store.findRecord('internal-user', this.currentUser.user?.id);
}

async userAddonAccounts() {
return await this.internalUser.authorizedStorageAccounts;
}

createAccountForNodeAddon() {
return;
}

disableProjectAddon() {
return;
}

listOfFolders() {
return;
}

setNodeAddonCredentials() {
return;
}

setRootFolder() {
return;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { inject as service } from '@ember/service';
import { waitFor } from '@ember/test-waiters';
import Store from '@ember-data/store';
import Component from '@glimmer/component';
import { task } from 'ember-concurrency';

import NodeModel from 'ember-osf-web/models/node';
import LegacyProvider from 'ember-osf-web/packages/addons-service/legacy-provider';
import Provider from 'ember-osf-web/packages/addons-service/provider';
import CurrentUserService from 'ember-osf-web/services/current-user';

interface Args {
node: NodeModel;
}

export default class AddonsServiceManagerComponent extends Component<Args> {
@service store!: Store;
@service currentUser!: CurrentUserService;

node = this.args.node;

@task
@waitFor
async addonProviders(): Promise<(Array<LegacyProvider | Provider>)> {
const legacyProviders: LegacyProvider[] = await this.legacyProviders();
const serviceStorageProviders: Provider[] = this.serviceStorageProviders();

return [...legacyProviders, ...serviceStorageProviders]
.sort(this.providerSorter);
}

providerSorter(a: Provider, b: Provider) {
return a.provider.name.localeCompare(b.provider.name);
}

// V2 API Methods

@task
@waitFor
async legacyProviders() {
const addons = await this.store.findAll('addon');
const legacyAddons = [] as LegacyProvider[];
for (const addon of addons) {
legacyAddons.addObject(new LegacyProvider(addon, this.currentUser, this.node));
}
return addons;
}

legacyProjectEnabledAddons() {
// TODO: This will probably have to be abstracted out in the same way Providers are
return this.node.nodeAddons.toArray();
}

// Service API Methods

serviceStorageProviders() {
return [];
}

serviceProjectEnabledAddons() {
return;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from 'osf-components/components/addons-service/manager/component';

0 comments on commit 8c7785c

Please sign in to comment.