114 lines
2.9 KiB
TypeScript
114 lines
2.9 KiB
TypeScript
import type { Album, AlbumPermission, Media, User } from "@/domain/types";
|
|
import apiClient from "@/services/api-client";
|
|
import { processMediaUrls } from "./media-service";
|
|
|
|
// --- Types ---
|
|
|
|
export type CreateAlbumPayload = {
|
|
name: string;
|
|
description?: string;
|
|
};
|
|
|
|
export type UpdateAlbumPayload = Partial<CreateAlbumPayload> & {
|
|
is_public?: boolean;
|
|
};
|
|
|
|
export type AddMediaToAlbumPayload = {
|
|
media_ids: string[];
|
|
};
|
|
|
|
export type RemoveMediaFromAlbumPayload = {
|
|
media_ids: string[];
|
|
};
|
|
|
|
export type ShareAlbumPayload = {
|
|
target_user_id: string;
|
|
permission: AlbumPermission;
|
|
};
|
|
|
|
export type SetAlbumThumbnailPayload = {
|
|
media_id: string;
|
|
};
|
|
|
|
// --- Service Functions ---
|
|
|
|
export const getAlbums = async (): Promise<Album[]> => {
|
|
const { data } = await apiClient.get("/albums");
|
|
return data; // Album object doesn't have URLs
|
|
};
|
|
|
|
export const getAlbum = async (albumId: string): Promise<Album> => {
|
|
const { data } = await apiClient.get(`/albums/${albumId}`);
|
|
return data; // Album object doesn't have URLs
|
|
};
|
|
|
|
export const createAlbum = async (
|
|
payload: CreateAlbumPayload,
|
|
): Promise<Album> => {
|
|
const { data } = await apiClient.post("/albums", payload);
|
|
return data;
|
|
};
|
|
|
|
export const updateAlbum = async (
|
|
albumId: string,
|
|
payload: UpdateAlbumPayload,
|
|
): Promise<Album> => {
|
|
const { data } = await apiClient.put(`/albums/${albumId}`, payload);
|
|
return data;
|
|
};
|
|
|
|
export const deleteAlbum = async (albumId: string): Promise<void> => {
|
|
await apiClient.delete(`/albums/${albumId}`);
|
|
};
|
|
|
|
export const getAlbumMedia = async (albumId: string): Promise<Media[]> => {
|
|
const { data } = await apiClient.get(`/albums/${albumId}/media`);
|
|
return data.map(processMediaUrls); // Process all media URLs
|
|
};
|
|
|
|
export const addMediaToAlbum = async (
|
|
albumId: string,
|
|
payload: AddMediaToAlbumPayload,
|
|
): Promise<void> => {
|
|
await apiClient.post(`/albums/${albumId}/media`, payload);
|
|
};
|
|
|
|
export const removeMediaFromAlbum = async (
|
|
albumId: string,
|
|
payload: RemoveMediaFromAlbumPayload,
|
|
): Promise<void> => {
|
|
await apiClient.delete(`/albums/${albumId}/media`, { data: payload });
|
|
};
|
|
|
|
export const shareAlbum = async (
|
|
albumId: string,
|
|
payload: ShareAlbumPayload,
|
|
): Promise<void> => {
|
|
await apiClient.post(`/albums/${albumId}/share`, payload);
|
|
};
|
|
|
|
export const unshareAlbum = async (
|
|
albumId: string,
|
|
targetUserId: string,
|
|
): Promise<void> => {
|
|
await apiClient.delete(`/albums/${albumId}/share`, {
|
|
data: { target_user_id: targetUserId },
|
|
});
|
|
};
|
|
|
|
export const setAlbumThumbnail = async (
|
|
albumId: string,
|
|
payload: SetAlbumThumbnailPayload,
|
|
): Promise<void> => {
|
|
await apiClient.put(`/albums/${albumId}/thumbnail`, payload);
|
|
};
|
|
|
|
export type AlbumShare = {
|
|
user: User;
|
|
permission: AlbumPermission;
|
|
};
|
|
|
|
export const getAlbumShares = async (albumId: string): Promise<AlbumShare[]> => {
|
|
const { data } = await apiClient.get(`/albums/${albumId}/share`);
|
|
return data;
|
|
}; |