Files
libertas/libertas-frontend/src/services/album-service.ts

83 lines
1.9 KiB
TypeScript

import type { Album, Media } from "@/domain/types"
import apiClient from "@/services/api-client"
export type CreateAlbumPayload = {
name: string
description?: string
}
/**
* Fetches a list of albums.
* TODO: This should become paginated later.
*/
export const getAlbums = async (): Promise<Album[]> => {
const { data } = await apiClient.get('/albums')
return data
}
/**
* Creates a new album.
*/
export const createAlbum = async (
payload: CreateAlbumPayload,
): Promise<Album> => {
const { data } = await apiClient.post('/albums', payload)
return data
}
/**
* Fetches all media for a specific album.
*/
export const getAlbumMedia = async (albumId: string): Promise<Media[]> => {
const { data } = await apiClient.get(`/albums/${albumId}/media`);
const prefix = import.meta.env.VITE_PREFIX_PATH || apiClient.defaults.baseURL;
const processedMedia = data.map((media: Media) => ({
...media,
file_url: `${prefix}${media.file_url}`,
thumbnail_url: media.thumbnail_url
? `${prefix}${media.thumbnail_url}`
: null,
}));
return processedMedia;
};
export type AddMediaToAlbumPayload = {
media_ids: string[];
};
/**
* Adds a list of media IDs to a specific album.
*/
export const addMediaToAlbum = async (
albumId: string,
payload: AddMediaToAlbumPayload,
): Promise<void> => {
await apiClient.post(`/albums/${albumId}/media`, payload);
};
/**
* Fetches a single album by its ID.
*/
export const getAlbum = async (albumId: string): Promise<Album> => {
const { data } = await apiClient.get(`/albums/${albumId}`);
return data;
};
export type RemoveMediaFromAlbumPayload = {
media_ids: string[];
};
/**
* Removes a list of media IDs from a specific album.
*/
export const removeMediaFromAlbum = async (
albumId: string,
payload: RemoveMediaFromAlbumPayload,
): Promise<void> => {
await apiClient.delete(`/albums/${albumId}/media`, { data: payload });
};