1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-11-30 13:03:53 +01:00

apis for groups and collections

This commit is contained in:
Kyle Spearrin 2018-07-06 12:40:43 -04:00
parent 4ae4b667ff
commit 2a526940fd
12 changed files with 198 additions and 9 deletions

View File

@ -1,4 +1,4 @@
import { CollectionResponse } from '../response/collectionResponse'; import { CollectionDetailsResponse } from '../response/collectionResponse';
export class CollectionData { export class CollectionData {
id: string; id: string;
@ -6,7 +6,7 @@ export class CollectionData {
name: string; name: string;
readOnly: boolean; readOnly: boolean;
constructor(response: CollectionResponse) { constructor(response: CollectionDetailsResponse) {
this.id = response.id; this.id = response.id;
this.organizationId = response.organizationId; this.organizationId = response.organizationId;
this.name = response.name; this.name = response.name;

View File

@ -1,7 +1,10 @@
import { Collection } from '../domain/collection'; import { Collection } from '../domain/collection';
import { SelectionReadOnlyRequest } from './selectionReadOnlyRequest';
export class CollectionRequest { export class CollectionRequest {
name: string; name: string;
groups: SelectionReadOnlyRequest[] = [];
constructor(collection: Collection) { constructor(collection: Collection) {
this.name = collection.name ? collection.name.encryptedString : null; this.name = collection.name ? collection.name.encryptedString : null;

View File

@ -0,0 +1,8 @@
import { SelectionReadOnlyRequest } from './selectionReadOnlyRequest';
export class GroupRequest {
name: string;
accessAll: boolean;
externalId: string;
collections: SelectionReadOnlyRequest[] = [];
}

View File

@ -0,0 +1,9 @@
export class SelectionReadOnlyRequest {
id: string;
readOnly: boolean;
constructor(id: string, readOnly: boolean) {
this.id = id;
this.readOnly = readOnly;
}
}

View File

@ -1,13 +1,33 @@
import { SelectionReadOnlyResponse } from './selectionReadOnlyResponse';
export class CollectionResponse { export class CollectionResponse {
id: string; id: string;
organizationId: string; organizationId: string;
name: string; name: string;
readOnly: boolean;
constructor(response: any) { constructor(response: any) {
this.id = response.Id; this.id = response.Id;
this.organizationId = response.OrganizationId; this.organizationId = response.OrganizationId;
this.name = response.Name; this.name = response.Name;
}
}
export class CollectionDetailsResponse extends CollectionResponse {
readOnly: boolean;
constructor(response: any) {
super(response);
this.readOnly = response.ReadOnly || false; this.readOnly = response.ReadOnly || false;
} }
} }
export class CollectionGroupDetailsResponse extends CollectionResponse {
groups: SelectionReadOnlyResponse[] = [];
constructor(response: any) {
super(response);
if (response.Groups != null) {
this.groups = response.Collections.map((g: any) => new SelectionReadOnlyResponse(g));
}
}
}

View File

@ -0,0 +1,22 @@
import { OrganizationUserStatusType } from '../../enums/organizationUserStatusType';
import { OrganizationUserType } from '../../enums/organizationUserType';
export class CollectionUserResponse {
organizationUserId: string;
accessAll: boolean;
name: string;
email: string;
type: OrganizationUserType;
status: OrganizationUserStatusType;
readOnly: boolean;
constructor(response: any) {
this.organizationUserId = response.OrganizationUserId;
this.accessAll = response.AccessAll;
this.name = response.Name;
this.email = response.Email;
this.type = response.Type;
this.status = response.Status;
this.readOnly = response.ReadOnly;
}
}

View File

@ -0,0 +1,28 @@
import { SelectionReadOnlyResponse } from './selectionReadOnlyResponse';
export class GroupResponse {
id: string;
organizationId: string;
name: string;
accessAll: boolean;
externalId: string;
constructor(response: any) {
this.id = response.Id;
this.organizationId = response.OrganizationId;
this.name = response.Name;
this.accessAll = response.AccessAll;
this.externalId = response.ExternalId;
}
}
export class GroupDetailsResponse extends GroupResponse {
collections: SelectionReadOnlyResponse[] = [];
constructor(response: any) {
super(response);
if (response.Collections != null) {
this.collections = response.Collections.map((c: any) => new SelectionReadOnlyResponse(c));
}
}
}

View File

@ -0,0 +1,20 @@
import { OrganizationUserStatusType } from '../../enums/organizationUserStatusType';
import { OrganizationUserType } from '../../enums/organizationUserType';
export class GroupUserResponse {
organizationUserId: string;
accessAll: boolean;
name: string;
email: string;
type: OrganizationUserType;
status: OrganizationUserStatusType;
constructor(response: any) {
this.organizationUserId = response.OrganizationUserId;
this.accessAll = response.AccessAll;
this.name = response.Name;
this.email = response.Email;
this.type = response.Type;
this.status = response.Status;
}
}

View File

@ -0,0 +1,9 @@
export class SelectionReadOnlyResponse {
id: string;
readOnly: boolean;
constructor(response: any) {
this.id = response.Id;
this.readOnly = response.ReadOnly;
}
}

View File

@ -1,5 +1,5 @@
import { CipherResponse } from './cipherResponse'; import { CipherResponse } from './cipherResponse';
import { CollectionResponse } from './collectionResponse'; import { CollectionDetailsResponse } from './collectionResponse';
import { DomainsResponse } from './domainsResponse'; import { DomainsResponse } from './domainsResponse';
import { FolderResponse } from './folderResponse'; import { FolderResponse } from './folderResponse';
import { ProfileResponse } from './profileResponse'; import { ProfileResponse } from './profileResponse';
@ -7,7 +7,7 @@ import { ProfileResponse } from './profileResponse';
export class SyncResponse { export class SyncResponse {
profile?: ProfileResponse; profile?: ProfileResponse;
folders: FolderResponse[] = []; folders: FolderResponse[] = [];
collections: CollectionResponse[] = []; collections: CollectionDetailsResponse[] = [];
ciphers: CipherResponse[] = []; ciphers: CipherResponse[] = [];
domains?: DomainsResponse; domains?: DomainsResponse;
@ -24,7 +24,7 @@ export class SyncResponse {
if (response.Collections) { if (response.Collections) {
response.Collections.forEach((collection: any) => { response.Collections.forEach((collection: any) => {
this.collections.push(new CollectionResponse(collection)); this.collections.push(new CollectionDetailsResponse(collection));
}); });
} }

View File

@ -12,9 +12,11 @@ import { CipherBulkShareRequest } from '../models/request/cipherBulkShareRequest
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest'; import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
import { CipherRequest } from '../models/request/cipherRequest'; import { CipherRequest } from '../models/request/cipherRequest';
import { CipherShareRequest } from '../models/request/cipherShareRequest'; import { CipherShareRequest } from '../models/request/cipherShareRequest';
import { CollectionRequest } from '../models/request/collectionRequest';
import { EmailRequest } from '../models/request/emailRequest'; import { EmailRequest } from '../models/request/emailRequest';
import { EmailTokenRequest } from '../models/request/emailTokenRequest'; import { EmailTokenRequest } from '../models/request/emailTokenRequest';
import { FolderRequest } from '../models/request/folderRequest'; import { FolderRequest } from '../models/request/folderRequest';
import { GroupRequest } from '../models/request/groupRequest';
import { ImportCiphersRequest } from '../models/request/importCiphersRequest'; import { ImportCiphersRequest } from '../models/request/importCiphersRequest';
import { ImportDirectoryRequest } from '../models/request/importDirectoryRequest'; import { ImportDirectoryRequest } from '../models/request/importDirectoryRequest';
import { ImportOrganizationCiphersRequest } from '../models/request/importOrganizationCiphersRequest'; import { ImportOrganizationCiphersRequest } from '../models/request/importOrganizationCiphersRequest';
@ -40,10 +42,19 @@ import { UpdateTwoFactorYubioOtpRequest } from '../models/request/updateTwoFacto
import { BillingResponse } from '../models/response/billingResponse'; import { BillingResponse } from '../models/response/billingResponse';
import { CipherResponse } from '../models/response/cipherResponse'; import { CipherResponse } from '../models/response/cipherResponse';
import { CollectionResponse } from '../models/response/collectionResponse'; import {
CollectionGroupDetailsResponse,
CollectionResponse,
} from '../models/response/collectionResponse';
import { CollectionUserResponse } from '../models/response/collectionUserResponse';
import { DomainsResponse } from '../models/response/domainsResponse'; import { DomainsResponse } from '../models/response/domainsResponse';
import { ErrorResponse } from '../models/response/errorResponse'; import { ErrorResponse } from '../models/response/errorResponse';
import { FolderResponse } from '../models/response/folderResponse'; import { FolderResponse } from '../models/response/folderResponse';
import {
GroupDetailsResponse,
GroupResponse,
} from '../models/response/groupResponse';
import { GroupUserResponse } from '../models/response/groupUserResponse';
import { IdentityTokenResponse } from '../models/response/identityTokenResponse'; import { IdentityTokenResponse } from '../models/response/identityTokenResponse';
import { IdentityTwoFactorResponse } from '../models/response/identityTwoFactorResponse'; import { IdentityTwoFactorResponse } from '../models/response/identityTwoFactorResponse';
import { ListResponse } from '../models/response/listResponse'; import { ListResponse } from '../models/response/listResponse';
@ -350,11 +361,70 @@ export class ApiService implements ApiServiceAbstraction {
// Collections APIs // Collections APIs
async getCollectionDetails(organizationId: string, id: string): Promise<CollectionGroupDetailsResponse> {
const r = await this.send('GET', '/organizations/' + organizationId + '/collections/' + id + '/details',
null, true, true);
return new CollectionGroupDetailsResponse(r);
}
async getCollections(organizationId: string): Promise<ListResponse<CollectionResponse>> { async getCollections(organizationId: string): Promise<ListResponse<CollectionResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/collections', null, true, true); const r = await this.send('GET', '/organizations/' + organizationId + '/collections', null, true, true);
return new ListResponse(r, CollectionResponse); return new ListResponse(r, CollectionResponse);
} }
async getCollectionUsers(organizationId: string, id: string): Promise<ListResponse<CollectionUserResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/collections/' + id + '/users',
null, true, true);
return new ListResponse(r, CollectionUserResponse);
}
async postCollection(request: CollectionRequest): Promise<CollectionResponse> {
const r = await this.send('POST', '/collections', request, true, true);
return new CollectionResponse(r);
}
async putCollection(id: string, request: CollectionRequest): Promise<CollectionResponse> {
const r = await this.send('PUT', '/collections/' + id, request, true, true);
return new CollectionResponse(r);
}
deleteCollection(id: string): Promise<any> {
return this.send('DELETE', '/collections/' + id, null, true, false);
}
// Groups APIs
async getGroupDetails(organizationId: string, id: string): Promise<GroupDetailsResponse> {
const r = await this.send('GET', '/organizations/' + organizationId + '/groups/' + id + '/details',
null, true, true);
return new GroupDetailsResponse(r);
}
async getGroups(organizationId: string): Promise<ListResponse<GroupResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/groups', null, true, true);
return new ListResponse(r, GroupResponse);
}
async getGroupUsers(organizationId: string, id: string): Promise<ListResponse<GroupUserResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/groups/' + id + '/users',
null, true, true);
return new ListResponse(r, GroupUserResponse);
}
async postGroup(request: GroupRequest): Promise<GroupResponse> {
const r = await this.send('POST', '/groups', request, true, true);
return new GroupResponse(r);
}
async putGroup(id: string, request: GroupRequest): Promise<GroupResponse> {
const r = await this.send('PUT', '/groups/' + id, request, true, true);
return new GroupResponse(r);
}
deleteGroup(id: string): Promise<any> {
return this.send('DELETE', '/groups/' + id, null, true, false);
}
// Sync APIs // Sync APIs
async getSync(): Promise<SyncResponse> { async getSync(): Promise<SyncResponse> {

View File

@ -15,7 +15,7 @@ import { FolderData } from '../models/data/folderData';
import { OrganizationData } from '../models/data/organizationData'; import { OrganizationData } from '../models/data/organizationData';
import { CipherResponse } from '../models/response/cipherResponse'; import { CipherResponse } from '../models/response/cipherResponse';
import { CollectionResponse } from '../models/response/collectionResponse'; import { CollectionDetailsResponse } from '../models/response/collectionResponse';
import { DomainsResponse } from '../models/response/domainsResponse'; import { DomainsResponse } from '../models/response/domainsResponse';
import { FolderResponse } from '../models/response/folderResponse'; import { FolderResponse } from '../models/response/folderResponse';
import { ProfileResponse } from '../models/response/profileResponse'; import { ProfileResponse } from '../models/response/profileResponse';
@ -162,7 +162,7 @@ export class SyncService implements SyncServiceAbstraction {
return await this.folderService.replace(folders); return await this.folderService.replace(folders);
} }
private async syncCollections(response: CollectionResponse[]) { private async syncCollections(response: CollectionDetailsResponse[]) {
const collections: { [id: string]: CollectionData; } = {}; const collections: { [id: string]: CollectionData; } = {};
response.forEach((c) => { response.forEach((c) => {
collections[c.id] = new CollectionData(c); collections[c.id] = new CollectionData(c);