feat(api): add accepting invites by the client
This commit is contained in:
@@ -2,4 +2,5 @@ export enum SubscriptionApiOperations {
|
|||||||
Inviting,
|
Inviting,
|
||||||
CancelingInvite,
|
CancelingInvite,
|
||||||
ListingInvites,
|
ListingInvites,
|
||||||
|
AcceptingInvite,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Invitation } from '@standardnotes/models'
|
import { Invitation } from '@standardnotes/models'
|
||||||
|
|
||||||
|
import { SubscriptionInviteAcceptResponse } from '../../Response/Subscription/SubscriptionInviteAcceptResponse'
|
||||||
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
|
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
|
||||||
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
|
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
|
||||||
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
|
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
|
||||||
@@ -24,6 +25,9 @@ describe('SubscriptionApiService', () => {
|
|||||||
subscriptionServer.listInvites = jest.fn().mockReturnValue({
|
subscriptionServer.listInvites = jest.fn().mockReturnValue({
|
||||||
data: { invitations: [{} as jest.Mocked<Invitation>] },
|
data: { invitations: [{} as jest.Mocked<Invitation>] },
|
||||||
} as jest.Mocked<SubscriptionInviteListResponse>)
|
} as jest.Mocked<SubscriptionInviteListResponse>)
|
||||||
|
subscriptionServer.acceptInvite = jest.fn().mockReturnValue({
|
||||||
|
data: { success: true },
|
||||||
|
} as jest.Mocked<SubscriptionInviteAcceptResponse>)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should invite a user', async () => {
|
it('should invite a user', async () => {
|
||||||
@@ -160,4 +164,48 @@ describe('SubscriptionApiService', () => {
|
|||||||
|
|
||||||
expect(error).not.toBeNull()
|
expect(error).not.toBeNull()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should accept an invite', async () => {
|
||||||
|
const response = await createService().acceptInvite('1-2-3')
|
||||||
|
|
||||||
|
expect(response).toEqual({
|
||||||
|
data: {
|
||||||
|
success: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
expect(subscriptionServer.acceptInvite).toHaveBeenCalledWith({
|
||||||
|
inviteUuid: '1-2-3',
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not accept an invite if it is already accepting', async () => {
|
||||||
|
const service = createService()
|
||||||
|
Object.defineProperty(service, 'operationsInProgress', {
|
||||||
|
get: () => new Map([[SubscriptionApiOperations.AcceptingInvite, true]]),
|
||||||
|
})
|
||||||
|
|
||||||
|
let error = null
|
||||||
|
try {
|
||||||
|
await service.acceptInvite('1-2-3')
|
||||||
|
} catch (caughtError) {
|
||||||
|
error = caughtError
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(error).not.toBeNull()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not accept an invite if the server fails', async () => {
|
||||||
|
subscriptionServer.acceptInvite = jest.fn().mockImplementation(() => {
|
||||||
|
throw new Error('Oops')
|
||||||
|
})
|
||||||
|
|
||||||
|
let error = null
|
||||||
|
try {
|
||||||
|
await createService().acceptInvite('1-2-3')
|
||||||
|
} catch (caughtError) {
|
||||||
|
error = caughtError
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(error).not.toBeNull()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ import { SubscriptionServerInterface } from '../../Server/Subscription/Subscript
|
|||||||
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
|
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
|
||||||
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
|
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
|
||||||
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
|
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
|
||||||
|
import { SubscriptionInviteAcceptResponse } from '../../Response/Subscription/SubscriptionInviteAcceptResponse'
|
||||||
|
|
||||||
import { SubscriptionApiServiceInterface } from './SubscriptionApiServiceInterface'
|
import { SubscriptionApiServiceInterface } from './SubscriptionApiServiceInterface'
|
||||||
import { SubscriptionApiOperations } from './SubscriptionApiOperations'
|
import { SubscriptionApiOperations } from './SubscriptionApiOperations'
|
||||||
|
import { Uuid } from '@standardnotes/common'
|
||||||
|
|
||||||
export class SubscriptionApiService implements SubscriptionApiServiceInterface {
|
export class SubscriptionApiService implements SubscriptionApiServiceInterface {
|
||||||
private operationsInProgress: Map<SubscriptionApiOperations, boolean>
|
private operationsInProgress: Map<SubscriptionApiOperations, boolean>
|
||||||
@@ -78,4 +80,24 @@ export class SubscriptionApiService implements SubscriptionApiServiceInterface {
|
|||||||
throw new ApiCallError(ErrorMessage.GenericFail)
|
throw new ApiCallError(ErrorMessage.GenericFail)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async acceptInvite(inviteUuid: Uuid): Promise<SubscriptionInviteAcceptResponse> {
|
||||||
|
if (this.operationsInProgress.get(SubscriptionApiOperations.AcceptingInvite)) {
|
||||||
|
throw new ApiCallError(ErrorMessage.GenericInProgress)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.operationsInProgress.set(SubscriptionApiOperations.AcceptingInvite, true)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await this.subscriptionServer.acceptInvite({
|
||||||
|
inviteUuid,
|
||||||
|
})
|
||||||
|
|
||||||
|
this.operationsInProgress.set(SubscriptionApiOperations.AcceptingInvite, false)
|
||||||
|
|
||||||
|
return response
|
||||||
|
} catch (error) {
|
||||||
|
throw new ApiCallError(ErrorMessage.GenericFail)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Uuid } from '@standardnotes/common'
|
import { Uuid } from '@standardnotes/common'
|
||||||
|
|
||||||
|
import { SubscriptionInviteAcceptResponse } from '../../Response/Subscription/SubscriptionInviteAcceptResponse'
|
||||||
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
|
import { SubscriptionInviteCancelResponse } from '../../Response/Subscription/SubscriptionInviteCancelResponse'
|
||||||
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
|
import { SubscriptionInviteListResponse } from '../../Response/Subscription/SubscriptionInviteListResponse'
|
||||||
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
|
import { SubscriptionInviteResponse } from '../../Response/Subscription/SubscriptionInviteResponse'
|
||||||
@@ -8,4 +9,5 @@ export interface SubscriptionApiServiceInterface {
|
|||||||
invite(inviteeEmail: string): Promise<SubscriptionInviteResponse>
|
invite(inviteeEmail: string): Promise<SubscriptionInviteResponse>
|
||||||
listInvites(): Promise<SubscriptionInviteListResponse>
|
listInvites(): Promise<SubscriptionInviteListResponse>
|
||||||
cancelInvite(inviteUuid: Uuid): Promise<SubscriptionInviteCancelResponse>
|
cancelInvite(inviteUuid: Uuid): Promise<SubscriptionInviteCancelResponse>
|
||||||
|
acceptInvite(inviteUuid: Uuid): Promise<SubscriptionInviteAcceptResponse>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
import { Uuid } from '@standardnotes/common'
|
import { Uuid } from '@standardnotes/common'
|
||||||
|
|
||||||
import { ApiEndpointParam } from '../ApiEndpointParam'
|
|
||||||
import { ApiVersion } from '../../Api/ApiVersion'
|
|
||||||
|
|
||||||
export type SubscriptionInviteAcceptRequestParams = {
|
export type SubscriptionInviteAcceptRequestParams = {
|
||||||
[ApiEndpointParam.ApiVersion]: ApiVersion.v0
|
|
||||||
inviteUuid: Uuid
|
inviteUuid: Uuid
|
||||||
[additionalParam: string]: unknown
|
[additionalParam: string]: unknown
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
export type SubscriptionInviteAcceptResponseBody = {
|
import { Either } from '@standardnotes/common'
|
||||||
success: boolean
|
|
||||||
}
|
export type SubscriptionInviteAcceptResponseBody = Either<{ success: true }, { success: false; message: string }>
|
||||||
|
|||||||
Reference in New Issue
Block a user