Create user service and store

This commit is contained in:
kevin 2026-04-28 10:37:30 +03:00
parent bc497382a3
commit 3dcb88290d
2 changed files with 109 additions and 8 deletions

View File

@ -16,6 +16,16 @@ export interface UserSummary {
}>; }>;
} }
export interface UserListResponse {
data: UserSummary[];
message: string;
}
export interface UserResponse {
data: UserSummary;
message: string;
}
export interface CreateUserPayload { export interface CreateUserPayload {
name: string; name: string;
email: string; email: string;
@ -34,6 +44,15 @@ export interface UpdateUserPayload {
} }
export const UserService = { export const UserService = {
async getUsers(): Promise<UserSummary[]> {
const response = await request<UserListResponse>({
url: "/api/users",
method: "get",
});
return response.data;
},
async searchUserByEmail(email: string): Promise<UserSummary | null> { async searchUserByEmail(email: string): Promise<UserSummary | null> {
const response = await request<{ const response = await request<{
data: UserSummary | null; data: UserSummary | null;
@ -47,11 +66,17 @@ export const UserService = {
return response.data; return response.data;
}, },
async getUser(id: number): Promise<UserSummary> {
const response = await request<UserResponse>({
url: `/api/users/${id}`,
method: "get",
});
return response.data;
},
async createUser(payload: CreateUserPayload): Promise<UserSummary> { async createUser(payload: CreateUserPayload): Promise<UserSummary> {
const response = await request<{ const response = await request<UserResponse>({
data: UserSummary;
message: string;
}>({
url: "/api/users", url: "/api/users",
method: "post", method: "post",
data: payload, data: payload,
@ -63,10 +88,7 @@ export const UserService = {
async updateUser(payload: UpdateUserPayload): Promise<UserSummary> { async updateUser(payload: UpdateUserPayload): Promise<UserSummary> {
const { id, ...data } = payload; const { id, ...data } = payload;
const response = await request<{ const response = await request<UserResponse>({
data: UserSummary;
message: string;
}>({
url: `/api/users/${id}`, url: `/api/users/${id}`,
method: "put", method: "put",
data, data,
@ -74,6 +96,13 @@ export const UserService = {
return response.data; return response.data;
}, },
async deleteUser(id: number): Promise<{ message: string }> {
return request<{ message: string }>({
url: `/api/users/${id}`,
method: "delete",
});
},
}; };
export default UserService; export default UserService;

View File

@ -10,11 +10,49 @@ import type {
export const useUserStore = defineStore("user", () => { export const useUserStore = defineStore("user", () => {
const loading = ref(false); const loading = ref(false);
const error = ref<string | null>(null); const error = ref<string | null>(null);
const users = ref<UserSummary[]>([]);
const currentUser = ref<UserSummary | null>(null);
const searchedUser = ref<UserSummary | null>(null); const searchedUser = ref<UserSummary | null>(null);
const isLoading = computed(() => loading.value); const isLoading = computed(() => loading.value);
const allUsers = computed(() => users.value);
const selectedUser = computed(() => currentUser.value);
const currentSearchUser = computed(() => searchedUser.value); const currentSearchUser = computed(() => searchedUser.value);
const fetchUsers = async () => {
loading.value = true;
error.value = null;
try {
const result = await UserService.getUsers();
users.value = result;
return result;
} catch (err: any) {
error.value =
err.response?.data?.message || err.message || "Failed to fetch users";
throw err;
} finally {
loading.value = false;
}
};
const fetchUser = async (id: number) => {
loading.value = true;
error.value = null;
try {
const user = await UserService.getUser(id);
currentUser.value = user;
return user;
} catch (err: any) {
error.value =
err.response?.data?.message || err.message || "Failed to fetch user";
throw err;
} finally {
loading.value = false;
}
};
const searchUserByEmail = async (email: string) => { const searchUserByEmail = async (email: string) => {
loading.value = true; loading.value = true;
error.value = null; error.value = null;
@ -38,6 +76,8 @@ export const useUserStore = defineStore("user", () => {
try { try {
const user = await UserService.createUser(payload); const user = await UserService.createUser(payload);
users.value = [user, ...users.value.filter((item) => item.id !== user.id)];
currentUser.value = user;
searchedUser.value = user; searchedUser.value = user;
return user; return user;
} catch (err: any) { } catch (err: any) {
@ -55,6 +95,8 @@ export const useUserStore = defineStore("user", () => {
try { try {
const user = await UserService.updateUser(payload); const user = await UserService.updateUser(payload);
users.value = users.value.map((item) => (item.id === user.id ? user : item));
currentUser.value = user;
searchedUser.value = user; searchedUser.value = user;
return user; return user;
} catch (err: any) { } catch (err: any) {
@ -66,14 +108,44 @@ export const useUserStore = defineStore("user", () => {
} }
}; };
const deleteUser = async (id: number) => {
loading.value = true;
error.value = null;
try {
const response = await UserService.deleteUser(id);
users.value = users.value.filter((item) => item.id !== id);
if (currentUser.value?.id === id) {
currentUser.value = null;
}
if (searchedUser.value?.id === id) {
searchedUser.value = null;
}
return response;
} catch (err: any) {
error.value =
err.response?.data?.message || err.message || "Failed to delete user";
throw err;
} finally {
loading.value = false;
}
};
return { return {
loading, loading,
error, error,
users,
currentUser,
searchedUser, searchedUser,
isLoading, isLoading,
allUsers,
selectedUser,
currentSearchUser, currentSearchUser,
fetchUsers,
fetchUser,
searchUserByEmail, searchUserByEmail,
createUser, createUser,
updateUser, updateUser,
deleteUser,
}; };
}); });