83 lines
1.9 KiB
TypeScript
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 });
|
|
}; |