Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / api / members.ts
blob05c9001e53688ff9d495a4d15c9dfbca85e0e897
1 import type { Address, Api, Member, SignedKeyList } from '../interfaces';
2 import type { UnprivatizeMemberResult } from '../keys/unprivatization';
3 import queryPages from './helpers/queryPages';
4 import type { PaginationParams } from './interface';
6 export const queryMembers = (params?: PaginationParams) => ({
7     method: 'get',
8     url: 'core/v4/members',
9     params: {
10         ...params,
11         IncludeAddresses: 1,
12     },
13 });
15 export const getAllMembers = (api: Api) => {
16     return queryPages((Page, PageSize) => {
17         return api<{ Members: Member[]; Total: number }>(
18             queryMembers({
19                 Page,
20                 PageSize,
21             })
22         );
23     }).then((pages) => {
24         return pages.flatMap(({ Members }) => Members);
25     });
28 export const getMember = (memberID: string) => ({
29     method: 'get',
30     url: `core/v4/members/${memberID}`,
31 });
33 export const getSelfMember = () => ({
34     method: 'get',
35     url: 'core/v4/members/me',
36 });
38 export const queryAddresses = (memberID: string, params?: PaginationParams) => ({
39     method: 'get',
40     url: `core/v4/members/${memberID}/addresses`,
41     params,
42 });
44 export const getAllMemberAddresses = (api: Api, memberID: string) => {
45     return queryPages((page, pageSize) => {
46         return api<{ Addresses: Address[]; Total: number }>(
47             queryAddresses(memberID, {
48                 Page: page,
49                 PageSize: pageSize,
50             })
51         );
52     }).then((pages) => {
53         return pages.flatMap(({ Addresses = [] }) => Addresses);
54     });
57 interface MemberPayload {
58     Name: string;
59     Private: number;
60     MaxSpace: number;
61     MaxVPN: number;
62     MaxAI: number;
65 interface UnprivatizationInvitation {
66     Email: string;
67     Data: string;
68     Signature: string;
69     PrivateIntent: boolean;
72 interface InviteMemberPayload extends Omit<MemberPayload, 'Private'> {
73     Invitation: UnprivatizationInvitation;
76 export const createMember = (data: MemberPayload | InviteMemberPayload) => ({
77     method: 'post',
78     url: 'core/v4/members',
79     data,
80 });
82 export const queryMemberUnprivatizationInfo = () => ({
83     method: 'get',
84     url: `core/v4/members/me/unprivatize`,
85 });
86 export const acceptMemberUnprivatizationInfo = (data: { OrgUserKeys: string[]; OrgActivationToken: string }) => ({
87     method: 'post',
88     url: `core/v4/members/me/unprivatize`,
89     data,
90 });
92 export const deleteMemberUnprivatizationInfo = () => ({
93     method: 'delete',
94     url: `core/v4/members/me/unprivatize`,
95 });
97 export const unprivatizeMemberKeysRoute = (memberID: string, data: UnprivatizeMemberResult) => ({
98     method: 'post',
99     url: `core/v4/members/${memberID}/keys/unprivatize`,
100     data,
103 export const checkMemberAddressAvailability = (data: { Local: string; Domain: string }) => ({
104     method: 'post',
105     url: `core/v4/members/addresses/available`,
106     data,
109 export const createMemberAddress = (memberID: string, data: { Local: string; Domain: string }) => ({
110     method: 'post',
111     url: `core/v4/members/${memberID}/addresses`,
112     data,
115 export const updateName = (memberID: string, Name: string) => ({
116     method: 'put',
117     url: `core/v4/members/${memberID}/name`,
118     data: { Name },
121 export const updateQuota = (memberID: string, MaxSpace: number) => ({
122     method: 'put',
123     url: `core/v4/members/${memberID}/quota`,
124     data: { MaxSpace },
127 export const updateRole = (memberID: string, Role: number) => ({
128     method: 'put',
129     url: `core/v4/members/${memberID}/role`,
130     data: { Role },
133 export const activatePasswordlessKey = (data: { TokenKeyPacket: string; Signature: string }) => ({
134     method: 'put',
135     url: `core/v4/organizations/keys/activate`,
136     data,
139 export const updateRolePasswordless = ({
140     memberID,
141     ...data
142 }: {
143     memberID: string;
144     Role: number;
145 } & (
146     | {
147           OrganizationKeyActivation: { TokenKeyPacket: string; Signature: string };
148       }
149     | {
150           OrganizationKeyInvitation: {
151               TokenKeyPacket: string;
152               Signature: string;
153               SignatureAddressID: string;
154               EncryptionAddressID: string;
155           };
156       }
157 )) => ({
158     method: 'put',
159     url: `core/v4/members/${memberID}/role`,
160     data,
163 export const updateVPN = (memberID: string, MaxVPN: number) => ({
164     method: 'put',
165     url: `core/v4/members/${memberID}/vpn`,
166     data: { MaxVPN },
169 export const updateAI = (memberID: string, MaxAI: number) => ({
170     method: 'put',
171     url: `core/v4/members/${memberID}/ai`,
172     data: { MaxAI },
175 export interface RequestMemberUnprivatizationInput {
176     InvitationData: string;
177     InvitationSignature: string;
180 export const requestUnprivatization = (memberID: string, data: RequestMemberUnprivatizationInput) => ({
181     method: 'post',
182     url: `core/v4/members/${memberID}/unprivatize`,
183     data,
186 export const deleteUnprivatizationRequest = (memberID: string) => ({
187     method: 'delete',
188     url: `core/v4/members/${memberID}/unprivatize`,
191 export const resendUnprivatizationLink = (memberID: string) => ({
192     method: 'post',
193     url: `core/v4/members/${memberID}/unprivatize/resend`,
196 export const privatizeMember = (memberID: string) => ({
197     method: 'put',
198     url: `core/v4/members/${memberID}/privatize`,
201 export const authMember = (memberID: string, data: { Unlock?: boolean } = {}) => ({
202     method: 'post',
203     url: `core/v4/members/${memberID}/auth`,
204     data,
207 export const inviteMember = (email: string, maxSpace: number) => ({
208     url: `core/v4/members/invitations`,
209     method: 'post',
210     data: {
211         Email: email,
212         MaxSpace: maxSpace,
213     },
216 export const deleteMember = (memberId: string) => ({
217     url: `core/v4/members/${memberId}`,
218     method: 'delete',
221 export const removeSSOSamlMember = (memberID: string) => ({
222     url: `core/v4/members/${memberID}/saml`,
223     method: 'delete',
226 export const addSSOSamlMember = (memberID: string) => ({
227     url: `core/v4/members/${memberID}/saml`,
228     method: 'post',
231 export const editMemberInvitation = (memberID: string, maxSpace: number) => ({
232     method: 'put',
233     url: `core/v4/members/invitations/${memberID}`,
234     data: {
235         MaxSpace: maxSpace,
236     },
239 export const updateAddressFlags = (
240     addressID: string,
241     Encrypt: boolean,
242     Sign: boolean,
243     SignedKeyList: SignedKeyList
244 ) => ({
245     method: 'put',
246     url: `core/v4/addresses/${addressID}/encryption`,
247     data: {
248         Encrypt: Encrypt ? 1 : 0,
249         Sign: Sign ? 1 : 0,
250         SignedKeyList,
251     },