From ad1aff36927d7692fbfccc5d9f3599264796cfea Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 3 Feb 2025 23:42:08 +0300 Subject: [PATCH] Visual improvements --- enshi/src/@types/UserType.ts | 23 +++++- .../ArticleViewer/ArticleViewer.tsx | 2 +- enshi/src/Components/NavBar/NavBar.tsx | 13 ++-- .../NavBar/SearchField/SearchField.tsx | 2 +- .../ProfileNavbar/ProfileNavbar.tsx | 7 +- enshi/src/Components/UserCard/UserCard.tsx | 48 +++++++++--- .../LoginRegisterPage/LoginPage/LoginPage.tsx | 13 +++- .../RegisterPage/RegisterPage.tsx | 12 ++- .../src/Pages/UserBlogsPage/UserBlogsPage.tsx | 2 +- .../Pages/UserProfilePage/UserProfilePage.tsx | 75 +++++++++++++++++-- enshi/src/layout/MainPage/MainPage.tsx | 13 +++- enshi/src/layout/ProfilePage/ProfilePage.tsx | 7 +- enshi_back/db/go_queries/blogs_queries.sql.go | 2 +- .../db/go_queries/bookmarks_queries.sql.go | 2 +- .../db/go_queries/categories_queries.sql.go | 2 +- .../db/go_queries/comments_queries.sql.go | 2 +- enshi_back/db/go_queries/db.go | 2 +- .../db/go_queries/favorites_queries.sql.go | 2 +- enshi_back/db/go_queries/likes_queries.sql.go | 2 +- enshi_back/db/go_queries/models.go | 15 ++-- enshi_back/db/go_queries/multi_queries.sql.go | 2 +- .../db/go_queries/post_tags_queries.sql.go | 2 +- .../db/go_queries/post_votes_queries.sql.go | 2 +- enshi_back/db/go_queries/posts_queries.sql.go | 2 +- .../db/go_queries/profiles_queries.sql.go | 2 +- enshi_back/db/go_queries/tags_queries.sql.go | 2 +- enshi_back/db/go_queries/users_queries.sql.go | 20 +++-- enshi_back/db/migrations/migration1.sql | 4 +- enshi_back/middleware/TargetMiddleware.go | 2 +- enshi_back/middleware/getters/claims.go | 2 +- enshi_back/middleware/getters/userId.go | 2 +- enshi_back/routes/middlewareSetup.go | 20 +++++ enshi_back/routes/routesSetup.go | 8 ++ enshi_back/routes/userRoutes/getUserInfo.go | 35 +++++++++ 34 files changed, 278 insertions(+), 73 deletions(-) create mode 100644 enshi_back/routes/userRoutes/getUserInfo.go diff --git a/enshi/src/@types/UserType.ts b/enshi/src/@types/UserType.ts index 0e20c4d..69762b2 100644 --- a/enshi/src/@types/UserType.ts +++ b/enshi/src/@types/UserType.ts @@ -2,4 +2,25 @@ export type TUser = { username: string; isAdmin: boolean; id?: string | number; -} \ No newline at end of file +} + +export type TInfoUser = { + user_id: number; + username: string; + email: string; + createdAt: string; + is_admin: boolean; + display_name: string; +}; + +export type TProfile = { + user_id: number; + bio: string; + avatar_url: string; + website_url: string; +}; + +export type TGetUserInfoResponse = { + user_info: TInfoUser; + profile_info: TProfile; +}; \ No newline at end of file diff --git a/enshi/src/Components/ArticleViewer/ArticleViewer.tsx b/enshi/src/Components/ArticleViewer/ArticleViewer.tsx index 5a26a57..5933257 100644 --- a/enshi/src/Components/ArticleViewer/ArticleViewer.tsx +++ b/enshi/src/Components/ArticleViewer/ArticleViewer.tsx @@ -38,7 +38,7 @@ export default function ArticleViewer(props: TArticleViewer) { <>
- + {data.title} diff --git a/enshi/src/Components/NavBar/NavBar.tsx b/enshi/src/Components/NavBar/NavBar.tsx index 17472c6..2da0a09 100644 --- a/enshi/src/Components/NavBar/NavBar.tsx +++ b/enshi/src/Components/NavBar/NavBar.tsx @@ -1,15 +1,18 @@ +import { Flex } from "@radix-ui/themes"; import CustomNavigationMenu from "./NavigationMenu/NavigationMenu"; import RightButtonBar from "./RightButtonBar/RightButtonBar"; import SearchField from "./SearchField/SearchField"; export default function NavBar() { return ( - + ); } diff --git a/enshi/src/Components/NavBar/SearchField/SearchField.tsx b/enshi/src/Components/NavBar/SearchField/SearchField.tsx index 02dbf95..f24ccca 100644 --- a/enshi/src/Components/NavBar/SearchField/SearchField.tsx +++ b/enshi/src/Components/NavBar/SearchField/SearchField.tsx @@ -8,7 +8,7 @@ export default function SearchField() { return (
diff --git a/enshi/src/Components/ProfileNavbar/ProfileNavbar.tsx b/enshi/src/Components/ProfileNavbar/ProfileNavbar.tsx index 0fd2253..44dd3e2 100644 --- a/enshi/src/Components/ProfileNavbar/ProfileNavbar.tsx +++ b/enshi/src/Components/ProfileNavbar/ProfileNavbar.tsx @@ -38,10 +38,7 @@ export default function ProfileNavbar() { - + @@ -52,7 +49,7 @@ export default function ProfileNavbar() { - + diff --git a/enshi/src/Components/UserCard/UserCard.tsx b/enshi/src/Components/UserCard/UserCard.tsx index 0b58d6d..3f70b71 100644 --- a/enshi/src/Components/UserCard/UserCard.tsx +++ b/enshi/src/Components/UserCard/UserCard.tsx @@ -1,8 +1,18 @@ -import { Avatar, Badge, Card, Flex, Separator, Text } from "@radix-ui/themes"; +import { + Avatar, + Badge, + Card, + Flex, + Separator, + Skeleton, + Text, +} from "@radix-ui/themes"; import { useQuery } from "@tanstack/react-query"; import { useAtomValue } from "jotai"; +import { TGetUserInfoResponse } from "../../@types/UserType"; import { userAtom } from "../../AtomStore/AtomStore"; import { axiosLocalhost } from "../../api/axios/axios"; +import { JSONWithInt64 } from "../../utils/idnex"; type TUserCard = { username?: string; @@ -12,13 +22,22 @@ type TUserCard = { export default function UserCard(props: TUserCard) { const user = useAtomValue(userAtom); - const { data } = useQuery({ - queryKey: [`userCard${props.userId}`], + const { data, isLoading } = useQuery({ + queryKey: [`userCard${props.userId || user?.id}`], queryFn: async () => { - const response = await axiosLocalhost.get(`/users/${props.userId}`); - return response.data; + const response = await axiosLocalhost.get( + `/users/info/${props.userId || user?.id?.toString()}`, + { + transformResponse: [(data) => data], + } + ); + + const parsedResponse = JSONWithInt64(response.data); + + console.log("parsedResponse", parsedResponse); + + return parsedResponse as TGetUserInfoResponse; }, - enabled: !!props.userId, }); const getInitials = (username: string): string => { @@ -42,11 +61,22 @@ export default function UserCard(props: TUserCard) { {getInitials(getUsername())}
} radius="full" + loading="lazy" /> - - Test User + + {isLoading ? ( + + {`Temporal`} + + ) : ( + + {data?.user_info.display_name || + `Non specified`} + + )} + - @testuser123 + {`@${getUsername()}`} diff --git a/enshi/src/Pages/LoginRegisterPage/LoginPage/LoginPage.tsx b/enshi/src/Pages/LoginRegisterPage/LoginPage/LoginPage.tsx index 32faa67..189c777 100644 --- a/enshi/src/Pages/LoginRegisterPage/LoginPage/LoginPage.tsx +++ b/enshi/src/Pages/LoginRegisterPage/LoginPage/LoginPage.tsx @@ -9,6 +9,7 @@ import { Link, useNavigate } from "react-router-dom"; import { axiosLocalhost } from "../../../api/axios/axios"; import { userAtom } from "../../../AtomStore/AtomStore"; import UseCapsLock from "../../../hooks/useCapsLock"; +import { JSONWithInt64 } from "../../../utils/idnex"; import ShowPasswordButton from "../ShowPasswordButton/ShowPasswordButton"; type TLoginData = { @@ -28,12 +29,18 @@ export default function LoginPage() { mutationFn: async (data: TLoginData) => { let response = await axiosLocalhost.post( "/login", - JSON.stringify(data) + JSON.stringify(data), + { + transformResponse: [data => data] + } ); + + const parsedData = JSONWithInt64(response.data); + setUserAtom({ - username: response.data.username, + username: parsedData.username, isAdmin: false, - id: response.data.id, + id: parsedData.id, }); }, diff --git a/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx b/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx index 4702221..5d5c35a 100644 --- a/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx +++ b/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx @@ -9,6 +9,7 @@ import { Link, useNavigate } from "react-router-dom"; import { axiosLocalhost } from "../../../api/axios/axios"; import { userAtom } from "../../../AtomStore/AtomStore"; import UseCapsLock from "../../../hooks/useCapsLock"; +import { JSONWithInt64 } from "../../../utils/idnex"; import ShowPasswordButton from "../ShowPasswordButton/ShowPasswordButton"; type TRegisterData = { @@ -31,11 +32,16 @@ export default function RegisterPage() { const registerMutation = useMutation({ mutationFn: async (data: TRegisterData) => { - let response = await axiosLocalhost.post("/users", JSON.stringify(data)); + let response = await axiosLocalhost.post("/users", JSON.stringify(data), { + transformResponse: [data => data] + }); + + const parsedResponse = JSONWithInt64(response.data) + setUserAtom({ - username: response.data.username, + username: parsedResponse.username, isAdmin: false, - id: response.data.id, + id: parsedResponse.id, }) }, diff --git a/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx b/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx index c00ec11..1029591 100644 --- a/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx +++ b/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx @@ -15,7 +15,7 @@ export default function UserBlogsPage() { transformResponse: [(data) => data], }); - let temp = JSONWithInt64(response.data); + const temp = JSONWithInt64(response.data); return temp as any[]; }, diff --git a/enshi/src/Pages/UserProfilePage/UserProfilePage.tsx b/enshi/src/Pages/UserProfilePage/UserProfilePage.tsx index dc44a30..8bf714d 100644 --- a/enshi/src/Pages/UserProfilePage/UserProfilePage.tsx +++ b/enshi/src/Pages/UserProfilePage/UserProfilePage.tsx @@ -1,5 +1,13 @@ -import { Flex, ScrollArea, Text } from "@radix-ui/themes"; -import { loremText } from "../../constants/loremText"; +import { + Badge, + Box, + DataList, + Flex, + ScrollArea, + Separator, + Text, + TextArea, +} from "@radix-ui/themes"; export default function UserProfilePage() { return ( @@ -7,11 +15,68 @@ export default function UserProfilePage() { - -

{loremText}

+ Base info + + + + + + + + Username + + + @Definitely_fake_user + + + + + Email + + fake@email.com + + + + Display name + + Isaev + + + + Badges + + + + User + + Admin + + + Writer + + + + + + + + + Bio + + + + + +
); diff --git a/enshi/src/layout/MainPage/MainPage.tsx b/enshi/src/layout/MainPage/MainPage.tsx index fe44e53..17f2ebd 100644 --- a/enshi/src/layout/MainPage/MainPage.tsx +++ b/enshi/src/layout/MainPage/MainPage.tsx @@ -5,6 +5,7 @@ import { Outlet } from "react-router-dom"; import { axiosLocalhost } from "../../api/axios/axios"; import { userAtom } from "../../AtomStore/AtomStore"; import NavBar from "../../Components/NavBar/NavBar"; +import { JSONWithInt64 } from "../../utils/idnex"; const REFETCH_INTERVAL_IN_MINUTES = 5; const RETRY_INTERVAL_IN_SECONDS = 1; @@ -19,12 +20,16 @@ export default function MainPage() { queryKey: ["authKey"], queryFn: async () => { try { - const response = await axiosLocalhost.get("/auth/check"); + const response = await axiosLocalhost.get("/auth/check", { + transformResponse: [data => data] + }); + + const parsedResponse = JSONWithInt64(response.data) setUserData({ - isAdmin: response.data["is_admin"], - username: response.data["username"], - id: response.data["id"], + isAdmin: parsedResponse["is_admin"], + username: parsedResponse["username"], + id: parsedResponse["id"], }); return true; } catch (error) { diff --git a/enshi/src/layout/ProfilePage/ProfilePage.tsx b/enshi/src/layout/ProfilePage/ProfilePage.tsx index 987df0d..26b113d 100644 --- a/enshi/src/layout/ProfilePage/ProfilePage.tsx +++ b/enshi/src/layout/ProfilePage/ProfilePage.tsx @@ -8,12 +8,13 @@ export default function ProfilePage() { className={` relative flex-col flex-1 gap-0 mx-4 sm:flex-row sm:gap-4 - md:w-full md:min-w-[45rem] md:max-w-[50rem] md:mx-auto - lg:min-w-[50rem] lg:mx-auto + md:w-full md:min-w-[45rem] md:max-w-[70rem] md:mx-auto overflow-hidden `} > - + + + diff --git a/enshi_back/db/go_queries/blogs_queries.sql.go b/enshi_back/db/go_queries/blogs_queries.sql.go index 3029ce9..4118c2e 100644 --- a/enshi_back/db/go_queries/blogs_queries.sql.go +++ b/enshi_back/db/go_queries/blogs_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: blogs_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/bookmarks_queries.sql.go b/enshi_back/db/go_queries/bookmarks_queries.sql.go index 034c0d4..f40cd8e 100644 --- a/enshi_back/db/go_queries/bookmarks_queries.sql.go +++ b/enshi_back/db/go_queries/bookmarks_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: bookmarks_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/categories_queries.sql.go b/enshi_back/db/go_queries/categories_queries.sql.go index 881e332..5adeff7 100644 --- a/enshi_back/db/go_queries/categories_queries.sql.go +++ b/enshi_back/db/go_queries/categories_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: categories_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/comments_queries.sql.go b/enshi_back/db/go_queries/comments_queries.sql.go index 2141521..5457e28 100644 --- a/enshi_back/db/go_queries/comments_queries.sql.go +++ b/enshi_back/db/go_queries/comments_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: comments_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/db.go b/enshi_back/db/go_queries/db.go index f2cd0e1..11d3385 100644 --- a/enshi_back/db/go_queries/db.go +++ b/enshi_back/db/go_queries/db.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 package db_repo diff --git a/enshi_back/db/go_queries/favorites_queries.sql.go b/enshi_back/db/go_queries/favorites_queries.sql.go index 260bb15..440bfc8 100644 --- a/enshi_back/db/go_queries/favorites_queries.sql.go +++ b/enshi_back/db/go_queries/favorites_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: favorites_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/likes_queries.sql.go b/enshi_back/db/go_queries/likes_queries.sql.go index 1b8e4cb..b996985 100644 --- a/enshi_back/db/go_queries/likes_queries.sql.go +++ b/enshi_back/db/go_queries/likes_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: likes_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/models.go b/enshi_back/db/go_queries/models.go index 6438133..5ac0f17 100644 --- a/enshi_back/db/go_queries/models.go +++ b/enshi_back/db/go_queries/models.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 package db_repo @@ -83,10 +83,11 @@ type Tag struct { } type User struct { - UserID int64 `json:"user_id"` - Username string `json:"username" validate:"required"` - Email string `json:"email" validate:"required,email"` - Password string `json:"password" validate:"required"` - CreatedAt pgtype.Timestamp `json:"created_at"` - IsAdmin bool `json:"is_admin"` + UserID int64 `json:"user_id"` + Username string `json:"username" validate:"required"` + Email string `json:"email" validate:"required,email"` + Password string `json:"password" validate:"required"` + CreatedAt pgtype.Timestamp `json:"created_at"` + IsAdmin bool `json:"is_admin"` + DisplayName pgtype.Text `json:"display_name"` } diff --git a/enshi_back/db/go_queries/multi_queries.sql.go b/enshi_back/db/go_queries/multi_queries.sql.go index 79724d5..0b76c11 100644 --- a/enshi_back/db/go_queries/multi_queries.sql.go +++ b/enshi_back/db/go_queries/multi_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: multi_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/post_tags_queries.sql.go b/enshi_back/db/go_queries/post_tags_queries.sql.go index a957b98..b14fb8a 100644 --- a/enshi_back/db/go_queries/post_tags_queries.sql.go +++ b/enshi_back/db/go_queries/post_tags_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: post_tags_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/post_votes_queries.sql.go b/enshi_back/db/go_queries/post_votes_queries.sql.go index 05e957c..4c6809c 100644 --- a/enshi_back/db/go_queries/post_votes_queries.sql.go +++ b/enshi_back/db/go_queries/post_votes_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: post_votes_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/posts_queries.sql.go b/enshi_back/db/go_queries/posts_queries.sql.go index c778e15..2db5075 100644 --- a/enshi_back/db/go_queries/posts_queries.sql.go +++ b/enshi_back/db/go_queries/posts_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: posts_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/profiles_queries.sql.go b/enshi_back/db/go_queries/profiles_queries.sql.go index 946a625..0170142 100644 --- a/enshi_back/db/go_queries/profiles_queries.sql.go +++ b/enshi_back/db/go_queries/profiles_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: profiles_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/tags_queries.sql.go b/enshi_back/db/go_queries/tags_queries.sql.go index 49bb5af..a54d7cb 100644 --- a/enshi_back/db/go_queries/tags_queries.sql.go +++ b/enshi_back/db/go_queries/tags_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: tags_queries.sql package db_repo diff --git a/enshi_back/db/go_queries/users_queries.sql.go b/enshi_back/db/go_queries/users_queries.sql.go index 2660956..58df2d2 100644 --- a/enshi_back/db/go_queries/users_queries.sql.go +++ b/enshi_back/db/go_queries/users_queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.27.0 +// sqlc v1.28.0 // source: users_queries.sql package db_repo @@ -13,7 +13,7 @@ const createUser = `-- name: CreateUser :one INSERT INTO public.users (user_id, username, email, "password", created_at, is_admin) VALUES($1, $2, $3, $4, CURRENT_TIMESTAMP, false) -RETURNING user_id, username, email, password, created_at, is_admin +RETURNING user_id, username, email, password, created_at, is_admin, display_name ` type CreateUserParams struct { @@ -38,6 +38,7 @@ func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, e &i.Password, &i.CreatedAt, &i.IsAdmin, + &i.DisplayName, ) return i, err } @@ -63,7 +64,7 @@ func (q *Queries) DeleteUserByUsername(ctx context.Context, username string) err } const getAllUsers = `-- name: GetAllUsers :many -SELECT user_id, username, email, password, created_at, is_admin FROM users +SELECT user_id, username, email, password, created_at, is_admin, display_name FROM users ` func (q *Queries) GetAllUsers(ctx context.Context) ([]User, error) { @@ -82,6 +83,7 @@ func (q *Queries) GetAllUsers(ctx context.Context) ([]User, error) { &i.Password, &i.CreatedAt, &i.IsAdmin, + &i.DisplayName, ); err != nil { return nil, err } @@ -94,7 +96,7 @@ func (q *Queries) GetAllUsers(ctx context.Context) ([]User, error) { } const getUserByEmailOrNickname = `-- name: GetUserByEmailOrNickname :one -SELECT user_id, username, email, password, created_at, is_admin FROM users WHERE username = $1 OR email = $2 LIMIT 1 +SELECT user_id, username, email, password, created_at, is_admin, display_name FROM users WHERE username = $1 OR email = $2 LIMIT 1 ` type GetUserByEmailOrNicknameParams struct { @@ -112,12 +114,13 @@ func (q *Queries) GetUserByEmailOrNickname(ctx context.Context, arg GetUserByEma &i.Password, &i.CreatedAt, &i.IsAdmin, + &i.DisplayName, ) return i, err } const getUserById = `-- name: GetUserById :one -SELECT user_id, username, email, password, created_at, is_admin FROM users WHERE user_id = $1 +SELECT user_id, username, email, password, created_at, is_admin, display_name FROM users WHERE user_id = $1 ` func (q *Queries) GetUserById(ctx context.Context, userID int64) (User, error) { @@ -130,12 +133,13 @@ func (q *Queries) GetUserById(ctx context.Context, userID int64) (User, error) { &i.Password, &i.CreatedAt, &i.IsAdmin, + &i.DisplayName, ) return i, err } const getUserByUsername = `-- name: GetUserByUsername :one -SELECT user_id, username, email, password, created_at, is_admin FROM users WHERE username = $1 +SELECT user_id, username, email, password, created_at, is_admin, display_name FROM users WHERE username = $1 ` func (q *Queries) GetUserByUsername(ctx context.Context, username string) (User, error) { @@ -148,6 +152,7 @@ func (q *Queries) GetUserByUsername(ctx context.Context, username string) (User, &i.Password, &i.CreatedAt, &i.IsAdmin, + &i.DisplayName, ) return i, err } @@ -167,7 +172,7 @@ const updateUserPasswordHash = `-- name: UpdateUserPasswordHash :one UPDATE public.users SET "password"=$1 WHERE user_id=$2 -RETURNING user_id, username, email, password, created_at, is_admin +RETURNING user_id, username, email, password, created_at, is_admin, display_name ` type UpdateUserPasswordHashParams struct { @@ -185,6 +190,7 @@ func (q *Queries) UpdateUserPasswordHash(ctx context.Context, arg UpdateUserPass &i.Password, &i.CreatedAt, &i.IsAdmin, + &i.DisplayName, ) return i, err } diff --git a/enshi_back/db/migrations/migration1.sql b/enshi_back/db/migrations/migration1.sql index 7df83d3..30d2fb5 100644 --- a/enshi_back/db/migrations/migration1.sql +++ b/enshi_back/db/migrations/migration1.sql @@ -5,7 +5,7 @@ COMMENT ON SCHEMA "public" IS 'standard public schema'; -- Create "categories" table CREATE TABLE "public"."categories" ("category_id" integer NOT NULL, "category_name" character varying(50) NOT NULL, PRIMARY KEY ("category_id"), CONSTRAINT "categories_category_name_key" UNIQUE ("category_name")); -- Create "users" table -CREATE TABLE "public"."users" ("user_id" bigint NOT NULL, "username" character varying(50) NOT NULL, "email" character varying(100) NOT NULL, "password" character varying(255) NOT NULL, "created_at" timestamp NULL DEFAULT CURRENT_TIMESTAMP, "is_admin" boolean NOT NULL, PRIMARY KEY ("user_id"), CONSTRAINT "users_email_key" UNIQUE ("email"), CONSTRAINT "users_username_key" UNIQUE ("username")); +CREATE TABLE "public"."users" ("user_id" bigint NOT NULL, "username" character varying(50) NOT NULL, "email" character varying(100) NOT NULL, "password" character varying(255) NOT NULL, "created_at" timestamp NULL DEFAULT CURRENT_TIMESTAMP, "is_admin" boolean NOT NULL, "display_name" character varying(32) NULL, PRIMARY KEY ("user_id"), CONSTRAINT "users_email_key" UNIQUE ("email"), CONSTRAINT "users_username_key" UNIQUE ("username")); -- Create "blogs" table CREATE TABLE "public"."blogs" ("blog_id" bigint NOT NULL, "user_id" bigint NOT NULL, "title" character varying(255) NULL, "description" text NULL, "category_id" integer NULL, "created_at" timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY ("blog_id"), CONSTRAINT "blogs_category_id_fkey" FOREIGN KEY ("category_id") REFERENCES "public"."categories" ("category_id") ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT "blogs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "public"."users" ("user_id") ON UPDATE NO ACTION ON DELETE CASCADE); -- Create "posts" table @@ -23,7 +23,7 @@ CREATE TABLE "public"."tags" ("tag_id" integer NOT NULL, "tag_name" character va -- Create "post_tags" table CREATE TABLE "public"."post_tags" ("post_id" bigint NOT NULL, "tag_id" integer NOT NULL, PRIMARY KEY ("post_id", "tag_id"), CONSTRAINT "post_tags_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "public"."posts" ("post_id") ON UPDATE NO ACTION ON DELETE CASCADE, CONSTRAINT "post_tags_tag_id_fkey" FOREIGN KEY ("tag_id") REFERENCES "public"."tags" ("tag_id") ON UPDATE NO ACTION ON DELETE CASCADE); -- Create "post_votes" table -CREATE TABLE "public"."post_votes" ("post_id" bigint NOT NULL, "user_id" bigint NOT NULL, "vote" boolean NOT NULL, PRIMARY KEY ("post_id", "user_id"), CONSTRAINT "post_votes_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "public"."posts" ("post_id") ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT "post_votes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "public"."users" ("user_id") ON UPDATE NO ACTION ON DELETE NO ACTION); +CREATE TABLE "public"."post_votes" ("post_id" bigint NOT NULL, "user_id" bigint NOT NULL, "vote" boolean NOT NULL, PRIMARY KEY ("post_id", "user_id"), CONSTRAINT "post_votes_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "public"."posts" ("post_id") ON UPDATE NO ACTION ON DELETE CASCADE, CONSTRAINT "post_votes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "public"."users" ("user_id") ON UPDATE NO ACTION ON DELETE NO ACTION); -- Create "profiles" table CREATE TABLE "public"."profiles" ("user_id" bigint NOT NULL, "bio" text NULL, "avatar_url" character varying(255) NULL, "website_url" character varying(100) NULL, PRIMARY KEY ("user_id"), CONSTRAINT "profiles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "public"."users" ("user_id") ON UPDATE NO ACTION ON DELETE CASCADE); -- Create index "profiles_user_id_idx" to table: "profiles" diff --git a/enshi_back/middleware/TargetMiddleware.go b/enshi_back/middleware/TargetMiddleware.go index ea7d3ac..4678189 100644 --- a/enshi_back/middleware/TargetMiddleware.go +++ b/enshi_back/middleware/TargetMiddleware.go @@ -22,7 +22,7 @@ func TargetMiddleware() gin.HandlerFunc { case "POST": c.Set("target", POST) case "GET": - c.Set("target", DELETE) + c.Set("target", GET) } c.Next() diff --git a/enshi_back/middleware/getters/claims.go b/enshi_back/middleware/getters/claims.go index 19d170d..95e5e7f 100644 --- a/enshi_back/middleware/getters/claims.go +++ b/enshi_back/middleware/getters/claims.go @@ -16,7 +16,7 @@ func GetClaimsFromContext(c *gin.Context) (auth.UserInfoJWT, error) { claims, exists := c.Get(global.ContextTokenData) if !exists { - return auth.UserInfoJWT{}, fmt.Errorf("error getting user id") + return auth.UserInfoJWT{}, fmt.Errorf("error getting user id 1") } parsedUserId, err := strconv.ParseInt( diff --git a/enshi_back/middleware/getters/userId.go b/enshi_back/middleware/getters/userId.go index 7afaead..7e2f479 100644 --- a/enshi_back/middleware/getters/userId.go +++ b/enshi_back/middleware/getters/userId.go @@ -12,7 +12,7 @@ func GetUserIdFromContext(c *gin.Context) (int64, error) { userId, exists := c.Get(global.ContextUserId) if !exists { - return -1, fmt.Errorf("error getting user id") + return -1, fmt.Errorf("error getting user id 2") } if parsedUserId, err := strconv.ParseInt(userId.(string), 10, 64); err != nil { diff --git a/enshi_back/routes/middlewareSetup.go b/enshi_back/routes/middlewareSetup.go index e2be4b2..64d0f2e 100644 --- a/enshi_back/routes/middlewareSetup.go +++ b/enshi_back/routes/middlewareSetup.go @@ -14,6 +14,7 @@ const ( POST_BLOG_MIDDLEWARE = "POST_BLOG_MIDDLEWARE" POST_VOTE_MIDDLEWARE = "POST_VOTE_MIDDLEWARE" POST_VOTES_MIDDLEWARE = "POST_VOTES_MIDDLEWARE" + USER_MIDDLEWARE = "USER_MIDDLEWARE" ) var MiddlewareProvider = middleware.MiddlewareProvider{ @@ -152,6 +153,25 @@ var policiesToRegister = map[string]middleware.RulesToCheck{ MustBeCompleted: rules.ALL_RULES_MUST_BE_COMPLETED, }, }, + + USER_MIDDLEWARE: { + middleware.GET: { + Rules: make([]rules.RuleFunction, 0), + MustBeCompleted: rules.ALL_RULES_MUST_BE_COMPLETED, + }, + middleware.PUT: { + Rules: []rules.RuleFunction{ + globalrules.AuthorizedRule, + }, + MustBeCompleted: rules.ALL_RULES_MUST_BE_COMPLETED, + }, + middleware.DELETE: { + Rules: []rules.RuleFunction{ + globalrules.IsAdminRule, + }, + MustBeCompleted: rules.ALL_RULES_MUST_BE_COMPLETED, + }, + }, } func InitMiddlewareProvider() { diff --git a/enshi_back/routes/routesSetup.go b/enshi_back/routes/routesSetup.go index 152b676..bb3cf0e 100644 --- a/enshi_back/routes/routesSetup.go +++ b/enshi_back/routes/routesSetup.go @@ -194,6 +194,14 @@ func SetupRotes(g *gin.Engine) error { voteroutes.GetVotes, ) + userGroup := g.Group("/users/") + userGroup.Use(MiddlewareProvider.GetMiddleware(USER_MIDDLEWARE)) + + userGroup.GET( + "/info/:user-id", + userroutes.GetUserInfo, + ) + // Admin group routes adminGroup := g.Group("/admin/") adminGroup.Use(middleware.AdminMiddleware()) diff --git a/enshi_back/routes/userRoutes/getUserInfo.go b/enshi_back/routes/userRoutes/getUserInfo.go new file mode 100644 index 0000000..b6c441d --- /dev/null +++ b/enshi_back/routes/userRoutes/getUserInfo.go @@ -0,0 +1,35 @@ +package userroutes + +import ( + "context" + db_repo "enshi/db/go_queries" + "enshi/db_connection" + "enshi/middleware/getters" + + "github.com/gin-gonic/gin" +) + +func GetUserInfo(c *gin.Context) { + userId, err := getters.GetInt64Param(c, "user-id") + if err != nil { + c.JSON(400, gin.H{"error": "Invalid user ID"}) + return + } + + userInfo, err := db_repo.New(db_connection.Dbx).GetUserById(context.Background(), userId) + if err != nil { + c.JSON(500, gin.H{"error": "Failed to retrieve user information"}) + return + } + + userProfileInfo, err := db_repo.New(db_connection.Dbx).GetProfileByUserId(context.Background(), userId) + if err != nil { + c.JSON(500, gin.H{"error": "Failed to retrieve user profile information"}) + return + } + + c.JSON(200, gin.H{ + "user_info": userInfo, + "profile_info": userProfileInfo, + }) +}