From 0c4ee9744e3a7e977a51a55190f36ace204116f9 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Wed, 18 Jun 2025 23:44:33 +0900 Subject: [PATCH] =?UTF-8?q?#45=20=E5=B7=AE=E5=88=86=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E4=BB=A5=E5=A4=96=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controllers/wiki_pages_controller.rb | 15 +++-- backend/app/models/wiki_page.rb | 9 ++- frontend/src/pages/WikiHistoryPage.tsx | 57 +++++++++++++++++++ frontend/src/types.ts | 12 ++++ 4 files changed, 83 insertions(+), 10 deletions(-) diff --git a/backend/app/controllers/wiki_pages_controller.rb b/backend/app/controllers/wiki_pages_controller.rb index c1d9a17..2500101 100644 --- a/backend/app/controllers/wiki_pages_controller.rb +++ b/backend/app/controllers/wiki_pages_controller.rb @@ -52,12 +52,17 @@ class WikiPagesController < ApplicationController def changes id = params[:id] - log = id.present? ? wiki.page("#{ id }.md").versions : wiki.repo.log('main', nil, max_count: 50) + log = id.present? ? wiki.page("#{ id }.md")&.versions : wiki.repo.log('main', nil, max_count: 50) + return render json: [] unless log + render json: log.map { |commit| - { sha: commit.id, - author: commit.author.name, - message: commit.message, - timestamp: commit.authored_date } } + wiki_page = WikiPage.find(commit.message.split(' ')[1].to_i) + user = User.find(commit.author.name.to_i) + { sha: commit.id, + wiki_page: wiki_page && { id: wiki_page.id, title: wiki_page.title }, + user: user && { id: user.id, name: user.name }, + change_type: commit.message.split(' ')[0].downcase[0...(-1)], + timestamp: commit.authored_date } } end private diff --git a/backend/app/models/wiki_page.rb b/backend/app/models/wiki_page.rb index 0d71ffd..58bbf7e 100644 --- a/backend/app/models/wiki_page.rb +++ b/backend/app/models/wiki_page.rb @@ -14,15 +14,14 @@ class WikiPage < ApplicationRecord end def set_body content, user: - page = wiki.page("#{ id }.md") - - commit_info = { message: "Update #{ title }", - name: user.id.to_s, + commit_info = { name: user.id.to_s, email: 'dummy@example.com' } - + page = wiki.page("#{ id }.md") if page + commit_info[:message] = "Updated #{ id }" wiki.update_page(page, id.to_s, :markdown, content, commit_info) else + commit_info[:message] = "Created #{ id }" wiki.write_page(id.to_s, :markdown, content, commit_info) end end diff --git a/frontend/src/pages/WikiHistoryPage.tsx b/frontend/src/pages/WikiHistoryPage.tsx index eaf0389..7bb5a9f 100644 --- a/frontend/src/pages/WikiHistoryPage.tsx +++ b/frontend/src/pages/WikiHistoryPage.tsx @@ -1,8 +1,65 @@ +import { useEffect, useState } from 'react' +import { Link, useLocation, useParams } from 'react-router-dom' import MainArea from '@/components/layout/MainArea' +import axios from 'axios' +import { API_BASE_URL } from '@/config' + +import type { WikiPageChange } from '@/types' export default () => { + const [changes, setChanges] = useState ([]) + + const location = useLocation () + const query = new URLSearchParams (location.search) + const id = query.get ('id') + + useEffect (() => { + void (axios.get (`${ API_BASE_URL }/wiki/changes`, id && { params: { id } }) + .then (res => setChanges (res.data))) + }, [location.search]) + return ( + + + + + + + + + + + {changes.map (change => ( + + + + + + ))} + +
タイトル変更日時
差分 + + {change.wiki_page.title} + + + {(() => { + switch (change.change_type) + { + case 'create': return '新規' + case 'update': return '更新' + case 'delete': return '削除' + } + }) ()} + + + {change.user.name} + +
+ {change.timestamp} +
) } diff --git a/frontend/src/types.ts b/frontend/src/types.ts index dc685b7..dd54a19 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -22,4 +22,16 @@ export type User = { inheritanceCode: string role: UserRole } +export type WikiPage = { + id: number + title: string + updated_at?: string } + +export type WikiPageChange = { + sha: string + wiki_page: WikiPage + user: User + change_type: string + timestamp: string } + export type UserRole = typeof USER_ROLES[number]