feat : Création de l'api, chargement des mockups
This commit is contained in:
11
src/api/client.ts
Normal file
11
src/api/client.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import axios from 'axios';
|
||||
|
||||
import { API_BASE_URL } from './config';
|
||||
|
||||
export const apiClient = axios.create({
|
||||
baseURL: API_BASE_URL,
|
||||
timeout: 10000,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
4
src/api/config.ts
Normal file
4
src/api/config.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
export const API_BASE_URL = process.env.EXPO_PUBLIC_API_BASE_URL ?? 'http://localhost:3000';
|
||||
|
||||
// Toggle once here to switch all API functions between mocks and real backend.
|
||||
export const API_USE_MOCKS = (process.env.EXPO_PUBLIC_API_USE_MOCKS ?? 'true') === 'true';
|
||||
9
src/api/entities/animators.ts
Normal file
9
src/api/entities/animators.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Animator } from '@/models';
|
||||
import { mockAnimators } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const animatorsApi = createResourceApi<Animator>({
|
||||
endpoint: 'animators',
|
||||
mockData: mockAnimators,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/comment_likes.ts
Normal file
9
src/api/entities/comment_likes.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockCommentLikes } from '@/mocks';
|
||||
import type { CommentLike } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const comment_likesApi = createResourceApi<CommentLike>({
|
||||
endpoint: 'comment_likes',
|
||||
mockData: mockCommentLikes,
|
||||
resolveMockKey: (item) => `${item.user_id}:${item.comment_id}`,
|
||||
});
|
||||
9
src/api/entities/comments.ts
Normal file
9
src/api/entities/comments.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Comment } from '@/models';
|
||||
import { mockComments } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const commentsApi = createResourceApi<Comment>({
|
||||
endpoint: 'comments',
|
||||
mockData: mockComments,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/event_external_links.ts
Normal file
9
src/api/entities/event_external_links.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { EventExternalLink } from '@/models';
|
||||
import { mockEventExternalLinks } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const event_external_linksApi = createResourceApi<EventExternalLink>({
|
||||
endpoint: 'event_external_links',
|
||||
mockData: mockEventExternalLinks,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/event_hashtags.ts
Normal file
9
src/api/entities/event_hashtags.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockEventHashtags } from '@/mocks';
|
||||
import type { EventHashtag } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const event_hashtagsApi = createResourceApi<EventHashtag>({
|
||||
endpoint: 'event_hashtags',
|
||||
mockData: mockEventHashtags,
|
||||
resolveMockKey: (item) => `${item.event_id}:${item.hashtag_id}`,
|
||||
});
|
||||
9
src/api/entities/event_images.ts
Normal file
9
src/api/entities/event_images.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { EventImage } from '@/models';
|
||||
import { mockEventImages } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const event_imagesApi = createResourceApi<EventImage>({
|
||||
endpoint: 'event_images',
|
||||
mockData: mockEventImages,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/event_lineup.ts
Normal file
9
src/api/entities/event_lineup.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { EventLineup } from '@/models';
|
||||
import { mockEventLineup } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const event_lineupApi = createResourceApi<EventLineup>({
|
||||
endpoint: 'event_lineup',
|
||||
mockData: mockEventLineup,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/event_stats_snapshots.ts
Normal file
9
src/api/entities/event_stats_snapshots.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { EventStatsSnapshot } from '@/models';
|
||||
import { mockEventStatsSnapshots } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const event_stats_snapshotsApi = createResourceApi<EventStatsSnapshot>({
|
||||
endpoint: 'event_stats_snapshots',
|
||||
mockData: mockEventStatsSnapshots,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/event_themes.ts
Normal file
9
src/api/entities/event_themes.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockEventThemes } from '@/mocks';
|
||||
import type { EventTheme } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const event_themesApi = createResourceApi<EventTheme>({
|
||||
endpoint: 'event_themes',
|
||||
mockData: mockEventThemes,
|
||||
resolveMockKey: (item) => `${item.event_id}:${item.theme_id}`,
|
||||
});
|
||||
9
src/api/entities/events.ts
Normal file
9
src/api/entities/events.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Event } from '@/models';
|
||||
import { mockEvents } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const eventsApi = createResourceApi<Event>({
|
||||
endpoint: 'events',
|
||||
mockData: mockEvents,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/hashtags.ts
Normal file
9
src/api/entities/hashtags.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Hashtag } from '@/models';
|
||||
import { mockHashtags } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const hashtagsApi = createResourceApi<Hashtag>({
|
||||
endpoint: 'hashtags',
|
||||
mockData: mockHashtags,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
29
src/api/entities/index.ts
Normal file
29
src/api/entities/index.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
export * from './animators';
|
||||
export * from './comment_likes';
|
||||
export * from './comments';
|
||||
export * from './event_external_links';
|
||||
export * from './event_hashtags';
|
||||
export * from './event_images';
|
||||
export * from './event_lineup';
|
||||
export * from './event_stats_snapshots';
|
||||
export * from './event_themes';
|
||||
export * from './events';
|
||||
export * from './hashtags';
|
||||
export * from './organizer_members';
|
||||
export * from './organizer_subscriptions';
|
||||
export * from './organizers';
|
||||
export * from './plans';
|
||||
export * from './post_likes';
|
||||
export * from './post_media';
|
||||
export * from './posts';
|
||||
export * from './search_history';
|
||||
export * from './social_auth_providers';
|
||||
export * from './themes';
|
||||
export * from './tickets';
|
||||
export * from './user_animator_follows';
|
||||
export * from './user_event_interactions';
|
||||
export * from './user_event_shares';
|
||||
export * from './user_organizer_follows';
|
||||
export * from './user_theme_preferences';
|
||||
export * from './users';
|
||||
|
||||
9
src/api/entities/organizer_members.ts
Normal file
9
src/api/entities/organizer_members.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { OrganizerMember } from '@/models';
|
||||
import { mockOrganizerMembers } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const organizer_membersApi = createResourceApi<OrganizerMember>({
|
||||
endpoint: 'organizer_members',
|
||||
mockData: mockOrganizerMembers,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/organizer_subscriptions.ts
Normal file
9
src/api/entities/organizer_subscriptions.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { OrganizerSubscription } from '@/models';
|
||||
import { mockOrganizerSubscriptions } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const organizer_subscriptionsApi = createResourceApi<OrganizerSubscription>({
|
||||
endpoint: 'organizer_subscriptions',
|
||||
mockData: mockOrganizerSubscriptions,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/organizers.ts
Normal file
9
src/api/entities/organizers.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Organizer } from '@/models';
|
||||
import { mockOrganizers } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const organizersApi = createResourceApi<Organizer>({
|
||||
endpoint: 'organizers',
|
||||
mockData: mockOrganizers,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/plans.ts
Normal file
9
src/api/entities/plans.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Plan } from '@/models';
|
||||
import { mockPlans } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const plansApi = createResourceApi<Plan>({
|
||||
endpoint: 'plans',
|
||||
mockData: mockPlans,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/post_likes.ts
Normal file
9
src/api/entities/post_likes.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockPostLikes } from '@/mocks';
|
||||
import type { PostLike } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const post_likesApi = createResourceApi<PostLike>({
|
||||
endpoint: 'post_likes',
|
||||
mockData: mockPostLikes,
|
||||
resolveMockKey: (item) => `${item.user_id}:${item.post_id}`,
|
||||
});
|
||||
9
src/api/entities/post_media.ts
Normal file
9
src/api/entities/post_media.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { PostMedia } from '@/models';
|
||||
import { mockPostMedia } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const post_mediaApi = createResourceApi<PostMedia>({
|
||||
endpoint: 'post_media',
|
||||
mockData: mockPostMedia,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/posts.ts
Normal file
9
src/api/entities/posts.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Post } from '@/models';
|
||||
import { mockPosts } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const postsApi = createResourceApi<Post>({
|
||||
endpoint: 'posts',
|
||||
mockData: mockPosts,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/search_history.ts
Normal file
9
src/api/entities/search_history.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { SearchHistory } from '@/models';
|
||||
import { mockSearchHistory } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const search_historyApi = createResourceApi<SearchHistory>({
|
||||
endpoint: 'search_history',
|
||||
mockData: mockSearchHistory,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/social_auth_providers.ts
Normal file
9
src/api/entities/social_auth_providers.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { SocialAuthProvider } from '@/models';
|
||||
import { mockSocialAuthProviders } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const social_auth_providersApi = createResourceApi<SocialAuthProvider>({
|
||||
endpoint: 'social_auth_providers',
|
||||
mockData: mockSocialAuthProviders,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/themes.ts
Normal file
9
src/api/entities/themes.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Theme } from '@/models';
|
||||
import { mockThemes } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const themesApi = createResourceApi<Theme>({
|
||||
endpoint: 'themes',
|
||||
mockData: mockThemes,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/tickets.ts
Normal file
9
src/api/entities/tickets.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Ticket } from '@/models';
|
||||
import { mockTickets } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const ticketsApi = createResourceApi<Ticket>({
|
||||
endpoint: 'tickets',
|
||||
mockData: mockTickets,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/user_animator_follows.ts
Normal file
9
src/api/entities/user_animator_follows.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockUserAnimatorFollows } from '@/mocks';
|
||||
import type { UserAnimatorFollow } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const user_animator_followsApi = createResourceApi<UserAnimatorFollow>({
|
||||
endpoint: 'user_animator_follows',
|
||||
mockData: mockUserAnimatorFollows,
|
||||
resolveMockKey: (item) => `${item.user_id}:${item.animator_id}`,
|
||||
});
|
||||
9
src/api/entities/user_event_interactions.ts
Normal file
9
src/api/entities/user_event_interactions.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockUserEventInteractions } from '@/mocks';
|
||||
import type { UserEventInteraction } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const user_event_interactionsApi = createResourceApi<UserEventInteraction>({
|
||||
endpoint: 'user_event_interactions',
|
||||
mockData: mockUserEventInteractions,
|
||||
resolveMockKey: (item) => `${item.user_id}:${item.event_id}`,
|
||||
});
|
||||
9
src/api/entities/user_event_shares.ts
Normal file
9
src/api/entities/user_event_shares.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { UserEventShare } from '@/models';
|
||||
import { mockUserEventShares } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const user_event_sharesApi = createResourceApi<UserEventShare>({
|
||||
endpoint: 'user_event_shares',
|
||||
mockData: mockUserEventShares,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
9
src/api/entities/user_organizer_follows.ts
Normal file
9
src/api/entities/user_organizer_follows.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockUserOrganizerFollows } from '@/mocks';
|
||||
import type { UserOrganizerFollow } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const user_organizer_followsApi = createResourceApi<UserOrganizerFollow>({
|
||||
endpoint: 'user_organizer_follows',
|
||||
mockData: mockUserOrganizerFollows,
|
||||
resolveMockKey: (item) => `${item.user_id}:${item.organizer_id}`,
|
||||
});
|
||||
9
src/api/entities/user_theme_preferences.ts
Normal file
9
src/api/entities/user_theme_preferences.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { mockUserThemePreferences } from '@/mocks';
|
||||
import type { UserThemePreference } from '@/models';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const user_theme_preferencesApi = createResourceApi<UserThemePreference>({
|
||||
endpoint: 'user_theme_preferences',
|
||||
mockData: mockUserThemePreferences,
|
||||
resolveMockKey: (item) => `${item.user_id}:${item.theme_id}`,
|
||||
});
|
||||
9
src/api/entities/users.ts
Normal file
9
src/api/entities/users.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { User } from '@/models';
|
||||
import { mockUsers } from '@/mocks';
|
||||
import { createResourceApi } from '../resourceFactory';
|
||||
|
||||
export const usersApi = createResourceApi<User>({
|
||||
endpoint: 'users',
|
||||
mockData: mockUsers,
|
||||
resolveMockKey: (item) => item.id,
|
||||
});
|
||||
33
src/api/index.ts
Normal file
33
src/api/index.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
export * from './client';
|
||||
export * from './config';
|
||||
export * from './resourceFactory';
|
||||
export * from './types';
|
||||
export * from './entities/animators';
|
||||
export * from './entities/comment_likes';
|
||||
export * from './entities/comments';
|
||||
export * from './entities/event_external_links';
|
||||
export * from './entities/event_hashtags';
|
||||
export * from './entities/event_images';
|
||||
export * from './entities/event_lineup';
|
||||
export * from './entities/event_stats_snapshots';
|
||||
export * from './entities/event_themes';
|
||||
export * from './entities/events';
|
||||
export * from './entities/hashtags';
|
||||
export * from './entities/organizer_members';
|
||||
export * from './entities/organizer_subscriptions';
|
||||
export * from './entities/organizers';
|
||||
export * from './entities/plans';
|
||||
export * from './entities/post_likes';
|
||||
export * from './entities/post_media';
|
||||
export * from './entities/posts';
|
||||
export * from './entities/search_history';
|
||||
export * from './entities/social_auth_providers';
|
||||
export * from './entities/themes';
|
||||
export * from './entities/tickets';
|
||||
export * from './entities/user_animator_follows';
|
||||
export * from './entities/user_event_interactions';
|
||||
export * from './entities/user_event_shares';
|
||||
export * from './entities/user_organizer_follows';
|
||||
export * from './entities/user_theme_preferences';
|
||||
export * from './entities/users';
|
||||
|
||||
90
src/api/mockStore.ts
Normal file
90
src/api/mockStore.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
type KeyResolver<T> = (item: T) => string;
|
||||
|
||||
type MockStoreOptions<T> = {
|
||||
data: T[];
|
||||
resolveKey: KeyResolver<T>;
|
||||
};
|
||||
|
||||
const clone = <T>(value: T): T => {
|
||||
if (typeof globalThis.structuredClone === 'function') {
|
||||
return globalThis.structuredClone(value);
|
||||
}
|
||||
|
||||
return JSON.parse(JSON.stringify(value)) as T;
|
||||
};
|
||||
|
||||
const createMockId = (): string => {
|
||||
const random = Math.random().toString(16).slice(2, 10).padEnd(8, '0');
|
||||
return `00000000-0000-4000-8000-${random}`;
|
||||
};
|
||||
|
||||
const ensureHasId = <T>(payload: Partial<T>): Partial<T> => {
|
||||
if ('id' in payload && typeof payload.id === 'string' && payload.id.length > 0) {
|
||||
return payload;
|
||||
}
|
||||
|
||||
return {
|
||||
...payload,
|
||||
id: createMockId(),
|
||||
};
|
||||
};
|
||||
|
||||
export const createMockStore = <T>(options: MockStoreOptions<T>) => {
|
||||
const { resolveKey } = options;
|
||||
const records = [...options.data];
|
||||
|
||||
const findIndex = (id: string): number => records.findIndex((item) => resolveKey(item) === id);
|
||||
|
||||
return {
|
||||
list: async (): Promise<T[]> => clone(records),
|
||||
get: async (id: string): Promise<T> => {
|
||||
const index = findIndex(id);
|
||||
if (index === -1) {
|
||||
throw new Error(`Mock record not found for id "${id}"`);
|
||||
}
|
||||
|
||||
return clone(records[index]);
|
||||
},
|
||||
create: async (payload: Partial<T>): Promise<T> => {
|
||||
const next = ensureHasId(payload) as T;
|
||||
records.push(next);
|
||||
return clone(next);
|
||||
},
|
||||
update: async (id: string, payload: Partial<T>): Promise<T> => {
|
||||
const index = findIndex(id);
|
||||
if (index === -1) {
|
||||
throw new Error(`Mock record not found for id "${id}"`);
|
||||
}
|
||||
|
||||
const next = {
|
||||
...records[index],
|
||||
...payload,
|
||||
};
|
||||
|
||||
records[index] = next;
|
||||
return clone(next);
|
||||
},
|
||||
patch: async (id: string, payload: Partial<T>): Promise<T> => {
|
||||
const index = findIndex(id);
|
||||
if (index === -1) {
|
||||
throw new Error(`Mock record not found for id "${id}"`);
|
||||
}
|
||||
|
||||
const next = {
|
||||
...records[index],
|
||||
...payload,
|
||||
};
|
||||
|
||||
records[index] = next;
|
||||
return clone(next);
|
||||
},
|
||||
remove: async (id: string): Promise<void> => {
|
||||
const index = findIndex(id);
|
||||
if (index === -1) {
|
||||
throw new Error(`Mock record not found for id "${id}"`);
|
||||
}
|
||||
|
||||
records.splice(index, 1);
|
||||
},
|
||||
};
|
||||
};
|
||||
66
src/api/resourceFactory.ts
Normal file
66
src/api/resourceFactory.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import type { AxiosInstance } from 'axios';
|
||||
|
||||
import { apiClient } from './client';
|
||||
import { API_USE_MOCKS } from './config';
|
||||
import { createMockStore } from './mockStore';
|
||||
import type { CreatePayload, CrudApi, UpdatePayload } from './types';
|
||||
|
||||
type CreateResourceApiOptions<T> = {
|
||||
endpoint: string;
|
||||
mockData: T[];
|
||||
resolveMockKey: (item: T) => string;
|
||||
client?: AxiosInstance;
|
||||
useMocks?: boolean;
|
||||
};
|
||||
|
||||
export const createResourceApi = <T>(options: CreateResourceApiOptions<T>): CrudApi<T> => {
|
||||
const {
|
||||
endpoint,
|
||||
mockData,
|
||||
resolveMockKey,
|
||||
client = apiClient,
|
||||
useMocks = API_USE_MOCKS,
|
||||
} = options;
|
||||
|
||||
const mockStore = createMockStore<T>({
|
||||
data: mockData,
|
||||
resolveKey: resolveMockKey,
|
||||
});
|
||||
|
||||
if (useMocks) {
|
||||
return {
|
||||
list: () => mockStore.list(),
|
||||
get: (id) => mockStore.get(id),
|
||||
create: (payload) => mockStore.create(payload),
|
||||
update: (id, payload) => mockStore.update(id, payload),
|
||||
patch: (id, payload) => mockStore.patch(id, payload),
|
||||
remove: (id) => mockStore.remove(id),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
list: async () => {
|
||||
const response = await client.get<T[]>(`/${endpoint}`);
|
||||
return response.data;
|
||||
},
|
||||
get: async (id: string) => {
|
||||
const response = await client.get<T>(`/${endpoint}/${id}`);
|
||||
return response.data;
|
||||
},
|
||||
create: async (payload: CreatePayload<T>) => {
|
||||
const response = await client.post<T>(`/${endpoint}`, payload);
|
||||
return response.data;
|
||||
},
|
||||
update: async (id: string, payload: UpdatePayload<T>) => {
|
||||
const response = await client.put<T>(`/${endpoint}/${id}`, payload);
|
||||
return response.data;
|
||||
},
|
||||
patch: async (id: string, payload: UpdatePayload<T>) => {
|
||||
const response = await client.patch<T>(`/${endpoint}/${id}`, payload);
|
||||
return response.data;
|
||||
},
|
||||
remove: async (id: string) => {
|
||||
await client.delete(`/${endpoint}/${id}`);
|
||||
},
|
||||
};
|
||||
};
|
||||
13
src/api/types.ts
Normal file
13
src/api/types.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
export type EntityWithId = { id: string };
|
||||
|
||||
export type CreatePayload<T> = Partial<T>;
|
||||
export type UpdatePayload<T> = Partial<T>;
|
||||
|
||||
export type CrudApi<T> = {
|
||||
list: () => Promise<T[]>;
|
||||
get: (id: string) => Promise<T>;
|
||||
create: (payload: CreatePayload<T>) => Promise<T>;
|
||||
update: (id: string, payload: UpdatePayload<T>) => Promise<T>;
|
||||
patch: (id: string, payload: UpdatePayload<T>) => Promise<T>;
|
||||
remove: (id: string) => Promise<void>;
|
||||
};
|
||||
Reference in New Issue
Block a user