From f5b4e9c6adc66c5289fda211c3be564f5932a7e9 Mon Sep 17 00:00:00 2001 From: Kenryu Shibata Date: Mon, 7 Oct 2024 00:53:35 +0900 Subject: [PATCH] Added gallery database and refactored src-manager --- assets/databases/gallery.db | Bin 0 -> 8192 bytes src-manager/README.md | 15 ++- src-manager/api/gallery-image.js | 133 +++++++++++++++++++ src-manager/api/index.js | 13 ++ src-manager/api/news-list.js | 47 +++++++ src-manager/api/news.js | 112 ++++++++++++++++ src-manager/app.js | 138 +------------------- src-manager/package-lock.json | 30 ++--- src-manager/pages/index.html | 33 ++++- src-manager/pages/new-gallery-image.html | 51 ++++++++ src-manager/pages/new-news.html | 6 +- src-manager/pages/update-gallery-image.html | 67 ++++++++++ src-manager/pages/update-news.html | 6 +- 13 files changed, 492 insertions(+), 159 deletions(-) create mode 100644 assets/databases/gallery.db create mode 100644 src-manager/api/gallery-image.js create mode 100644 src-manager/api/index.js create mode 100644 src-manager/api/news-list.js create mode 100644 src-manager/api/news.js create mode 100644 src-manager/pages/new-gallery-image.html create mode 100644 src-manager/pages/update-gallery-image.html diff --git a/assets/databases/gallery.db b/assets/databases/gallery.db new file mode 100644 index 0000000000000000000000000000000000000000..2726d698b08a4425f7d197c152899449d620106b GIT binary patch literal 8192 zcmeI$K}y3w6b9g#5)cbgcP@(Xz)cIb0lk2+3=)iKO-Hb9WVA6xQxno4xU9K=3s2zQ z8+Zh7k(IY_A_*>BxDWp$lS%#z1NnCIrl(Gr`E(Pf3zgA6+hm-x10u$lp+`%Py10HQ zv%1Rn|H@#)^ld}0;++eoFBAkI009U<00Izz00bZa0SG{#VFIfizP8ov^5^YLT}6JN zqR3C5s;M>dge3(@>(CKYh16@WhjX%BDUO6k?pTt0<~X}LU8umHsO*-cIM?a#mur<| zVf^qXAC29q^enwsz58WyPZQ5RvAh`_iy8I8dB5E+&*u8j&pMwCr=%%5h#(yW>artUio()iI&m&3axDDw9r|0wboeg9g$s&9}U BP$&QZ literal 0 HcmV?d00001 diff --git a/src-manager/README.md b/src-manager/README.md index d83b52f..b09668e 100644 --- a/src-manager/README.md +++ b/src-manager/README.md @@ -22,7 +22,7 @@ npm run dev # JSファイル変更時に自動リロードが入る開発サー ## データベース -テーブル: news +### ファイル: news.db / テーブル: news * id - PRIMARY KEY - 整数 * date - Unix時間 - 整数 @@ -32,6 +32,12 @@ npm run dev # JSファイル変更時に自動リロードが入る開発サー * linkPath - ニュースリストで表示されるリンク先 - 文字列 * coverImagePath - ニュースリストで表示される画像へのパス - 文字列 +### ファイル: gallery.db / テーブル: gallery + +* id - PRIMARY KEY - 整数 +* imagePath - 画像へのパス - 文字列 +* caption - 画像の説明文 - 文字列 + ## API(RESTful) * `/api/news` @@ -41,3 +47,10 @@ npm run dev # JSファイル変更時に自動リロードが入る開発サー * DELETE: Unix時間で特定されたニュースを削除する - `?target=` * `/api/news-list` * GET: 全ニュースの情報を取得する + +* `/api/gallery-image` + * GET(`/`): IDで指定された画像へのパスと説明文を取得する - `?target=` + * GET(`/list`): 全画像の情報を取得する + * POST: 新しい画像の情報を追加する + * PUT: 画像の情報を更新する + * DELETE: IDで指定された画像の情報を削除する - `?target=` \ No newline at end of file diff --git a/src-manager/api/gallery-image.js b/src-manager/api/gallery-image.js new file mode 100644 index 0000000..fe0e1b0 --- /dev/null +++ b/src-manager/api/gallery-image.js @@ -0,0 +1,133 @@ +import express from 'express'; +import sqlite3 from 'sqlite3'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { asyncDatabaseRead, asyncDatabaseWrite } from '../utils/asyncDatabase.js'; + +const galleryImageAPI = express.Router(); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const databasePath = path.join(__dirname, "../../assets/databases/gallery.db"); + +galleryImageAPI.get('/list', async (request, response) => { + const database = new sqlite3.Database(databasePath); + const sqlQuery = "SELECT * FROM gallery"; + + try { + const result = await asyncDatabaseRead(database, sqlQuery, (rows) => { + let ret = ""; + for (const entry of rows) { + ret = ret + "\n"; + for (const data in entry) { + ret = ret + `${entry[data]}\n`; + } + ret = ret + `\n + \n + \n + \n\n`; + } + return ret; + }); + + database.close() + response.send(result); + } catch (err) { + console.error(err); + database.close(); + } +}); + +galleryImageAPI.get('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const target = Number(request.query.target); + + if (isNaN(target)) { + response.status(500).send("Query is not number"); + return; + } + + const sqlQuery = `SELECT * FROM gallery WHERE id = ${target}`; + + try { + const result = await asyncDatabaseRead(database, sqlQuery, (rows) => {return rows[0]}); + database.close(); + response.send(result); + } catch (err) { + console.error(err); + database.close(); + } +}); + +galleryImageAPI.post('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const imagePath = request.body.imagePath; + const caption = request.body.caption; + + const sqlQuery = `INSERT INTO gallery (imagePath, caption) VALUES ("${imagePath}", "${caption}");`; + + try { + await asyncDatabaseWrite(database, sqlQuery, () => { + console.log("Image added successfully."); + }); + } catch (err) { + response.status(500).send(err); + } + + database.close(); + response.end(); +}); + +galleryImageAPI.put('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const target = Number(request.body.target); + + if (isNaN(target)) { + response.status(500).send("Query is not number"); + return; + } + + const imagePath = request.body.imagePath; + const caption = request.body.caption; + + const sqlQuery = `UPDATE gallery SET imagePath = "${imagePath}", caption = "${caption}" WHERE id = ${target};`; + + try { + await asyncDatabaseWrite(database, sqlQuery, () => { + console.log("Image updated successfully."); + }); + } catch (err) { + response.status(500).send(err); + } + + database.close(); + response.end(); +}); + +galleryImageAPI.delete('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const target = Number(request.query.target); + + if (isNaN(target)) { + response.status(404).send('No Entry Found!'); + return; + } + + const sqlQuery = `DELETE FROM gallery WHERE id = ${target};`; + + try { + await asyncDatabaseWrite(database, sqlQuery, () => { + console.log("Image deleted successfully."); + }); + } catch (err) { + response.status(500).send(err); + } + + database.close(); + response.status(200).send(); +}); + +export default galleryImageAPI; \ No newline at end of file diff --git a/src-manager/api/index.js b/src-manager/api/index.js new file mode 100644 index 0000000..6ed8597 --- /dev/null +++ b/src-manager/api/index.js @@ -0,0 +1,13 @@ +import express from 'express'; + +import newsAPI from './news.js'; +import newsListAPI from './news-list.js'; +import galleryImageAPI from './gallery-image.js'; + +const router = express.Router(); + +router.use('/news', newsAPI); +router.use('/news-list', newsListAPI); +router.use('/gallery-image', galleryImageAPI); + +export default router; \ No newline at end of file diff --git a/src-manager/api/news-list.js b/src-manager/api/news-list.js new file mode 100644 index 0000000..fb3ef2a --- /dev/null +++ b/src-manager/api/news-list.js @@ -0,0 +1,47 @@ +import express from 'express'; +import sqlite3 from 'sqlite3'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { asyncDatabaseRead } from '../utils/asyncDatabase.js'; + +const newsListAPI = express.Router(); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const databasePath = path.join(__dirname, "../../assets/databases/news.db"); + +newsListAPI.get('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + const sqlQuery = `SELECT * FROM news ORDER BY date DESC;`; + try { + const result = await asyncDatabaseRead(database, sqlQuery, (rows) => { + let ret = ""; + for (const entry of rows) { + ret = ret + "\n"; + for (const data in entry) { + if (data == "article" || data == "coverImagePath" || data == "linkPath") continue; + if (data == "entryType") { + ret = ret + `${entry[data] == 0 ? "Article" : "Tweet"}\n`; + continue; + } + if (data == "date") { + ret = ret + `${new Date(entry[data]).toLocaleString()}\n`; + continue; + } + ret = ret + `${entry[data]}\n`; + } + ret = ret + `\n + \n + \n + \n\n`; + } + return ret + }); + database.close(); + response.send(result); + } catch (err) { + console.error(err); + database.close(); + } +}); + +export default newsListAPI; \ No newline at end of file diff --git a/src-manager/api/news.js b/src-manager/api/news.js new file mode 100644 index 0000000..3507124 --- /dev/null +++ b/src-manager/api/news.js @@ -0,0 +1,112 @@ +import express from 'express'; +import sqlite3 from 'sqlite3'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { asyncDatabaseRead, asyncDatabaseWrite } from '../utils/asyncDatabase.js'; + +const newsAPI = express.Router(); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const databasePath = path.join(__dirname, "../../assets/databases/news.db"); + +newsAPI.get('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const target = Number(request.query.target); + + if (isNaN(target)) { + response.status(500).send("Query is not number"); + return; + } + + const sqlQuery = `SELECT * FROM news WHERE date = ${target}`; + + try { + const result = await asyncDatabaseRead(database, sqlQuery, (rows) => {return rows[0]}); + database.close(); + response.send(result); + } catch (err) { + console.error(err); + database.close(); + } +}); + +newsAPI.post('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const currentDate = new Date(); + const currentUnixTime = currentDate.valueOf(); + const entryType = request.body.entryType; + const cardContent = request.body.cardContent; + const article = request.body.article; + const linkPath = entryType == 0 ? `/news/${request.body.linkPath}` : ""; + const coverImagePath = request.body.coverImagePath; + + const sqlQuery = `INSERT INTO news (date, entryType, cardContent, article, linkPath, coverImagePath) VALUES (${currentUnixTime}, ${entryType}, "${cardContent}", "${article}", "${linkPath}", "${coverImagePath}");`; + + try { + await asyncDatabaseWrite(database, sqlQuery, () => { + console.log("News added successfully."); + }); + } catch (err) { + response.status(500).send(err); + } + database.close(); + response.end(); +}); + +newsAPI.put('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const target = Number(request.body.target); + const entryType = Number(request.body.entryType); + const cardContent = request.body.cardContent; + const article = request.body.article; + const linkPath = entryType == 0 ? `/news/${request.body.linkPath}` : ""; + const coverImagePath = request.body.coverImagePath; + + if (isNaN(target)) { + response.status(500).send('Target is not number'); + return; + } + + const sqlQuery = `UPDATE news SET entryType = ${entryType}, cardContent = "${cardContent}", article = "${article}", linkPath = "${linkPath}", coverImagePath = "${coverImagePath}" WHERE date = ${target};`; + + try { + await asyncDatabaseWrite(database, sqlQuery, () => { + console.log("News updated successfully."); + }); + } catch (err) { + response.status(500).send(err); + } + + database.close(); + response.end(); +}); + +newsAPI.delete('/', async (request, response) => { + const database = new sqlite3.Database(databasePath); + + const target = Number(request.query.target); + + if (isNaN(target)) { + response.status(404).send('No Entry Found!'); + return; + } + + const sqlQuery = `DELETE FROM news WHERE date = ${target}`; + + try { + await asyncDatabaseWrite(database, sqlQuery, () => { + console.log("News deleted successfully."); + }); + } catch (err) { + response.status(500).send(err); + } + + database.close(); + + response.status(200).send(); +}); + +export default newsAPI; \ No newline at end of file diff --git a/src-manager/app.js b/src-manager/app.js index 3f25de5..c816749 100644 --- a/src-manager/app.js +++ b/src-manager/app.js @@ -1,8 +1,7 @@ import express from 'express'; -import sqlite3 from 'sqlite3'; import path from 'path'; import { fileURLToPath } from 'url'; -import { asyncDatabaseRead, asyncDatabaseWrite } from './utils/asyncDatabase.js'; +import router from './api/index.js'; const app = express(); const port = 3001; @@ -14,140 +13,7 @@ app.use(express.static(path.join(__dirname, 'pages'))); app.use(express.static(path.join(__dirname, "../assets"))); app.use(express.static(path.join(__dirname, "../public"))); -app.get('/api/news-list', async (request, response) => { - const database = new sqlite3.Database(path.join(__dirname, "../assets/databases/news.db")); - const sqlQuery = `SELECT * FROM news ORDER BY date DESC;`; - try { - const result = await asyncDatabaseRead(database, sqlQuery, (rows) => { - let ret = ""; - for (const entry of rows) { - ret = ret + "\n"; - for (const data in entry) { - if (data == "article" || data == "coverImagePath" || data == "linkPath") continue; - if (data == "entryType") { - ret = ret + `${entry[data] == 0 ? "Article" : "Tweet"}\n`; - continue; - } - if (data == "date") { - ret = ret + `${new Date(entry[data]).toLocaleString()}\n`; - continue; - } - ret = ret + `${entry[data]}\n`; - } - ret = ret + `\n - \n - \n - \n\n`; - } - return ret - }); - database.close(); - response.send(result); - } catch (err) { - console.error(err); - database.close(); - } -}); - -app.get('/api/news', async (request, response) => { - const database = new sqlite3.Database(path.join(__dirname, "../assets/databases/news.db")); - - const target = Number(request.query.target); - - if (isNaN(target)) { - response.status(500).send("Query is not number"); - return; - } - - const sqlQuery = `SELECT * FROM news WHERE date = ${target}`; - - try { - const result = await asyncDatabaseRead(database, sqlQuery, (rows) => {return rows[0]}); - database.close(); - response.send(result); - } catch (err) { - console.error(err); - database.close(); - } -}); - -app.post('/api/news', async (request, response) => { - const database = new sqlite3.Database(path.join(__dirname, "../assets/databases/news.db")); - - const currentDate = new Date(); - const currentUnixTime = currentDate.valueOf(); - const entryType = request.body.entryType; - const cardContent = request.body.cardContent; - const article = request.body.article; - const linkPath = entryType == 0 ? `/news/${request.body.linkPath}` : ""; - const coverImagePath = request.body.coverImagePath; - - const sqlQuery = `INSERT INTO news (date, entryType, cardContent, article, linkPath, coverImagePath) VALUES (${currentUnixTime}, ${entryType}, "${cardContent}", "${article}", "${linkPath}", "${coverImagePath}");`; - - try { - await asyncDatabaseWrite(database, sqlQuery, () => { - console.log("News added successfully."); - }); - } catch (err) { - response.status(500).send(err); - } - database.close(); - response.end(); -}); - -app.put('/api/news', async (request, response) => { - const database = new sqlite3.Database(path.join(__dirname, "../assets/databases/news.db")); - - const target = Number(request.body.target); - const entryType = Number(request.body.entryType); - const cardContent = request.body.cardContent; - const article = request.body.article; - const linkPath = entryType == 0 ? `/news/${request.body.linkPath}` : ""; - const coverImagePath = request.body.coverImagePath; - - if (isNaN(target)) { - response.status(500).send('Target is not number'); - return; - } - - const sqlQuery = `UPDATE news SET entryType = ${entryType}, cardContent = "${cardContent}", article = "${article}", linkPath = "${linkPath}", coverImagePath = "${coverImagePath}" WHERE date = ${target};`; - - try { - await asyncDatabaseWrite(database, sqlQuery, () => { - console.log("News updated successfully."); - }); - } catch (err) { - response.status(500).send(err); - } - - database.close(); - response.end(); -}); - -app.delete('/api/news', async (request, response) => { - const database = new sqlite3.Database(path.join(__dirname, "../assets/databases/news.db")); - - const target = Number(request.query.target); - - if (isNaN(target)) { - response.status(404).send('No Entry Found!'); - return; - } - - const sqlQuery = `DELETE FROM news WHERE date = ${target}`; - - try { - await asyncDatabaseWrite(database, sqlQuery, () => { - console.log("News deleted successfully."); - }); - } catch (err) { - response.status(500).send(err); - } - - database.close(); - - response.status(200).send(); -}); +app.use('/api', router); app.listen(port, () => { console.log(`Manager is now listening on port ${port}`); diff --git a/src-manager/package-lock.json b/src-manager/package-lock.json index 6e128d7..b25433b 100644 --- a/src-manager/package-lock.json +++ b/src-manager/package-lock.json @@ -18,9 +18,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, "license": "MIT", "engines": { @@ -28,9 +28,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true, "license": "MIT", "engines": { @@ -38,13 +38,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.25.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -54,14 +54,14 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { diff --git a/src-manager/pages/index.html b/src-manager/pages/index.html index 5397f83..f330a55 100644 --- a/src-manager/pages/index.html +++ b/src-manager/pages/index.html @@ -27,9 +27,14 @@
  • New News
  • +
  • + New Gallery Image +
  • - +

    News

    + + @@ -40,11 +45,33 @@ - + +
    Actions
    + +

    Gallery Images

    + + + + + + + + + + + +
    IDImage PathCaptionActions
    diff --git a/src-manager/pages/new-gallery-image.html b/src-manager/pages/new-gallery-image.html new file mode 100644 index 0000000..16b817e --- /dev/null +++ b/src-manager/pages/new-gallery-image.html @@ -0,0 +1,51 @@ + + + + + Content Manager - new gallery image + + + + + + + + \ No newline at end of file diff --git a/src-manager/pages/new-news.html b/src-manager/pages/new-news.html index cf1be24..c8eb55f 100644 --- a/src-manager/pages/new-news.html +++ b/src-manager/pages/new-news.html @@ -3,6 +3,8 @@ Content Manager - new news + + + + + + + + \ No newline at end of file diff --git a/src-manager/pages/update-news.html b/src-manager/pages/update-news.html index 7521902..87e1412 100644 --- a/src-manager/pages/update-news.html +++ b/src-manager/pages/update-news.html @@ -3,6 +3,8 @@ Content Manager - update news + + @@ -59,12 +61,12 @@ -
    +

    Previews

    Card Content

    Article

    -
    +