information.ts
1 import type { BankCode } from "~/definitions/bank-code"; 2 3 import type { ClientUserRole } from "~/definitions/client-user-role"; 4 import type { ClientUserStatus } from "~/definitions/client-user-status"; 5 import type { Error as ServerError } from "~/definitions/error"; 6 7 import type { LimitMoneyIn } from "~/definitions/limit-money-in"; 8 import type { UP } from "~/definitions/up"; 9 import { defaultFetcher, type Fetcher, type Request } from "@literate.ink/utilities"; 10 import { CLIENT_TYPE, createRouteREST, SERVICE_VERSION } from "~/core/constants"; 11 import { decodeBalance } from "~/decoders/balance"; 12 import { type Configuration, type Identification, type Profile, ReauthenticateError } from "~/models"; 13 14 // eslint-disable-next-line ts/explicit-function-return-type 15 export const information = async (identification: Identification, fetcher: Fetcher = defaultFetcher) => { 16 const request: Request = { 17 headers: { 18 Authorization: `Bearer ${identification.accessToken}`, 19 channel: "AIZ", 20 clientVersion: SERVICE_VERSION, 21 format: "T", 22 language: "fr", 23 model: "A", 24 smoneyClientType: CLIENT_TYPE, 25 userId: identification.identifier, 26 version: "2.0" 27 }, 28 url: createRouteREST("GetLogonInfos") 29 }; 30 31 const response = await fetcher(request); 32 const json = JSON.parse(response.content) as ServerError | { 33 GetLogonInfosResult: { 34 Result: { 35 Age: number; 36 Alias: string; 37 Banks: Array<BankCode>; 38 CategoryUserId: number; 39 Crous: string; 40 CrousName: string; 41 Currency: string; 42 Email: string; 43 FirstName: string; 44 HasNewActu: boolean; 45 LastName: string; 46 LimitMoneyIn: LimitMoneyIn; 47 LimitMoneyOut: LimitMoneyIn; 48 LimitPayment: LimitMoneyIn; 49 LimitPaymentPart: LimitMoneyIn; 50 OptIn: boolean; 51 OptInPartners: boolean; 52 Role: ClientUserRole; 53 Services: string[]; // NOTE: "Izly" is the only value I've seen 54 ServicesInfos: null | unknown; // TODO 55 SubscriptionDate: string; 56 TarifUserId: number; 57 TermsConditionsAgreementDate: string; 58 Token: string; 59 UserId: number; 60 UserIdentifier: string; 61 UserStatus: ClientUserStatus; 62 ZipCode: string; 63 }; 64 65 UP: UP; 66 }; 67 }; 68 69 if ("ErrorMessage" in json) { 70 if (json.Code === 140 || json.Code === 570) 71 throw new ReauthenticateError(); 72 73 throw new Error(`${json.ErrorMessage} (${json.Code})`); 74 } 75 76 const data = json.GetLogonInfosResult.Result; 77 78 return { 79 balance: decodeBalance(json.GetLogonInfosResult.UP), 80 81 configuration: { 82 currency: data.Currency, 83 moneyInMaximum: data.LimitMoneyIn.Max, 84 moneyInMinimum: data.LimitMoneyIn.Min, 85 moneyOutMaximum: data.LimitMoneyOut.Max, 86 moneyOutMinimum: data.LimitMoneyOut.Min, 87 paymentMaximum: data.LimitPayment.Max, 88 paymentMinimum: data.LimitPayment.Min, 89 paymentPartMaximum: data.LimitPaymentPart.Max, 90 paymentPartMinimum: data.LimitPaymentPart.Min 91 } as Configuration, 92 93 profile: { 94 email: data.Email, 95 firstName: data.FirstName, 96 identifier: data.UserIdentifier, 97 lastName: data.LastName 98 } as Profile 99 }; 100 };