amaurymartiny/shoot-i-smoke

View on GitHub
App/util/axios.ts

Summary

Maintainability
C
1 day
Test Coverage
// Shoot! I Smoke
// Copyright (C) 2018-2023  Marcelo S. Coelho, Amaury M.

// Shoot! I Smoke is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Shoot! I Smoke is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Shoot! I Smoke.  If not, see <http://www.gnu.org/licenses/>.

import axios, { AxiosError } from 'axios';
import type { IUser, MongoUser } from '@shootismoke/ui';
import Constants from 'expo-constants';

const axiosConfig = {
    headers: {
        'x-shootismoke-secret': Constants.expoConfig?.extra
            ?.backendSecret as string,
    },
};

export function createUser(user: IUser): Promise<MongoUser> {
    console.log(`[Axios]: POST /api/users, body=${JSON.stringify(user)}`);

    return axios
        .post<MongoUser>(
            `${Constants.expoConfig?.extra?.backendUrl as string}/api/users`,
            user,
            axiosConfig
        )
        .then(({ data }) => data)
        .catch((err) => {
            throw axiosErrorToError(err as AxiosError);
        });
}

/**
 * Get user by expoPushToken.
 *
 * @param expoPushToken - The Expo push token.
 */
export function getUser(expoPushToken: string): Promise<MongoUser> {
    console.log(`[Axios]: GET /api/users/expoPushToken/${expoPushToken}`);

    return axios
        .get<MongoUser>(
            `${
                Constants.expoConfig?.extra?.backendUrl as string
            }/api/users/expoPushToken/${expoPushToken}`,
            axiosConfig
        )
        .then(({ data }) => data)
        .catch((err) => {
            throw axiosErrorToError(err as AxiosError);
        });
}

export function updateUser(
    userId: string,
    user: Partial<IUser>
): Promise<MongoUser> {
    console.log(
        `[Axios]: PATCH /api/users/${userId}, body=${JSON.stringify(user)}`
    );

    return axios
        .patch<MongoUser>(
            `${
                Constants.expoConfig?.extra?.backendUrl as string
            }/api/users/${userId}`,
            user,
            axiosConfig
        )
        .then(({ data }) => data)
        .catch((err) => {
            throw axiosErrorToError(err as AxiosError);
        });
}

export function deleteUser(userId: string): Promise<MongoUser> {
    console.log(`[Axios]: DELETE /api/users/${userId}`);

    return axios
        .delete<MongoUser>(
            `${
                Constants.expoConfig?.extra?.backendUrl as string
            }/api/users/${userId}`,
            axiosConfig
        )
        .then(({ data }) => data)
        .catch((err) => {
            throw axiosErrorToError(err as AxiosError);
        });
}

function axiosErrorToError(err: AxiosError) {
    return new Error(`${err.message}: ${JSON.stringify(err.response?.data)}`);
}