/ src / api / information.ts
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  };