From 03c2434236960893f780c0b3495b71692d145597 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Wed, 28 May 2025 02:29:14 +0900 Subject: [PATCH] #11 --- backend/app/controllers/users_controller.rb | 25 ++++++++++----- backend/config/routes.rb | 7 ++++- frontend/src/App.tsx | 34 ++++++++++++++++++++- frontend/src/components/TopNav.tsx | 13 ++++++-- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/backend/app/controllers/users_controller.rb b/backend/app/controllers/users_controller.rb index 69c5332..35b9160 100644 --- a/backend/app/controllers/users_controller.rb +++ b/backend/app/controllers/users_controller.rb @@ -1,16 +1,25 @@ class UsersController < ApplicationController - def index - end - - def show - end - def create + user = User.create!(inheritance_code: SecureRandom.uuid, role: 'guest') + render json: { code: user.inheritance_code, + user: user.slice(:id, :name, :inheritance_code, :role) } end - def update + def verify + user = User.find_by(inheritance_code: params[:code]) + render json: if user + { valid: true, user: user.slice(:id, :name, :inheritance_code, :role) } + else + { valid: false } + end end - def destroy + def me + user = User.find_by(inheritance_code: params[:code]) + render(if user + { json: user.slice(:id, :name, :inheritance_code, :role) } + else + { json: { error: 'not found' }, status: :not_found } + end) end end diff --git a/backend/config/routes.rb b/backend/config/routes.rb index ca99178..882a5f8 100644 --- a/backend/config/routes.rb +++ b/backend/config/routes.rb @@ -61,7 +61,12 @@ Rails.application.routes.draw do resources :tags resources :user_ips resources :user_post_views - resources :users + resources :users, only: [:create] do + collection do + post :verify + get :me + end + end resources :wiki_pages # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index c27eb2b..236c2de 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -6,6 +6,8 @@ import TopNav from './components/TopNav' import TagSidebar from './components/TagSidebar' import PostPage from './pages/PostPage' import PostDetailPage from './pages/PostDetailPage' +import { API_BASE_URL } from './config' +import axios from 'axios' type Tag = { id: number name: string @@ -17,18 +19,48 @@ type Post = { id: number thumbnail: string tags: Tag[] } +type User = { id: number + name: string | null + inheritanceCode: string + role: string } + const App = () => { const [posts, setPosts] = useState ([]) + const [user, setUser] = useState (null) useEffect (() => { + const createUser = () => ( + axios.post (`${ API_BASE_URL }/users`) + .then (res => { + if (res.data.code) + { + localStorage.setItem ('user_code', res.data.code) + setUser (res.data) + } + })) + + const code = localStorage.getItem ('user_code') + if (code) + { + void (axios.post (`${ API_BASE_URL }/users/verify`, { code }) + .then (res => { + if (res.data.valid) + setUser (res.data.user) + else + createUser () + })) + } + else + createUser () + alert ('このサイトはまだ作りかけです!!!!\n出てけ!!!!!!!!!!!!!!!!!!!!') }, []) return (
- +
diff --git a/frontend/src/components/TopNav.tsx b/frontend/src/components/TopNav.tsx index 89fe2c4..d4361db 100644 --- a/frontend/src/components/TopNav.tsx +++ b/frontend/src/components/TopNav.tsx @@ -1,7 +1,15 @@ import React from "react" import { Link } from 'react-router-dom' -const TopNav: React.FC = () => ( +type User = { id: number + name: string | null + inheritanceCode: string + role: string } + +type Props = { user: User } + + +const TopNav: React.FC = ({ user }: Props) => ( ) + export default TopNav