diff --git a/src-manager/README.md b/src-manager/README.md index bd242d5..168e30a 100644 --- a/src-manager/README.md +++ b/src-manager/README.md @@ -18,6 +18,7 @@ cd src-manager/ # このディレクトリーに移動 npm install # 依存パッケージのインストール、まだ一度も実行していない場合 npm start # サーバーを起動、ブラウザで http://localhost:3001 に入る npm run dev # JSファイル変更時に自動リロードが入る開発サーバーを起動する。同じく http://localhost:3001 でホストされる +npm run documentation # ドキュメンテーションを生成, "./docs/manager/<バージョン>/" 内で `python -m http.server` 等でローカルでホストする ``` ## データベース diff --git a/src-manager/api/gallery-image.js b/src-manager/api/gallery-image.js index 0f72f82..bffc81b 100644 --- a/src-manager/api/gallery-image.js +++ b/src-manager/api/gallery-image.js @@ -1,28 +1,46 @@ +/** @module api/gallery-image */ import express from 'express'; import sqlite3 from 'sqlite3'; import path from 'path'; import { fileURLToPath } from 'url'; import { asyncDatabaseRead, asyncDatabaseWrite } from '../utils/asyncDatabase.js'; +import { wrapInTable } from '../utils/tableWrapper.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) => { +function generateActionButtons(target) { + return ``; +} + +/** + * Gets list of gallery image entries in HTML table body tr+td + * @param {Object} request + * @param {Object} response + * @returns {string} HTML table body tr+td + * @example + * $ curl -X GET http://localhost:3001/api/gallery-image/list + * // + * // 1 + * // /image/test.png + * // ... + * // + * // ... + */ +const getGalleryImageList = 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 + `\t${entry[data]}\n`; - } - ret = ret + `\t\n\t\t\n\t\t\n\t\n\n`; - } + let rowsCopy = [...rows]; + const withActionButtons = rowsCopy.map((entry) => { + return { ...entry, buttons: generateActionButtons(entry.id) }; + }); + ret = wrapInTable(withActionButtons); return ret; }); @@ -33,9 +51,20 @@ galleryImageAPI.get('/list', async (request, response) => { database.close(); response.status(500).send(err); } -}); +}; +galleryImageAPI.get('/list',getGalleryImageList); -galleryImageAPI.get('/list-unwrapped', async (request, response) => { +/** + * Gets list of gallery image entries in Unformatted JSON string + * @param {Object} request + * @param {Object} response + * @returns {string} Unformatted JSON string that contains gallery image entries + * @example + * $ curl -X GET \ + * http://localhost:3001/api/gallery-image/list-unwrapped + * // gets raw JSON containing gallery image entries + */ +const getGalleryImageListUnwrapped = async (request, response) => { const database = new sqlite3.Database(databasePath); const sqlQuery = "SELECT * FROM gallery"; @@ -49,9 +78,20 @@ galleryImageAPI.get('/list-unwrapped', async (request, response) => { database.close(); response.status(500).send(err); } -}); +}; +galleryImageAPI.get('/list-unwrapped', getGalleryImageListUnwrapped); -galleryImageAPI.get('/', async (request, response) => { +/** + * Get a gallery image information + * @param {Object} request + * @param {number} request.query.target - ID to specify gallery image entry + * @param {Object} response + * @returns {JSON} JSON that contains information about gallery image + * @example + * $ curl -X GET http://localhost:3001/api/gallery-image?target=1 + * // gets gallery image information with ID of 1 + */ +const getGalleryImage = async (request, response) => { const database = new sqlite3.Database(databasePath); const target = Number(request.query.target); @@ -72,9 +112,24 @@ galleryImageAPI.get('/', async (request, response) => { database.close(); response.status(500).send(err); } -}); +}; +galleryImageAPI.get('/', getGalleryImage); -galleryImageAPI.post('/', async (request, response) => { +/** + * Posts gallery image + * @param {Object} request + * @param {string} request.body.imagePath - URL path to image + * @param {string} request.body.caption - Caption of image + * @param {Object} response + * @returns Result is logged into console + * @example + * $ curl -X POST \ + * -H 'Content-Type: application/x-www-form-urlencoded' \ + * --data-raw 'imagePath=/images/launch.png&caption=Launch of our new rocket' \ + * http://localhost:3001/api/gallery-image/ + * // Posts gallery image with given information + */ +const postGalleryImage = async (request, response) => { const database = new sqlite3.Database(databasePath); const imagePath = request.body.imagePath; @@ -93,9 +148,25 @@ galleryImageAPI.post('/', async (request, response) => { database.close(); response.end(); -}); +}; +galleryImageAPI.post('/', postGalleryImage); -galleryImageAPI.put('/', async (request, response) => { +/** + * Updates gallery image + * @param {Object} request + * @param {number} request.body.target - ID to specify gallery image entry + * @param {string} request.body.imagePath - URL path to image + * @param {string} request.body.caption - Caption of image + * @param {Object} response + * @returns Result is logged into console + * @example + * $ curl -X PUT \ + * -H 'Content-Type: application/x-www-form-urlencoded' \ + * --data-raw 'imagePath=/images/launch.png&caption=Launch of our new rocket' \ + * http://localhost:3001/api/gallery-image/ + * // Updates gallery image with given information + */ +const putGalleryImage = async (request, response) => { const database = new sqlite3.Database(databasePath); const target = Number(request.body.target); @@ -121,9 +192,21 @@ galleryImageAPI.put('/', async (request, response) => { database.close(); response.end(); -}); +}; +galleryImageAPI.put('/', putGalleryImage); -galleryImageAPI.delete('/', async (request, response) => { +/** + * Deletes specified gallery image + * @param {Object} request + * @param {string} request.query.target - ID to specify gallery image entry + * @param {Object} response + * @returns Result is logged into console + * @example + * $ curl -X DELETE \ + * http://localhost:3001/api/gallery-image?target=1 + * // Deletes gallery image with ID of 1 + */ +const deleteGalleryImage = async (request, response) => { const database = new sqlite3.Database(databasePath); const target = Number(request.query.target); @@ -146,6 +229,7 @@ galleryImageAPI.delete('/', async (request, response) => { database.close(); response.status(200).send(); -}); +}; +galleryImageAPI.delete('/', deleteGalleryImage); export default galleryImageAPI; diff --git a/src-manager/api/news.js b/src-manager/api/news.js index 9b8b8a0..a9887b2 100644 --- a/src-manager/api/news.js +++ b/src-manager/api/news.js @@ -1,15 +1,43 @@ +/** @module api/news */ import express from 'express'; import sqlite3 from 'sqlite3'; import path from 'path'; import { fileURLToPath } from 'url'; import { asyncDatabaseRead, asyncDatabaseWrite } from '../utils/asyncDatabase.js'; +import { wrapInTable } from '../utils/tableWrapper.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) => { +function renameArticleType(entryType) { + return entryType == 0 ? "Article" : "Tweet"; +} + +function unixTimeToHumanreadableTime(unixTime) { + return (new Date(unixTime).toLocaleString()); +} + +function generateActionButtons(target) { + return ``; +} + +function modifyOrAppendProperty(targetObject, key, value) { + return { ...targetObject, [key]: value }; +} + +/** + * Get single news entry specified by Un*x Timestamp + * @param {Object} request + * @param {number} request.query.target - Un*x Timestamp to specify news entry + * @param {Object} response + * @returns {JSON} news entry data + * @example + * $ curl -X GET http://localhost:3001/api/news?target=0 + * // gets news posted on Un*x epoch in JSON format + */ +const getNewsEntry = async (request, response) => { const database = new sqlite3.Database(databasePath); const target = Number(request.query.target); @@ -23,16 +51,34 @@ newsAPI.get('/', async (request, response) => { const sqlQuery = `SELECT * FROM news WHERE date = ${target}`; try { - const result = await asyncDatabaseRead(database, sqlQuery, (rows) => {return rows[0]}); + const result = await asyncDatabaseRead(database, sqlQuery, (rows) => { return rows[0] }); database.close(); response.send(result); } catch (err) { console.error(err); database.close(); } -}); +} +newsAPI.get('/', getNewsEntry); -newsAPI.post('/', async (request, response) => { +/** + * Post news and write to database + * @param {Object} request + * @param {number} request.body.entryType - Number that represents type of news (0: article, 1: tweet) + * @param {string} request.body.cardContent - Content of news card, Markdown is allowed + * @param {string} request.body.article - Article written in Markdown + * @param {string} request.body.linkPath - Relative URL path to the article + * @param {string} request.body.coverImagePath - Relative URL path to the cover image + * @param {Object} response + * @returns result is logged into console + * @example + * $ curl -X POST \ + * -H 'Content-Type: application/x-www-form-urlencoded' \ + * --data-raw 'entryType=1&cardContent=Test&article=&linkPath=&coverImagePath=/default.png' \ + * http://localhost:3001/api/news + * // Posts Tweet style news with content "Test" and cover image "/default.png" + */ +const postNewsEntry = async (request, response) => { const database = new sqlite3.Database(databasePath); const currentDate = new Date(); @@ -55,9 +101,28 @@ newsAPI.post('/', async (request, response) => { } database.close(); response.end(); -}); +}; +newsAPI.post('/', postNewsEntry); -newsAPI.put('/', async (request, response) => { +/** + * Update news entry + * @param {Object} request + * @param {number} request.body.target - Un*x timestamp to identify the entry + * @param {number} request.body.entryType - Number that represents type of news (0: article, 1: tweet) + * @param {string} request.body.cardContent - Content of news card, Markdown is allowed + * @param {string} request.body.article - Article written in Markdown + * @param {string} request.body.linkPath - Relative URL path to the article + * @param {string} request.body.coverImagePath - Relative URL path to the cover image + * @param {Object} response + * @returns result is logged into console + * @example + * $ curl -X PUT \ + * -H 'Content-Type: application/x-www-form-urlencoded' \ + * --data-raw 'target=0&entryType=1&cardContent=Test&article=&linkPath=&coverImagePath=default.png' \ + * http://localhost:3001/api/news + * // Update news posted on Un*x Epoch with given contents + */ +const putNewsEntry = async (request, response) => { const database = new sqlite3.Database(databasePath); const target = Number(request.body.target); @@ -86,9 +151,21 @@ newsAPI.put('/', async (request, response) => { database.close(); response.end(); -}); +}; +newsAPI.put('/', putNewsEntry); -newsAPI.delete('/', async (request, response) => { +/** + * Delete news specified by Un*x Timestamp + * @param {Object} request + * @param {number} request.query.target - Un*x timestamp to identify the entry + * @param {Object} response + * @returns result is logged into console + * @example + * $ curl -X DELETE \ + * http://localhost:3001/api/news?target=0 + * // Delete news posted on Un*x Epoch + */ +const deleteNewsEntry = async (request, response) => { const database = new sqlite3.Database(databasePath); const target = Number(request.query.target); @@ -113,30 +190,45 @@ newsAPI.delete('/', async (request, response) => { database.close(); response.status(200).send(); -}); +}; +newsAPI.delete('/', deleteNewsEntry); -newsAPI.get('/list', async (request, response) => { +/** + * Get news list in HTML table body tr+td + * @param {Object} request + * @param {Object} response + * @returns {string} HTML table body tr+td + * @example + * $ curl -X GET \ + * http://localhost:3001/api/news/list + * // + * // 1 + * // 1970/1/1 0:0:0 + * // ... + * // + * // ... + */ +const getNewsList = async (request, response) => { const database = new sqlite3.Database(databasePath); const sqlQuery = `SELECT id, date, entryType, cardContent 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 == "entryType") { - ret = ret + `\t${entry[data] == 0 ? "Article" : "Tweet"}\n`; - continue; - } - if (data == "date") { - ret = ret + `\t${new Date(entry[data]).toLocaleString()}\n`; - continue; - } - ret = ret + `\t${entry[data]}\n`; - } - ret = ret + `\t\n\t\t\n\t\t\n\t\n\n`; - } - return ret + const rowsCopy = [...rows]; + const rowsWithButtons = rowsCopy.map((entry) => { + const appendButtons = (value) => modifyOrAppendProperty(entry, "buttons", value); + return appendButtons(generateActionButtons(entry.date)); + }); + const renamedArticleTypeRows = rowsWithButtons.map((entry) => { + const modifyEntryType = (value) => modifyOrAppendProperty(entry, "entryType", value); + return modifyEntryType(renameArticleType(entry.entryType)); + }); + const convertedTimeRows = renamedArticleTypeRows.map((entry) => { + const modifyDate = (value) => modifyOrAppendProperty(entry, "date", value); + return modifyDate(unixTimeToHumanreadableTime(entry.date)); + }); + ret = wrapInTable(convertedTimeRows); + return ret; }); database.close(); response.send(result); @@ -144,9 +236,20 @@ newsAPI.get('/list', async (request, response) => { console.error(err); database.close(); } -}); +}; +newsAPI.get('/list', getNewsList); -newsAPI.get('/list-unwrapped', async (request, response) => { +/** + * Get news list in unformated raw JSON string + * @param {Object} request + * @param {Object} response + * @returns {JSON} Unformatted JSON string that contains news entries + * @example + * $ curl -X GET \ + * http://localhost:3001/api/news/list-unwrapped + * // gets raw JSON containing news entries + */ +const getNewsListUnrwapped = async (request, response) => { const database = new sqlite3.Database(databasePath); const sqlQuery = `SELECT id, date, entryType, cardContent FROM news ORDER BY date DESC;`; @@ -159,6 +262,7 @@ newsAPI.get('/list-unwrapped', async (request, response) => { console.error(err); database.close(); } -}); +}; +newsAPI.get('/list-unwrapped', getNewsListUnrwapped); export default newsAPI; diff --git a/src-manager/docs/manager/1.0.0/api_gallery-image.js.html b/src-manager/docs/manager/1.0.0/api_gallery-image.js.html new file mode 100644 index 0000000..81838b6 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/api_gallery-image.js.html @@ -0,0 +1,286 @@ + + + + + JSDoc: Source: api/gallery-image.js + + + + + + + + + + +
+ +

Source: api/gallery-image.js

+ + + + + + +
+
+
/** @module api/gallery-image */
+import express from 'express';
+import sqlite3 from 'sqlite3';
+import path from 'path';
+import { fileURLToPath } from 'url';
+import { asyncDatabaseRead, asyncDatabaseWrite } from '../utils/asyncDatabase.js';
+import { wrapInTable } from '../utils/tableWrapper.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");
+
+function generateActionButtons(target) {
+    return `<button class='delete-button' hx-delete='/api/gallery-image?target=${target}'>Delete</button><a href='/update-gallery-image.html?target=${target}'><button class='edit-button' hx-confirm='unset'>Edit</button></a>`;
+}
+
+/**
+ * Gets list of gallery image entries in HTML table body tr+td
+ * @param {Object} request
+ * @param {Object} response
+ * @returns {string} HTML table body tr+td
+ * @example
+ * $ curl -X GET http://localhost:3001/api/gallery-image/list
+ * // <tr>
+ * //     <td>1</td>
+ * //     <td>/image/test.png</td>
+ * //     ...
+ * // </tr>
+ * // ...
+ */
+const getGalleryImageList = async (request, response) => {
+    const database = new sqlite3.Database(databasePath);
+    const sqlQuery = "SELECT * FROM gallery";
+
+    try {
+        const result = await asyncDatabaseRead(database, sqlQuery, (rows) => {
+            let ret = "";
+            let rowsCopy = [...rows];
+            const withActionButtons = rowsCopy.map((entry) => {
+                return { ...entry, buttons: generateActionButtons(entry.id) };
+            });
+            ret = wrapInTable(withActionButtons);
+            return ret;
+        });
+
+        database.close()
+        response.send(result);
+    } catch (err) {
+        console.error(err);
+        database.close();
+        response.status(500).send(err);
+    }
+};
+galleryImageAPI.get('/list',getGalleryImageList);
+
+/**
+ * Gets list of gallery image entries in Unformatted JSON string
+ * @param {Object} request
+ * @param {Object} response
+ * @returns {string} Unformatted JSON string that contains gallery image entries
+ * @example
+ * $ curl -X GET \
+ *       http://localhost:3001/api/gallery-image/list-unwrapped
+ * // gets raw JSON containing gallery image entries
+ */
+const getGalleryImageListUnwrapped = async (request, response) => {
+    const database = new sqlite3.Database(databasePath);
+    const sqlQuery = "SELECT * FROM gallery";
+
+    try {
+        const result = await asyncDatabaseRead(database, sqlQuery, (rows) => { return rows; });
+
+        database.close();
+        response.send(result);
+    } catch (err) {
+        console.error(err);
+        database.close();
+        response.status(500).send(err);
+    }
+};
+galleryImageAPI.get('/list-unwrapped', getGalleryImageListUnwrapped);
+
+/**
+ * Get a gallery image information
+ * @param {Object} request
+ * @param {number} request.query.target - ID to specify gallery image entry
+ * @param {Object} response
+ * @returns {JSON} JSON that contains information about gallery image
+ * @example
+ * $ curl -X GET http://localhost:3001/api/gallery-image?target=1
+ * // gets gallery image information with ID of 1
+ */
+const getGalleryImage = 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();
+        response.status(500).send(err);
+    }
+};
+galleryImageAPI.get('/', getGalleryImage);
+
+/**
+ * Posts gallery image
+ * @param {Object} request
+ * @param {string} request.body.imagePath - URL path to image
+ * @param {string} request.body.caption - Caption of image
+ * @param {Object} response
+ * @returns Result is logged into console
+ * @example
+ * $ curl -X POST \
+ *       -H 'Content-Type: application/x-www-form-urlencoded' \
+ *       --data-raw 'imagePath=/images/launch.png&caption=Launch of our new rocket' \
+ *       http://localhost:3001/api/gallery-image/
+ * // Posts gallery image with given information
+ */
+const postGalleryImage = 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) {
+        console.error(err);
+        response.status(500).send(err);
+    }
+
+    database.close();
+    response.end();
+};
+galleryImageAPI.post('/', postGalleryImage);
+
+/**
+ * Updates gallery image
+ * @param {Object} request
+ * @param {number} request.body.target - ID to specify gallery image entry
+ * @param {string} request.body.imagePath - URL path to image
+ * @param {string} request.body.caption - Caption of image
+ * @param {Object} response
+ * @returns Result is logged into console
+ * @example
+ * $ curl -X PUT \
+ *       -H 'Content-Type: application/x-www-form-urlencoded' \
+ *       --data-raw 'imagePath=/images/launch.png&caption=Launch of our new rocket' \
+ *       http://localhost:3001/api/gallery-image/
+ * // Updates gallery image with given information
+ */
+const putGalleryImage = 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) {
+        console.error(err);
+        response.status(500).send(err);
+    }
+
+    database.close();
+    response.end();
+};
+galleryImageAPI.put('/', putGalleryImage);
+
+/**
+ * Deletes specified gallery image
+ * @param {Object} request
+ * @param {string} request.query.target - ID to specify gallery image entry
+ * @param {Object} response
+ * @returns Result is logged into console
+ * @example
+ * $ curl -X DELETE \
+ *       http://localhost:3001/api/gallery-image?target=1
+ * // Deletes gallery image with ID of 1
+ */
+const deleteGalleryImage = 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) {
+        console.error(err);
+        response.status(500).send(err);
+    }
+
+    database.close();
+    response.status(200).send();
+};
+galleryImageAPI.delete('/', deleteGalleryImage);
+
+export default galleryImageAPI;
+
+
+
+ + + + +
+ + + +
+ + + + + + + diff --git a/src-manager/docs/manager/1.0.0/api_news.js.html b/src-manager/docs/manager/1.0.0/api_news.js.html new file mode 100644 index 0000000..7247388 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/api_news.js.html @@ -0,0 +1,319 @@ + + + + + JSDoc: Source: api/news.js + + + + + + + + + + +
+ +

Source: api/news.js

+ + + + + + +
+
+
/** @module api/news */
+import express from 'express';
+import sqlite3 from 'sqlite3';
+import path from 'path';
+import { fileURLToPath } from 'url';
+import { asyncDatabaseRead, asyncDatabaseWrite } from '../utils/asyncDatabase.js';
+import { wrapInTable } from '../utils/tableWrapper.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");
+
+function renameArticleType(entryType) {
+    return entryType == 0 ? "Article" : "Tweet";
+}
+
+function unixTimeToHumanreadableTime(unixTime) {
+    return (new Date(unixTime).toLocaleString());
+}
+
+function generateActionButtons(target) {
+    return `<button class='delete-button' hx-delete='/api/news?target=${target}'>Delete</button><a href='/update-news.html?target=${target}'><button class='edit-button' hx-confirm='unset'>Edit</button></a>`;
+}
+
+function modifyOrAppendProperty(targetObject, key, value) {
+    return { ...targetObject, [key]: value };
+}
+
+/**
+ * Get single news entry specified by Un*x Timestamp
+ * @param {Object} request
+ * @param {number} request.query.target - Un*x Timestamp to specify news entry
+ * @param {Object} response
+ * @returns {JSON} news entry data
+ * @example
+ * $ curl -X GET http://localhost:3001/api/news?target=0
+ * // gets news posted on Un*x epoch in JSON format
+ */
+const getNewsEntry = async (request, response) => {
+    const database = new sqlite3.Database(databasePath);
+
+    const target = Number(request.query.target);
+
+    if (isNaN(target)) {
+        console.error("Query is not number");
+        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.get('/', getNewsEntry);
+
+/**
+ * Post news and write to database
+ * @param {Object} request
+ * @param {number} request.body.entryType - Number that represents type of news (0: article, 1: tweet)
+ * @param {string} request.body.cardContent - Content of news card, Markdown is allowed
+ * @param {string} request.body.article - Article written in Markdown
+ * @param {string} request.body.linkPath - Relative URL path to the article
+ * @param {string} request.body.coverImagePath - Relative URL path to the cover image
+ * @param {Object} response
+ * @returns result is logged into console
+ * @example
+ * $ curl -X POST \
+ *       -H 'Content-Type: application/x-www-form-urlencoded' \
+ *       --data-raw 'entryType=1&cardContent=Test&article=&linkPath=&coverImagePath=/default.png' \
+ *       http://localhost:3001/api/news
+ * // Posts Tweet style news with content "Test" and cover image "/default.png"
+ */
+const postNewsEntry = 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) {
+        console.error(err);
+        response.status(500).send(err);
+    }
+    database.close();
+    response.end();
+};
+newsAPI.post('/', postNewsEntry);
+
+/**
+ * Update news entry
+ * @param {Object} request
+ * @param {number} request.body.target - Un*x timestamp to identify the entry
+ * @param {number} request.body.entryType - Number that represents type of news (0: article, 1: tweet)
+ * @param {string} request.body.cardContent - Content of news card, Markdown is allowed
+ * @param {string} request.body.article - Article written in Markdown
+ * @param {string} request.body.linkPath - Relative URL path to the article
+ * @param {string} request.body.coverImagePath - Relative URL path to the cover image
+ * @param {Object} response
+ * @returns result is logged into console
+ * @example
+ * $ curl -X PUT \
+ *       -H 'Content-Type: application/x-www-form-urlencoded' \
+ *       --data-raw 'target=0&entryType=1&cardContent=Test&article=&linkPath=&coverImagePath=default.png' \
+ *       http://localhost:3001/api/news
+ * // Update news posted on Un*x Epoch with given contents
+ */
+const putNewsEntry = 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)) {
+        console.error('Target is not number');
+        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) {
+        console.error(err);
+        response.status(500).send(err);
+    }
+
+    database.close();
+    response.end();
+};
+newsAPI.put('/', putNewsEntry);
+
+/**
+ * Delete news specified by Un*x Timestamp
+ * @param {Object} request
+ * @param {number} request.query.target - Un*x timestamp to identify the entry
+ * @param {Object} response
+ * @returns result is logged into console
+ * @example
+ * $ curl -X DELETE \
+ *       http://localhost:3001/api/news?target=0
+ * // Delete news posted on Un*x Epoch
+ */
+const deleteNewsEntry = async (request, response) => {
+    const database = new sqlite3.Database(databasePath);
+
+    const target = Number(request.query.target);
+
+    if (isNaN(target)) {
+        console.error('No Entry Found!');
+        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) {
+        console.error(err);
+        response.status(500).send(err);
+    }
+
+    database.close();
+
+    response.status(200).send();
+};
+newsAPI.delete('/', deleteNewsEntry);
+
+/**
+ * Get news list in HTML table body tr+td
+ * @param {Object} request
+ * @param {Object} response
+ * @returns {string} HTML table body tr+td
+ * @example
+ * $ curl -X GET \
+ *       http://localhost:3001/api/news/list
+ * // <tr>
+ * //     <td>1</td>
+ * //     <td>1970/1/1 0:0:0</td>
+ * //     ...
+ * // </tr>
+ * // ...
+ */
+const getNewsList = async (request, response) => {
+    const database = new sqlite3.Database(databasePath);
+    const sqlQuery = `SELECT id, date, entryType, cardContent FROM news ORDER BY date DESC;`;
+    try {
+        const result = await asyncDatabaseRead(database, sqlQuery, (rows) => {
+            let ret = "";
+            const rowsCopy = [...rows];
+            const rowsWithButtons = rowsCopy.map((entry) => {
+                const appendButtons = (value) => modifyOrAppendProperty(entry, "buttons", value);
+                return appendButtons(generateActionButtons(entry.date));
+            });
+            const renamedArticleTypeRows = rowsWithButtons.map((entry) => {
+                const modifyEntryType = (value) => modifyOrAppendProperty(entry, "entryType", value);
+                return modifyEntryType(renameArticleType(entry.entryType));
+            });
+            const convertedTimeRows = renamedArticleTypeRows.map((entry) => {
+                const modifyDate = (value) => modifyOrAppendProperty(entry, "date", value);
+                return modifyDate(unixTimeToHumanreadableTime(entry.date));
+            });
+            ret = wrapInTable(convertedTimeRows);
+            return ret;
+        });
+        database.close();
+        response.send(result);
+    } catch (err) {
+        console.error(err);
+        database.close();
+    }
+};
+newsAPI.get('/list', getNewsList);
+
+/**
+ * Get news list in unformated raw JSON string
+ * @param {Object} request
+ * @param {Object} response
+ * @returns {JSON} Unformatted JSON string that contains news entries
+ * @example
+ * $ curl -X GET \
+ *       http://localhost:3001/api/news/list-unwrapped
+ * // gets raw JSON containing news entries
+ */
+const getNewsListUnrwapped = async (request, response) => {
+    const database = new sqlite3.Database(databasePath);
+    const sqlQuery = `SELECT id, date, entryType, cardContent FROM news ORDER BY date DESC;`;
+
+    try {
+        const result = await asyncDatabaseRead(database, sqlQuery, (rows) => { return rows; });
+
+        database.close();
+        response.send(result);
+    } catch (err) {
+        console.error(err);
+        database.close();
+    }
+};
+newsAPI.get('/list-unwrapped', getNewsListUnrwapped);
+
+export default newsAPI;
+
+
+
+ + + + +
+ + + +
+ + + + + + + diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.eot b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.eot new file mode 100644 index 0000000..5d20d91 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.eot differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.svg b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.svg new file mode 100644 index 0000000..3ed7be4 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.woff b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.woff new file mode 100644 index 0000000..1205787 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Bold-webfont.woff differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.eot b/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.eot new file mode 100644 index 0000000..1f639a1 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.eot differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.svg b/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.svg new file mode 100644 index 0000000..6a2607b --- /dev/null +++ b/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.woff b/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 0000000..ed760c0 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-BoldItalic-webfont.woff differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.eot b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.eot new file mode 100644 index 0000000..0c8a0ae Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.eot differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.svg b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.svg new file mode 100644 index 0000000..e1075dc --- /dev/null +++ b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.woff b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.woff new file mode 100644 index 0000000..ff652e6 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Italic-webfont.woff differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.eot b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.eot new file mode 100644 index 0000000..1486840 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.eot differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.svg b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 0000000..11a472c --- /dev/null +++ b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.woff b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 0000000..e786074 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Light-webfont.woff differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.eot b/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.eot new file mode 100644 index 0000000..8f44592 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.eot differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.svg b/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.svg new file mode 100644 index 0000000..431d7e3 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,1835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.woff b/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.woff new file mode 100644 index 0000000..43e8b9e Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-LightItalic-webfont.woff differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.eot b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.eot new file mode 100644 index 0000000..6bbc3cf Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.eot differ diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.svg b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.svg new file mode 100644 index 0000000..25a3952 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.woff b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000..e231183 Binary files /dev/null and b/src-manager/docs/manager/1.0.0/fonts/OpenSans-Regular-webfont.woff differ diff --git a/src-manager/docs/manager/1.0.0/index.html b/src-manager/docs/manager/1.0.0/index.html new file mode 100644 index 0000000..e7c5da4 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/index.html @@ -0,0 +1,128 @@ + + + + + JSDoc: Home + + + + + + + + + + +
+ +

Home

+ + + + + + + + +

manager 1.0.0

+ + + + + + + + + + + + + + + +
+

Content Manager

+

SERA Websiteのニュース等のコンテンツを管理する

+

使用言語、ライブラリー、フレームワーク、ツール

+
    +
  • JavaScript
  • +
  • express
  • +
  • htmx
  • +
  • axios
  • +
  • node npm
  • +
  • sqlite
  • +
+

使用方法

+
cd src-manager/ # このディレクトリーに移動
+npm install # 依存パッケージのインストール、まだ一度も実行していない場合
+npm start # サーバーを起動、ブラウザで http://localhost:3001 に入る
+npm run dev # JSファイル変更時に自動リロードが入る開発サーバーを起動する。同じく http://localhost:3001 でホストされる
+npm run documentation # ドキュメンテーションを生成, "./docs/manager/<バージョン>/" 内で `python -m http.server` 等でローカルでホストする
+
+

データベース

+

ファイル: news.db / テーブル: news

+
    +
  • id - PRIMARY KEY - 整数
  • +
  • date - Unix時間 - 整数
  • +
  • entryType - 記事(0) か ツイート風(1) - 整数
  • +
  • cardContent - ニュースリストで表示されるコンテンツ、Markdown可 - 文字列(Markdown)
  • +
  • article - Markdownで書かれた記事 - 文字列(Markdown)
  • +
  • linkPath - ニュースリストで表示されるリンク先 - 文字列
  • +
  • coverImagePath - ニュースリストで表示される画像へのパス - 文字列
  • +
+ +
    +
  • id - PRIMARY KEY - 整数
  • +
  • imagePath - 画像へのパス - 文字列
  • +
  • caption - 画像の説明文 - 文字列
  • +
+

API(RESTful)

+
    +
  • +

    /api/news

    +
      +
    • GET(/): Unix時間で特定されたニュースの情報を取得する - ?target=<Unix時間>
    • +
    • GET(/list): HTML/HTMX形式で全ニュースの情報を取得する
    • +
    • GET(/list-unwrapped): JSON形式で全ニュースの情報を取得する
    • +
    • POST: 新しいニュースを作成する
    • +
    • PUT: ニュースの内容を更新する
    • +
    • DELETE: Unix時間で特定されたニュースを削除する - ?target=<Unix時間>
    • +
    +
  • +
  • +

    /api/gallery-image

    +
      +
    • GET(/): IDで指定された画像へのパスと説明文を取得する - ?target=<ID>
    • +
    • GET(/list): HTML/HTMX形式で全画像の情報を取得する
    • +
    • GET(/list-unwrapped): JSON形式で全画像の情報を取得する
    • +
    • POST: 新しい画像の情報を追加する
    • +
    • PUT: 画像の情報を更新する
    • +
    • DELETE: IDで指定された画像の情報を削除する - ?target=<ID>
    • +
    +
  • +
+
+ + + + + + +
+ + + +
+ + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/module-api_gallery-image.html b/src-manager/docs/manager/1.0.0/module-api_gallery-image.html new file mode 100644 index 0000000..7effb87 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/module-api_gallery-image.html @@ -0,0 +1,1459 @@ + + + + + JSDoc: Module: api/gallery-image + + + + + + + + + + +
+ +

Module: api/gallery-image

+ + + + + + +
+ +
+ + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +

Methods

+ + + + + + + +

(async, inner) deleteGalleryImage(request, response)

+ + + + + + +
+

Deletes specified gallery image

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
query.target + + +string + + + +

ID to specify gallery image entry

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Result is logged into console

+
+ + + + + + + + +
Example
+ +
$ curl -X DELETE \
+      http://localhost:3001/api/gallery-image?target=1
+// Deletes gallery image with ID of 1
+ + + + + + + + + +

(async, inner) getGalleryImage(request, response) → {JSON}

+ + + + + + +
+

Get a gallery image information

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
query.target + + +number + + + +

ID to specify gallery image entry

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

JSON that contains information about gallery image

+
+ + + +
+
+ Type +
+
+ +JSON + + +
+
+ + + + + + +
Example
+ +
$ curl -X GET http://localhost:3001/api/gallery-image?target=1
+// gets gallery image information with ID of 1
+ + + + + + + + + +

(async, inner) getGalleryImageList(request, response) → {string}

+ + + + + + +
+

Gets list of gallery image entries in HTML table body tr+td

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

HTML table body tr+td

+
+ + + +
+
+ Type +
+
+ +string + + +
+
+ + + + + + +
Example
+ +
$ curl -X GET http://localhost:3001/api/gallery-image/list
+// <tr>
+//     <td>1</td>
+//     <td>/image/test.png</td>
+//     ...
+// </tr>
+// ...
+ + + + + + + + + +

(async, inner) getGalleryImageListUnwrapped(request, response) → {string}

+ + + + + + +
+

Gets list of gallery image entries in Unformatted JSON string

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Unformatted JSON string that contains gallery image entries

+
+ + + +
+
+ Type +
+
+ +string + + +
+
+ + + + + + +
Example
+ +
$ curl -X GET \
+      http://localhost:3001/api/gallery-image/list-unwrapped
+// gets raw JSON containing gallery image entries
+ + + + + + + + + +

(async, inner) postGalleryImage(request, response)

+ + + + + + +
+

Posts gallery image

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
body.imagePath + + +string + + + +

URL path to image

body.caption + + +string + + + +

Caption of image

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Result is logged into console

+
+ + + + + + + + +
Example
+ +
$ curl -X POST \
+      -H 'Content-Type: application/x-www-form-urlencoded' \
+      --data-raw 'imagePath=/images/launch.png&caption=Launch of our new rocket' \
+      http://localhost:3001/api/gallery-image/
+// Posts gallery image with given information
+ + + + + + + + + +

(async, inner) putGalleryImage(request, response)

+ + + + + + +
+

Updates gallery image

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
body.target + + +number + + + +

ID to specify gallery image entry

body.imagePath + + +string + + + +

URL path to image

body.caption + + +string + + + +

Caption of image

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Result is logged into console

+
+ + + + + + + + +
Example
+ +
$ curl -X PUT \
+      -H 'Content-Type: application/x-www-form-urlencoded' \
+      --data-raw 'imagePath=/images/launch.png&caption=Launch of our new rocket' \
+      http://localhost:3001/api/gallery-image/
+// Updates gallery image with given information
+ + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/module-api_news.html b/src-manager/docs/manager/1.0.0/module-api_news.html new file mode 100644 index 0000000..01fe08b --- /dev/null +++ b/src-manager/docs/manager/1.0.0/module-api_news.html @@ -0,0 +1,1598 @@ + + + + + JSDoc: Module: api/news + + + + + + + + + + +
+ +

Module: api/news

+ + + + + + +
+ +
+ + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +

Methods

+ + + + + + + +

(async, inner) deleteNewsEntry(request, response)

+ + + + + + +
+

Delete news specified by Un*x Timestamp

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
query.target + + +number + + + +

Un*x timestamp to identify the entry

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

result is logged into console

+
+ + + + + + + + +
Example
+ +
$ curl -X DELETE \
+      http://localhost:3001/api/news?target=0
+// Delete news posted on Un*x Epoch
+ + + + + + + + + +

(async, inner) getNewsEntry(request, response) → {JSON}

+ + + + + + +
+

Get single news entry specified by Un*x Timestamp

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
query.target + + +number + + + +

Un*x Timestamp to specify news entry

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

news entry data

+
+ + + +
+
+ Type +
+
+ +JSON + + +
+
+ + + + + + +
Example
+ +
$ curl -X GET http://localhost:3001/api/news?target=0
+// gets news posted on Un*x epoch in JSON format
+ + + + + + + + + +

(async, inner) getNewsList(request, response) → {string}

+ + + + + + +
+

Get news list in HTML table body tr+td

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

HTML table body tr+td

+
+ + + +
+
+ Type +
+
+ +string + + +
+
+ + + + + + +
Example
+ +
$ curl -X GET \
+      http://localhost:3001/api/news/list
+// <tr>
+//     <td>1</td>
+//     <td>1970/1/1 0:0:0</td>
+//     ...
+// </tr>
+// ...
+ + + + + + + + + +

(async, inner) getNewsListUnrwapped(request, response) → {JSON}

+ + + + + + +
+

Get news list in unformated raw JSON string

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Unformatted JSON string that contains news entries

+
+ + + +
+
+ Type +
+
+ +JSON + + +
+
+ + + + + + +
Example
+ +
$ curl -X GET \
+      http://localhost:3001/api/news/list-unwrapped
+// gets raw JSON containing news entries
+ + + + + + + + + +

(async, inner) postNewsEntry(request, response)

+ + + + + + +
+

Post news and write to database

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
body.entryType + + +number + + + +

Number that represents type of news (0: article, 1: tweet)

body.cardContent + + +string + + + +

Content of news card, Markdown is allowed

body.article + + +string + + + +

Article written in Markdown

body.linkPath + + +string + + + +

Relative URL path to the article

body.coverImagePath + + +string + + + +

Relative URL path to the cover image

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

result is logged into console

+
+ + + + + + + + +
Example
+ +
$ curl -X POST \
+      -H 'Content-Type: application/x-www-form-urlencoded' \
+      --data-raw 'entryType=1&cardContent=Test&article=&linkPath=&coverImagePath=/default.png' \
+      http://localhost:3001/api/news
+// Posts Tweet style news with content "Test" and cover image "/default.png"
+ + + + + + + + + +

(async, inner) putNewsEntry(request, response)

+ + + + + + +
+

Update news entry

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
request + + +Object + + + + +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
body.target + + +number + + + +

Un*x timestamp to identify the entry

body.entryType + + +number + + + +

Number that represents type of news (0: article, 1: tweet)

body.cardContent + + +string + + + +

Content of news card, Markdown is allowed

body.article + + +string + + + +

Article written in Markdown

body.linkPath + + +string + + + +

Relative URL path to the article

body.coverImagePath + + +string + + + +

Relative URL path to the cover image

+ +
response + + +Object + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

result is logged into console

+
+ + + + + + + + +
Example
+ +
$ curl -X PUT \
+      -H 'Content-Type: application/x-www-form-urlencoded' \
+      --data-raw 'target=0&entryType=1&cardContent=Test&article=&linkPath=&coverImagePath=default.png' \
+      http://localhost:3001/api/news
+// Update news posted on Un*x Epoch with given contents
+ + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/module-utils_asyncDatabase.html b/src-manager/docs/manager/1.0.0/module-utils_asyncDatabase.html new file mode 100644 index 0000000..4a786a6 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/module-utils_asyncDatabase.html @@ -0,0 +1,506 @@ + + + + + JSDoc: Module: utils/asyncDatabase + + + + + + + + + + +
+ +

Module: utils/asyncDatabase

+ + + + + + +
+ +
+ + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +

Methods

+ + + + + + + +

(inner) asyncDatabaseRead(database, sqlQuery, callback) → {Promise.<any>}

+ + + + + + + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
database + + +sqlite3.Database + + + +
sqlQuery + + +string + + + +
callback + + +function + + + +

function (rows)

+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Promise for database operation

+
+ + + +
+
+ Type +
+
+ +Promise.<any> + + +
+
+ + + + + + +
Example
+ +
const result = await asyncDatabaseRead(userDatabase, `SELECT * FROM users`, (rows) => {
+    return wrapInTable(rows);
+});
+ + + + + + + + + +

(inner) asyncDatabaseWrite(database, sqlQuery, callback) → {Promise.<any>}

+ + + + + + + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
database + + +sqlite3.Database + + + +
sqlQuery + + +string + + + +
callback + + +function + + + +

function ()

+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Promise for database operation

+
+ + + +
+
+ Type +
+
+ +Promise.<any> + + +
+
+ + + + + + +
Example
+ +
let sqlQuery = `INSERT INTO users (id, name, age) VALUES (${genID()}, "${userName}", "${userAge}");`;
+await asyncDatabaseWrite(userDatabase, sqlQuery, () => {
+    console.log("Added User ", userName);
+});
+ + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/module-utils_tableWrapper.html b/src-manager/docs/manager/1.0.0/module-utils_tableWrapper.html new file mode 100644 index 0000000..51434f6 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/module-utils_tableWrapper.html @@ -0,0 +1,266 @@ + + + + + JSDoc: Module: utils/tableWrapper + + + + + + + + + + +
+ +

Module: utils/tableWrapper

+ + + + + + +
+ +
+ + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +

Methods

+ + + + + + + +

(inner) wrapInTable(target) → {string}

+ + + + + + +
+

Wrap object array into HTML table body tr+td's

+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
target + + +Array.<Object> + + + +

array of objects

+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+

Stringed HTML table body tr+td's

+
+ + + +
+
+ Type +
+
+ +string + + +
+
+ + + + + + +
Example
+ +
const data = [
+    {id: 1, name: "John"},
+    {id: 2, name: "Marry"},
+];
+const responseHTML = wrapInTable(data);
+// responseHTML =
+// <tr>
+//     <td>1</td>
+//     <td>John</td>
+// </tr>
+// <tr>
+//     <td>2</td>
+//     <td>Marry</td>
+// </tr>
+ + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + + \ No newline at end of file diff --git a/src-manager/docs/manager/1.0.0/scripts/linenumber.js b/src-manager/docs/manager/1.0.0/scripts/linenumber.js new file mode 100644 index 0000000..4354785 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/scripts/linenumber.js @@ -0,0 +1,25 @@ +/*global document */ +(() => { + const source = document.getElementsByClassName('prettyprint source linenums'); + let i = 0; + let lineNumber = 0; + let lineId; + let lines; + let totalLines; + let anchorHash; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = `line${lineNumber}`; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/src-manager/docs/manager/1.0.0/scripts/prettify/Apache-License-2.0.txt b/src-manager/docs/manager/1.0.0/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src-manager/docs/manager/1.0.0/scripts/prettify/lang-css.js b/src-manager/docs/manager/1.0.0/scripts/prettify/lang-css.js new file mode 100644 index 0000000..041e1f5 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/src-manager/docs/manager/1.0.0/scripts/prettify/prettify.js b/src-manager/docs/manager/1.0.0/scripts/prettify/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p th:last-child { border-right: 1px solid #ddd; } + +.ancestors, .attribs { color: #999; } +.ancestors a, .attribs a +{ + color: #999 !important; + text-decoration: none; +} + +.clear +{ + clear: both; +} + +.important +{ + font-weight: bold; + color: #950B02; +} + +.yes-def { + text-indent: -1000px; +} + +.type-signature { + color: #aaa; +} + +.name, .signature { + font-family: Consolas, Monaco, 'Andale Mono', monospace; +} + +.details { margin-top: 14px; border-left: 2px solid #DDD; } +.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; } +.details dd { margin-left: 70px; } +.details ul { margin: 0; } +.details ul { list-style-type: none; } +.details li { margin-left: 30px; padding-top: 6px; } +.details pre.prettyprint { margin: 0 } +.details .object-value { padding-top: 0; } + +.description { + margin-bottom: 1em; + margin-top: 1em; +} + +.code-caption +{ + font-style: italic; + font-size: 107%; + margin: 0; +} + +.source +{ + border: 1px solid #ddd; + width: 80%; + overflow: auto; +} + +.prettyprint.source { + width: inherit; +} + +.source code +{ + font-size: 100%; + line-height: 18px; + display: block; + padding: 4px 12px; + margin: 0; + background-color: #fff; + color: #4D4E53; +} + +.prettyprint code span.line +{ + display: inline-block; +} + +.prettyprint.linenums +{ + padding-left: 70px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.prettyprint.linenums ol +{ + padding-left: 0; +} + +.prettyprint.linenums li +{ + border-left: 3px #ddd solid; +} + +.prettyprint.linenums li.selected, +.prettyprint.linenums li.selected * +{ + background-color: lightyellow; +} + +.prettyprint.linenums li * +{ + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.params .name, .props .name, .name code { + color: #4D4E53; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 100%; +} + +.params td.description > p:first-child, +.props td.description > p:first-child +{ + margin-top: 0; + padding-top: 0; +} + +.params td.description > p:last-child, +.props td.description > p:last-child +{ + margin-bottom: 0; + padding-bottom: 0; +} + +.disabled { + color: #454545; +} diff --git a/src-manager/docs/manager/1.0.0/styles/prettify-jsdoc.css b/src-manager/docs/manager/1.0.0/styles/prettify-jsdoc.css new file mode 100644 index 0000000..5a2526e --- /dev/null +++ b/src-manager/docs/manager/1.0.0/styles/prettify-jsdoc.css @@ -0,0 +1,111 @@ +/* JSDoc prettify.js theme */ + +/* plain text */ +.pln { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* string content */ +.str { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a keyword */ +.kwd { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a comment */ +.com { + font-weight: normal; + font-style: italic; +} + +/* a type name */ +.typ { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a literal value */ +.lit { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* punctuation */ +.pun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp open bracket */ +.opn { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp close bracket */ +.clo { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a markup tag name */ +.tag { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute name */ +.atn { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute value */ +.atv { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a declaration */ +.dec { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a variable name */ +.var { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a function name */ +.fun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} diff --git a/src-manager/docs/manager/1.0.0/styles/prettify-tomorrow.css b/src-manager/docs/manager/1.0.0/styles/prettify-tomorrow.css new file mode 100644 index 0000000..b6f92a7 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/styles/prettify-tomorrow.css @@ -0,0 +1,132 @@ +/* Tomorrow Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* Pretty printing styles. Used with prettify.js. */ +/* SPAN elements with the classes below are added by prettyprint. */ +/* plain text */ +.pln { + color: #4d4d4c; } + +@media screen { + /* string content */ + .str { + color: #718c00; } + + /* a keyword */ + .kwd { + color: #8959a8; } + + /* a comment */ + .com { + color: #8e908c; } + + /* a type name */ + .typ { + color: #4271ae; } + + /* a literal value */ + .lit { + color: #f5871f; } + + /* punctuation */ + .pun { + color: #4d4d4c; } + + /* lisp open bracket */ + .opn { + color: #4d4d4c; } + + /* lisp close bracket */ + .clo { + color: #4d4d4c; } + + /* a markup tag name */ + .tag { + color: #c82829; } + + /* a markup attribute name */ + .atn { + color: #f5871f; } + + /* a markup attribute value */ + .atv { + color: #3e999f; } + + /* a declaration */ + .dec { + color: #f5871f; } + + /* a variable name */ + .var { + color: #c82829; } + + /* a function name */ + .fun { + color: #4271ae; } } +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { + color: #060; } + + .kwd { + color: #006; + font-weight: bold; } + + .com { + color: #600; + font-style: italic; } + + .typ { + color: #404; + font-weight: bold; } + + .lit { + color: #044; } + + .pun, .opn, .clo { + color: #440; } + + .tag { + color: #006; + font-weight: bold; } + + .atn { + color: #404; } + + .atv { + color: #060; } } +/* Style */ +/* +pre.prettyprint { + background: white; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 12px; + line-height: 1.5; + border: 1px solid #ccc; + padding: 10px; } +*/ + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; } + +/* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L4, +li.L5, +li.L6, +li.L7, +li.L8, +li.L9 { + /* */ } + +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { + /* */ } diff --git a/src-manager/docs/manager/1.0.0/utils_asyncDatabase.js.html b/src-manager/docs/manager/1.0.0/utils_asyncDatabase.js.html new file mode 100644 index 0000000..75afede --- /dev/null +++ b/src-manager/docs/manager/1.0.0/utils_asyncDatabase.js.html @@ -0,0 +1,106 @@ + + + + + JSDoc: Source: utils/asyncDatabase.js + + + + + + + + + + +
+ +

Source: utils/asyncDatabase.js

+ + + + + + +
+
+
/**
+ * @module utils/asyncDatabase
+ */
+import sqlite3 from 'sqlite3';
+
+/**
+ * @param {sqlite3.Database} database
+ * @param {string} sqlQuery
+ * @param {function} callback - function (rows)
+ * @returns {Promise<any>} Promise for database operation
+ * @example
+ * const result = await asyncDatabaseRead(userDatabase, `SELECT * FROM users`, (rows) => {
+ *     return wrapInTable(rows);
+ * });
+ */
+const asyncDatabaseRead = (database, sqlQuery, callback) => {
+    return new Promise((resolve, reject) => {
+        database.serialize(() => {
+            database.all(sqlQuery, (err, rows) => {
+                if (err) {
+                    reject(err);
+                } else {
+                    resolve(callback(rows));
+                }
+            });
+        });
+    });
+};
+
+/**
+ * @param {sqlite3.Database} database
+ * @param {string} sqlQuery
+ * @param {function} callback - function ()
+ * @returns {Promise<any>} Promise for database operation
+ * @example
+ * let sqlQuery = `INSERT INTO users (id, name, age) VALUES (${genID()}, "${userName}", "${userAge}");`;
+ * await asyncDatabaseWrite(userDatabase, sqlQuery, () => {
+ *     console.log("Added User ", userName);
+ * });
+ */
+const asyncDatabaseWrite = (database, sqlQuery, callback) => {
+    return new Promise((resolve, reject) => {
+        database.serialize(() => {
+            database.run(sqlQuery, (err, rows) => {
+                if (err) {
+                    reject(err);
+                } else {
+                    resolve(callback(rows));
+                }
+            });
+        });
+    });
+};
+
+export { asyncDatabaseRead, asyncDatabaseWrite };
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 4.0.4 on Tue Nov 26 2024 23:18:12 GMT+0900 (日本標準時) +
+ + + + + diff --git a/src-manager/docs/manager/1.0.0/utils_tableWrapper.js.html b/src-manager/docs/manager/1.0.0/utils_tableWrapper.js.html new file mode 100644 index 0000000..ba082c9 --- /dev/null +++ b/src-manager/docs/manager/1.0.0/utils_tableWrapper.js.html @@ -0,0 +1,90 @@ + + + + + JSDoc: Source: utils/tableWrapper.js + + + + + + + + + + +
+ +

Source: utils/tableWrapper.js

+ + + + + + +
+
+
/**
+ * @module utils/tableWrapper
+ */
+
+/**
+ * Wrap object array into HTML table body tr+td's
+ * @param {Object[]} target - array of objects
+ * @returns {string} Stringed HTML table body tr+td's
+ * @example
+ * const data = [
+ *     {id: 1, name: "John"},
+ *     {id: 2, name: "Marry"},
+ * ];
+ * const responseHTML = wrapInTable(data);
+ * // responseHTML =
+ * // <tr>
+ * //     <td>1</td>
+ * //     <td>John</td>
+ * // </tr>
+ * // <tr>
+ * //     <td>2</td>
+ * //     <td>Marry</td>
+ * // </tr>
+ */
+const wrapInTable = (target) => {
+    let res = "";
+    for (const entry of target) {
+        let tableData = "<tr>\n";
+        for (const data in entry) {
+            let dataEntry = `    <td>${entry[data]}</td>\n`
+            tableData = tableData + dataEntry;
+        }
+        tableData = tableData + "</tr>\n";
+        res = res + tableData;
+    }
+    return res;
+};
+
+export { wrapInTable };
+
+
+
+ + + + +
+ + + +
+ +
+ Documentation generated by JSDoc 4.0.4 on Tue Nov 26 2024 23:18:12 GMT+0900 (日本標準時) +
+ + + + + diff --git a/src-manager/jsdoc-conf.json b/src-manager/jsdoc-conf.json new file mode 100644 index 0000000..3c1de45 --- /dev/null +++ b/src-manager/jsdoc-conf.json @@ -0,0 +1,29 @@ +{ + "plugins": ["plugins/markdown"], + "recurseDepth": 5, + "sourceType": "module", + "source": { + "include": ["./utils/", "./api/"], + "excludePattern": "(node_modules/|docs)" + }, + "tags": { + "allowUnknownTags": false, + "dictionaries": ["jsdoc"] + }, + "templates": { + "cleverLinks": true, + "monospaceLinks": true, + "disableSort": true + }, + "opts": { + "encoding": "utf8", + "verbose": true, + "destination": "./docs/", + "readme": "./README.md", + "package": "./package.json" + }, + "markdown": { + "hardwrap": false, + "idInHeadings": true + } +} diff --git a/src-manager/package.json b/src-manager/package.json index 48eda25..77b7f15 100644 --- a/src-manager/package.json +++ b/src-manager/package.json @@ -5,7 +5,8 @@ "main": "app.js", "scripts": { "start": "node app.js", - "dev": "nodemon --watch . --ignore pages" + "dev": "nodemon --watch . --ignore pages", + "documentation": "jsdoc -c ./jsdoc-conf.json" }, "type": "module", "author": "kenryus", diff --git a/src-manager/pages/new-gallery-image.html b/src-manager/pages/new-gallery-image.html index 16b817e..bda2c6d 100644 --- a/src-manager/pages/new-gallery-image.html +++ b/src-manager/pages/new-gallery-image.html @@ -3,7 +3,7 @@ Content Manager - new gallery image - +