Create user service and store
This commit is contained in:
parent
bc497382a3
commit
3dcb88290d
@ -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;
|
||||||
|
|||||||
@ -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,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user