From 60eed00cb2c0885e73a2d2dcf6710f9cf0e74b6b Mon Sep 17 00:00:00 2001 From: louiscklaw Date: Sun, 11 May 2025 10:34:48 +0800 Subject: [PATCH] "add admin user seed script and refactor common seed utilities" --- 002_source/pocketbase/pb_hooks/assets/run.jpg | Bin 0 -> 32828 bytes .../pocketbase/pb_hooks/assets/swim.jpg | Bin 0 -> 50612 bytes 002_source/pocketbase/pb_hooks/seed.pb.js | 4 +- .../pocketbase/pb_hooks/seed/000_seed_t1.js | 19 +- .../pb_hooks/seed/001_seed_LessonsTypes.js | 26 +- .../pb_hooks/seed/002_LessonsCategories.js | 38 +- .../pb_hooks/seed/003_Categories.js | 42 +- .../pb_hooks/seed/004_clean_users.js | 16 +- .../pb_hooks/seed/005_Users_teacher.js | 71 +- .../pb_hooks/seed/006_Users_student.js | 52 +- .../pb_hooks/seed/007_Users_admin.js | 52 + .../pb_hooks/seed/010_Vocabularies.js | 68 +- .../pb_hooks/seed/020_QuizLPCategories.js | 26 +- .../pb_hooks/seed/021_QuizLPQuestions.js | 43 +- .../pb_hooks/seed/021_QuizLPQuestions.js.plan | 35 - .../pb_hooks/seed/030_QuizMFCategories.js | 27 +- .../pb_hooks/seed/031_QuizMFQuestions.js | 44 +- .../pb_hooks/seed/040_QuizCRCategories.js | 28 +- .../pb_hooks/seed/041_QuizCRQuestions.js | 184 +--- .../pocketbase/pb_hooks/seed/050_Customers.js | 37 +- .../{051_Teachers.js => 051_Teachers_xxx.js} | 27 +- .../pocketbase/pb_hooks/seed/052_Students.js | 27 +- .../pb_hooks/seed/060_Notifications.js | 69 +- 002_source/pocketbase/pb_hooks/seed/config.js | 29 +- .../pocketbase/pb_hooks/seed/schema.json | 953 +++++++++++++++++- 002_source/pocketbase/pb_hooks/seed/utils.js | 15 +- 26 files changed, 1426 insertions(+), 506 deletions(-) create mode 100644 002_source/pocketbase/pb_hooks/assets/run.jpg create mode 100644 002_source/pocketbase/pb_hooks/assets/swim.jpg create mode 100644 002_source/pocketbase/pb_hooks/seed/007_Users_admin.js delete mode 100644 002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js.plan rename 002_source/pocketbase/pb_hooks/seed/{051_Teachers.js => 051_Teachers_xxx.js} (80%) diff --git a/002_source/pocketbase/pb_hooks/assets/run.jpg b/002_source/pocketbase/pb_hooks/assets/run.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73ec85c8b4ecb767587ca9b99c924dd30c1bae94 GIT binary patch literal 32828 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 xo(h06 { - const ASSETS_DIR = '/pb_hooks/assets'; - const getAsset = name => $filesystem.fileFromPath(ASSETS_DIR + '/' + name); +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + +module.exports = ($app) => { + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); for (let i = 0; i < 3; i++) { - let t1_collection = $app.findCollectionByNameOrId('t1'); + let t1_collection = $app.findCollectionByNameOrId("t1"); let record = new Record(t1_collection); - record.set('hello', 'world'); - let test_png = getAsset('1.png'); - record.set('test_file', test_png); + record.set("hello", "world"); + let test_png = getAsset("1.png"); + record.set("test_file", test_png); $app.save(record); } diff --git a/002_source/pocketbase/pb_hooks/seed/001_seed_LessonsTypes.js b/002_source/pocketbase/pb_hooks/seed/001_seed_LessonsTypes.js index 1c87e8c..81517e1 100644 --- a/002_source/pocketbase/pb_hooks/seed/001_seed_LessonsTypes.js +++ b/002_source/pocketbase/pb_hooks/seed/001_seed_LessonsTypes.js @@ -1,12 +1,18 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + let draft_lesson_types = [ - ["1".padStart(15, 0), "Vocabulary", "vocabulary", 0, "visible"], - ["2".padStart(15, 0), "Connectives", "connectives", 1, "visible"], - ["3".padStart(15, 0), "Testing visible", "testing", 3, "visible"], - ["4".padStart(15, 0), "Testing hidden", "testing", 3, "hidden"], - ["5".padStart(15, 0), "lesson type 5", "testing", 3, "hidden"], - ["6".padStart(15, 0), "中文 6", "testing", 3, "hidden"], - ["7".padStart(15, 0), "レッスン7 レッスン7 レッスン7", "testing", 3, "hidden"], + [getId("1"), "Vocabulary", "vocabulary", 0, "visible"], + [getId("2"), "Connectives", "connectives", 1, "visible"], + [getId("3"), "Testing visible", "testing", 3, "visible"], + [getId("4"), "Testing hidden", "testing", 3, "hidden"], + [getId("5"), "lesson type 5", "testing", 3, "hidden"], + [getId("6"), "中文 6", "testing", 3, "hidden"], + [getId("7"), "レッスン7 レッスン7 レッスン7", "testing", 3, "hidden"], ]; dirtyTruncateTable("LessonsTypes"); @@ -28,9 +34,3 @@ module.exports = ($app) => { } console.log("001 lesson types seeding done"); }; - -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; diff --git a/002_source/pocketbase/pb_hooks/seed/002_LessonsCategories.js b/002_source/pocketbase/pb_hooks/seed/002_LessonsCategories.js index 64e5aab..b141cad 100644 --- a/002_source/pocketbase/pb_hooks/seed/002_LessonsCategories.js +++ b/002_source/pocketbase/pb_hooks/seed/002_LessonsCategories.js @@ -1,19 +1,25 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives + const { CR_cat_id_news, CR_cat_id_technology, id_v, id_c } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives let row_array = [ - ["1".padStart(15, 0), "news", "", getAsset("ci_news.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["2".padStart(15, 0), "sports", "", getAsset("ci_sports.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["3".padStart(15, 0), "technology", "", getAsset("ci_technology.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["4".padStart(15, 0), "art", "", getAsset("ci_art.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["5".padStart(15, 0), "basic", "", getAsset("ci_basic.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["6".padStart(15, 0), "nature", "", getAsset("ci_nature.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["7".padStart(15, 0), "workplace", "", getAsset("ci_workplace.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["8".padStart(15, 0), "workplace", "", getAsset("ci_workplace.jpg"), 1, "hidden", id_v, "desc", "remarks"], - ["99".padStart(15, 0), "connectives", "", getAsset("1.png"), 1, "visible", id_c, "desc", "remarks"], + [getId("1"), "news", "", getAsset("ci_news.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("2"), "sports", "", getAsset("ci_sports.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("3"), "technology", "", getAsset("ci_technology.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("4"), "art", "", getAsset("ci_art.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("5"), "basic", "", getAsset("ci_basic.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("6"), "nature", "", getAsset("ci_nature.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("7"), "workplace", "", getAsset("ci_workplace.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("8"), "workplace", "", getAsset("ci_workplace.jpg"), 1, "hidden", id_v, "desc", "remarks"], + [getId("99"), "connectives", "", getAsset("1.png"), 1, "visible", id_c, "desc", "remarks"], // ["2".padStart(15, 0), "Connectives", "connectivse", 1, "visible"], // ["3".padStart(15, 0), "Testing visible", "testing", 3, "visible"], // ["4".padStart(15, 0), "Testing hidden", "testing", 3, "hidden"], @@ -41,9 +47,3 @@ module.exports = ($app) => { console.log("002 lesson categories seeding done"); }; - -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; diff --git a/002_source/pocketbase/pb_hooks/seed/003_Categories.js b/002_source/pocketbase/pb_hooks/seed/003_Categories.js index b7a9306..8407b33 100644 --- a/002_source/pocketbase/pb_hooks/seed/003_Categories.js +++ b/002_source/pocketbase/pb_hooks/seed/003_Categories.js @@ -1,18 +1,28 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { + const { CR_cat_id_news, CR_cat_id_technology, id_v, id_c } = config; + + const { getId, getAsset, dirtyTruncateTable } = utils; + const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); let row_array = [ - ["1".padStart(15, 0), "news", "", getAsset("ci_news.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["2".padStart(15, 0), "sports", "", getAsset("ci_sports.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["3".padStart(15, 0), "technology", "", getAsset("ci_technology.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["4".padStart(15, 0), "art", "", getAsset("ci_art.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["5".padStart(15, 0), "basic", "", getAsset("ci_basic.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["6".padStart(15, 0), "nature", "", getAsset("ci_nature.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["7".padStart(15, 0), "workplace", "", getAsset("ci_workplace.jpg"), 1, "visible", id_v, "desc", "remarks"], - ["99".padStart(15, 0), "connectives", "", getAsset("1.png"), 1, "visible", id_c, "desc", "remarks"], + [getId("1"), "news", "", getAsset("ci_news.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("2"), "sports", "", getAsset("ci_sports.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("3"), "technology", "", getAsset("ci_technology.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("4"), "art", "", getAsset("ci_art.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("5"), "basic", "", getAsset("ci_basic.jpg"), 1, "visible", id_v, "desc", "remarks"], + + [getId("6"), "nature", "", getAsset("ci_nature.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("7"), "workplace", "", getAsset("ci_workplace.jpg"), 1, "visible", id_v, "desc", "remarks"], + [getId("11"), "connectives", "", getAsset("1.png"), 1, "visible", id_c, "desc", "remarks"], + [getId("12"), "connectives_2", "", getAsset("1.png"), 1, "visible", id_c, "desc", "remarks"], // ["2".padStart(15, 0), "Connectives", "connectivse", 1, "visible"], // ["3".padStart(15, 0), "Testing visible", "testing", 3, "visible"], // ["4".padStart(15, 0), "Testing hidden", "testing", 3, "hidden"], @@ -41,8 +51,8 @@ module.exports = ($app) => { console.log("003 categories seeding done"); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/004_clean_users.js b/002_source/pocketbase/pb_hooks/seed/004_clean_users.js index 1ef99cd..5db6a32 100644 --- a/002_source/pocketbase/pb_hooks/seed/004_clean_users.js +++ b/002_source/pocketbase/pb_hooks/seed/004_clean_users.js @@ -1,4 +1,10 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + console.log("004 clean user table start"); dirtyTruncateTable("Users"); @@ -7,8 +13,8 @@ module.exports = ($app) => { console.log("004 clean user table done"); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/005_Users_teacher.js b/002_source/pocketbase/pb_hooks/seed/005_Users_teacher.js index bf2bb3c..a6e8436 100644 --- a/002_source/pocketbase/pb_hooks/seed/005_Users_teacher.js +++ b/002_source/pocketbase/pb_hooks/seed/005_Users_teacher.js @@ -1,46 +1,21 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset } = utils; let row_array = [ - ["11".padStart(15, 0), "teacher1@123.com", "teacher1@123.com", "teacher1@123.com", true, true, "test_user_1"], - ["12".padStart(15, 0), "teacher2@123.com", "teacher2@123.com", "teacher2@123.com", true, true, "test_user_2"], - ["13".padStart(15, 0), "teacher3@123.com", "teacher3@123.com", "teacher3@123.com", true, true, "test_user_3"], + [getId("11"), "teacher1@123.com", "teacher1@123.com", "teacher1@123.com", true, true, "test_teacher_1"], + [getId("12"), "teacher2@123.com", "teacher2@123.com", "teacher2@123.com", true, true, "test_teacher_2"], + [getId("13"), "teacher3@123.com", "teacher3@123.com", "teacher3@123.com", true, true, "test_teacher_3"], ]; + // um = user_meta let um_row_array = [ - [ - "11".padStart(15, 0), - "teacher1@123.com", - "active", - "11".padStart(15, 0), - JSON.stringify({}), - getAsset("people1.png"), - "teacher", - // - ], - [ - "12".padStart(15, 0), - "teacher2@123.com", - "active", - "12".padStart(15, 0), - JSON.stringify({}), - getAsset("people2.png"), - "teacher", - // - ], - [ - "13".padStart(15, 0), - "teacher3@123.com", - "active", - "13".padStart(15, 0), - JSON.stringify({}), - getAsset("people3.png"), - "teacher", - // - ], + [getId("11"), "teacher1@123.com", "active", getId("11"), JSON.stringify({}), getAsset("people1.png"), "teacher", "teacher_1"], + [getId("12"), "teacher2@123.com", "pending", getId("12"), JSON.stringify({}), getAsset("people2.png"), "teacher", "teacher_2"], + [getId("13"), "teacher3@123.com", "blocked", getId("13"), JSON.stringify({}), getAsset("people3.png"), "teacher", "teacher_3"], ]; let users_collection = $app.findCollectionByNameOrId("users"); @@ -63,19 +38,29 @@ module.exports = ($app) => { let um_record = new Record(user_metas_collection); um_record.set("id", um[0]); um_record.set("helloworld", um[1]); - um_record.set("state", um[2]); + um_record.set("status", um[2]); um_record.set("user_id", um[3]); um_record.set("meta", um[4]); + + // NOTE: obslete "avatar" and use "avatar_file" um_record.set("avatar", um[5]); + um_record.set("avatar_file", um[5]); + // + um_record.set("role", um[6]); + um_record.set("name", um[7]); + um_record.set("email", user[3]); + um_record.set("phone", "9123456" + i.toString()); + $app.save(um_record); } console.log("005 add teacher user done"); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: delete this ? +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/006_Users_student.js b/002_source/pocketbase/pb_hooks/seed/006_Users_student.js index 17e7b81..457f526 100644 --- a/002_source/pocketbase/pb_hooks/seed/006_Users_student.js +++ b/002_source/pocketbase/pb_hooks/seed/006_Users_student.js @@ -1,23 +1,25 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset } = utils; let row_array = [ - ["1".padStart(15, 0), "user1@123.com", "user1@123.com", "user1@123.com", true, true, "test_user_1"], - ["2".padStart(15, 0), "user2@123.com", "user2@123.com", "user2@123.com", true, true, "test_user_2"], - ["3".padStart(15, 0), "user3@123.com", "user3@123.com", "user3@123.com", true, true, "test_user_3"], - ["4".padStart(15, 0), "user4@123.com", "user4@123.com", "user4@123.com", true, true, "test_user_4"], - ["5".padStart(15, 0), "user5@123.com", "user5@123.com", "user5@123.com", true, true, "test_user_5"], + [getId("1"), "user1@123.com", "user1@123.com", "user1@123.com", true, true, "test_student_1"], + [getId("2"), "user2@123.com", "user2@123.com", "user2@123.com", true, true, "test_student_2"], + [getId("3"), "user3@123.com", "user3@123.com", "user3@123.com", true, true, "test_student_3"], + [getId("4"), "user4@123.com", "user4@123.com", "user4@123.com", true, true, "test_student_4"], + [getId("5"), "user5@123.com", "user5@123.com", "user5@123.com", true, true, "test_student_5"], ]; + // um = user_meta let um_row_array = [ - ["1".padStart(15, 0), "user1@123.com", "active", "1".padStart(15, 0), JSON.stringify({}), getAsset("people1.png"), "student"], - ["2".padStart(15, 0), "user2@123.com", "active", "2".padStart(15, 0), JSON.stringify({}), getAsset("people2.png"), "student"], - ["3".padStart(15, 0), "user3@123.com", "active", "3".padStart(15, 0), JSON.stringify({}), getAsset("people3.png"), "student"], - ["4".padStart(15, 0), "user4@123.com", "active", "4".padStart(15, 0), JSON.stringify({}), getAsset("people4.png"), "student"], - ["5".padStart(15, 0), "user5@123.com", "active", "5".padStart(15, 0), JSON.stringify({}), getAsset("people5.png"), "student"], + [getId("1"), "user1@123.com", "active", getId("1"), JSON.stringify({}), getAsset("people1.png"), "student", "student_1"], + [getId("2"), "user2@123.com", "pending", getId("2"), JSON.stringify({}), getAsset("people2.png"), "student", "student_2"], + [getId("3"), "user3@123.com", "blocked", getId("3"), JSON.stringify({}), getAsset("people3.png"), "student", "student_3"], + [getId("4"), "user4@123.com", "active", getId("4"), JSON.stringify({}), getAsset("people4.png"), "student", "student_4"], + [getId("5"), "user5@123.com", "pending", getId("5"), JSON.stringify({}), getAsset("people5.png"), "student", "student_5"], ]; let users_collection = $app.findCollectionByNameOrId("users"); @@ -40,19 +42,29 @@ module.exports = ($app) => { let um_record = new Record(user_metas_collection); um_record.set("id", um[0]); um_record.set("helloworld", um[1]); - um_record.set("state", um[2]); + um_record.set("status", um[2]); um_record.set("user_id", um[3]); um_record.set("meta", um[4]); + + // NOTE: obslete "avatar" and use "avatar_file" um_record.set("avatar", um[5]); + um_record.set("avatar_file", um[5]); + // + um_record.set("role", um[6]); + um_record.set("name", um[7]); + um_record.set("email", user[3]); + um_record.set("phone", "9123456" + i.toString()); + $app.save(um_record); } console.log("006 add student user done"); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: delete this ? +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/007_Users_admin.js b/002_source/pocketbase/pb_hooks/seed/007_Users_admin.js new file mode 100644 index 0000000..214d480 --- /dev/null +++ b/002_source/pocketbase/pb_hooks/seed/007_Users_admin.js @@ -0,0 +1,52 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + +module.exports = ($app) => { + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset } = utils; + const ADMIN_USER_ID = getId("999"); + + let row_array = [[ADMIN_USER_ID, "admin@123.com", "admin@123.com", "admin@123.com", true, true, "test_admin_1"]]; + + // um = user_meta + let um_row_array = [[ADMIN_USER_ID, "admin@123.com", "active", ADMIN_USER_ID, JSON.stringify({}), getAsset("people1.png"), "admin", "admin_1"]]; + + let users_collection = $app.findCollectionByNameOrId("users"); + let user_metas_collection = $app.findCollectionByNameOrId("UserMetas"); + + for (let i = 0; i < row_array.length; i++) { + let user = row_array[i]; + let um = um_row_array[i]; + + let record = new Record(users_collection); + record.set("id", user[0]); + record.set("password", user[1]); + record.set("passwordConfirm", user[2]); + record.set("email", user[3]); + record.set("emailVisibility", user[4]); + record.set("verified", user[5]); + record.set("name", user[6]); + $app.save(record); + + let um_record = new Record(user_metas_collection); + um_record.set("id", um[0]); + um_record.set("helloworld", um[1]); + um_record.set("status", um[2]); + um_record.set("user_id", um[3]); + um_record.set("meta", um[4]); + + // NOTE: obslete "avatar" and use "avatar_file" + um_record.set("avatar", um[5]); + um_record.set("avatar_file", um[5]); + // + + um_record.set("role", um[6]); + um_record.set("name", um[7]); + um_record.set("email", user[3]); + um_record.set("phone", "9123456" + i.toString()); + + $app.save(um_record); + } + + console.log("007 add admin user done"); +}; diff --git a/002_source/pocketbase/pb_hooks/seed/010_Vocabularies.js b/002_source/pocketbase/pb_hooks/seed/010_Vocabularies.js index e2e8075..5bf831c 100644 --- a/002_source/pocketbase/pb_hooks/seed/010_Vocabularies.js +++ b/002_source/pocketbase/pb_hooks/seed/010_Vocabularies.js @@ -1,40 +1,58 @@ -const config = require('/pb_hooks/seed/config.js'); -const utils = require('/pb_hooks/seed/utils.js'); +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); -module.exports = $app => { - const { getAsset } = utils; - const { id_v, id_c, cat_id_tech } = config; +module.exports = ($app) => { + const { getId, getAsset, dirtyTruncateTable } = utils; + const { id_v, id_c, cat_id_news, cat_id_sport, cat_id_tech, cat_id_art, cat_id_basic, cat_id_nature, cat_id_workplace, cat_id_connectives_1 } = config; + // const getId = (id) => id.padStart(15, 0); let row_datas = [ - ['1'.padStart(15, 0), getAsset('keyboard.jpg'), getAsset('keyboard.mp3'), 'keyboard', '鍵盤', 'sample_e', 'sample_c', cat_id_tech, '', id_v], - ['2'.padStart(15, 0), getAsset('mouse.jpg'), getAsset('mouse.mp3'), 'mouse', '滑鼠', 'sample_e mouse', 'sample_c mouse', cat_id_tech, '', id_v], + [getId("1"), getAsset("keyboard.jpg"), getAsset("keyboard.mp3"), "keyboard", "鍵盤", "sample_e", "sample_c", cat_id_tech, "", id_v, "visible"], + [getId("2"), getAsset("mouse.jpg"), getAsset("mouse.mp3"), "mouse", "滑鼠", "sample_e mouse", "sample_c mouse", cat_id_tech, "", id_v, "visible"], + [getId("3"), getAsset("run.jpg"), getAsset("mouse.mp3"), "run", "跑步", "sample_e run", "sample_c run", cat_id_sport, "", id_v, "visible"], + [getId("4"), getAsset("swim.jpg"), getAsset("mouse.mp3"), "swim", "游泳", "sample_e swim", "sample_c swim", cat_id_sport, "", id_v, "visible"], + // + [getId("5"), getAsset("news1.jpg"), getAsset("news1.mp3"), "news", "新聞", "sample_e news1", "sample_c news1", cat_id_news, "", id_v, "visible"], + [getId("6"), getAsset("news2.jpg"), getAsset("news2.mp3"), "news", "新聞", "sample_e news2", "sample_c news2", cat_id_news, "", id_v, "visible"], + [getId("7"), getAsset("art1.jpg"), getAsset("art1.mp3"), "art", "藝術", "sample_e art1", "sample_c art1", cat_id_art, "", id_v, "visible"], + [getId("8"), getAsset("art2.jpg"), getAsset("art2.mp3"), "art", "藝術", "sample_e art2", "sample_c art2", cat_id_art, "", id_v, "visible"], + [getId("9"), getAsset("basic1.jpg"), getAsset("basic1.mp3"), "basic", "基礎", "sample_e basic1", "sample_c basic1", cat_id_basic, "", id_v, "visible"], + [getId("10"), getAsset("basic2.jpg"), getAsset("basic2.mp3"), "basic", "基礎", "sample_e basic2", "sample_c basic2", cat_id_basic, "", id_v, "visible"], + [getId("11"), getAsset("nature1.jpg"), getAsset("nature1.mp3"), "nature", "自然", "sample_e nature1", "sample_c nature1", cat_id_nature, "", id_v, "visible"], + [getId("12"), getAsset("nature2.jpg"), getAsset("nature2.mp3"), "nature", "自然", "sample_e nature2", "sample_c nature2", cat_id_nature, "", id_v, "visible"], + [getId("13"), getAsset("workplace1.jpg"), getAsset("workplace1.mp3"), "workplace", "工作場所", "sample_e workplace1", "sample_c workplace1", cat_id_workplace, "", id_v, "visible"], + [getId("14"), getAsset("workplace2.jpg"), getAsset("workplace2.mp3"), "workplace", "工作場所", "sample_e workplace2", "sample_c workplace2", cat_id_workplace, "", id_v, "visible"], + // + [getId("21"), getAsset("mouse.jpg"), getAsset("mouse.mp3"), "connectives 1", "連接詞 1", "connective sample_e 1", "connective sample_c 1", cat_id_connectives_1, "", id_c, "visible"], ]; - dirtyTruncateTable('Vocabularies'); + dirtyTruncateTable("Vocabularies"); for (let i = 0; i < row_datas.length; i++) { - let vocabularies_collection = $app.findCollectionByNameOrId('Vocabularies'); + let vocabularies_collection = $app.findCollectionByNameOrId("Vocabularies"); let data = row_datas[i]; let record = new Record(vocabularies_collection); - record.set('id', data[0]); - record.set('image', data[1]); - record.set('sound', data[2]); - record.set('word', data[3]); - record.set('word_c', data[4]); - record.set('sample_e', data[5]); - record.set('sample_c', data[6]); - record.set('cat_id', data[7]); - record.set('category', data[8]); - record.set('lesson_type_id', data[9]); + record.set("id", data[0]); + record.set("image", data[1]); + record.set("sound", data[2]); + record.set("word", data[3]); + record.set("word_c", data[4]); + record.set("sample_e", data[5]); + record.set("sample_c", data[6]); + record.set("cat_id", data[7]); + record.set("category", data[8]); + record.set("lesson_type_id", data[9]); + record.set("visible", data[10]); $app.save(record); } - console.log('done ?'); + console.log("done ?"); }; -const dirtyTruncateTable = COLLECTION_NAME => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd('sqlite3', '/pb_data/data.db', `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: delete me ? +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/020_QuizLPCategories.js b/002_source/pocketbase/pb_hooks/seed/020_QuizLPCategories.js index 2760ca9..174d3ae 100644 --- a/002_source/pocketbase/pb_hooks/seed/020_QuizLPCategories.js +++ b/002_source/pocketbase/pb_hooks/seed/020_QuizLPCategories.js @@ -1,9 +1,14 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const getId = (id) => id.padStart(15, 0); + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); let row_array = [ [getId("1"), "news (listening)", getAsset("ci_news.jpg"), 1, {}, "visible"], [getId("2"), "sports (listening)", getAsset("ci_sports.jpg"), 2, {}, "visible"], @@ -36,8 +41,9 @@ module.exports = ($app) => { console.log(`020_QuizLPCategories done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: delete me ? +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js b/002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js index 834f203..849302d 100644 --- a/002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js +++ b/002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js @@ -1,20 +1,20 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const cat_id_technology = "3".padStart(15, 0); - const getId = (id) => id.padStart(15, 0); + const { LP_cat_id_news, LP_cat_id_sports, LP_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + let row_array = [ - [getId("1") ,"news (LP)" ,getAsset("ci_news.jpg") ,1 ,{} ,"visible" ,"news" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("2") ,"sports (LP)" ,getAsset("ci_sports.jpg") ,2 ,{} ,"visible" ,"sports" ,getAsset("mouse.mp3") ,cat_id_technology] , - [getId("3") ,"technology (LP)" ,getAsset("ci_technology.jpg") ,3 ,{} ,"visible" ,"technology" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("4") ,"art (LP)" ,getAsset("ci_art.jpg") ,4 ,{} ,"visible" ,"art" ,getAsset("mouse.mp3") ,cat_id_technology] , - [getId("5") ,"basic (LP)" ,getAsset("ci_basic.jpg") ,5 ,{} ,"visible" ,"basic" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("6") ,"nature (LP)" ,getAsset("ci_nature.jpg") ,6 ,{} ,"visible" ,"nature" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("7") ,"workplace (LP)" ,getAsset("ci_workplace.jpg") ,7 ,{} ,"visible" ,"workplace" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("8") ,"workplace (LP)" ,getAsset("ci_workplace.jpg") ,8 ,{} ,"visible" ,"workplace" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("99") ,"test hidden (LP)" ,getAsset("ci_workplace.jpg") ,9 ,{} ,"hidden" ,"test" ,getAsset("keyboard.mp3") ,cat_id_technology] , + [getId("1"), "news (LP)", getAsset("ci_news.jpg"), 1, ["A", "B", "C"], "visible", "news", getAsset("keyboard.mp3"), LP_cat_id_news], + [getId("2"), "sports (LP)", getAsset("ci_sports.jpg"), 2, ["A", "B", "C"], "visible", "sports", getAsset("mouse.mp3"), LP_cat_id_news], + [getId("3"), "technology (LP)", getAsset("ci_technology.jpg"), 3, ["A", "B", "C"], "visible", "technology", getAsset("keyboard.mp3"), LP_cat_id_news], + [getId("4"), "art (LP)", getAsset("ci_art.jpg"), 4, ["A", "B", "C"], "visible", "art", getAsset("mouse.mp3"), LP_cat_id_sports], + [getId("5"), "basic (LP)", getAsset("ci_basic.jpg"), 5, ["A", "B", "C"], "visible", "basic", getAsset("keyboard.mp3"), LP_cat_id_sports], + [getId("6"), "nature (LP)", getAsset("ci_nature.jpg"), 6, ["A", "B", "C"], "visible", "nature", getAsset("keyboard.mp3"), LP_cat_id_sports], + [getId("7"), "workplace (LP)", getAsset("ci_workplace.jpg"), 7, ["A", "B", "C"], "visible", "workplace", getAsset("keyboard.mp3"), LP_cat_id_technology], + [getId("8"), "workplace (LP)", getAsset("ci_workplace.jpg"), 8, ["A", "B", "C"], "visible", "workplace", getAsset("keyboard.mp3"), LP_cat_id_technology], + [getId("99"), "test hidden (LP)", getAsset("ci_workplace.jpg"), 9, ["A", "B", "C"], "hidden", "test", getAsset("keyboard.mp3"), LP_cat_id_technology], ]; dirtyTruncateTable("QuizLPQuestions"); @@ -32,7 +32,7 @@ module.exports = ($app) => { record.set("visible", lesson_type[5]); record.set("word", lesson_type[6]); record.set("sound", lesson_type[7]); - record.set("cat_id", lesson_type[7]); + record.set("cat_id", lesson_type[8]); $app.save(record); } @@ -40,8 +40,9 @@ module.exports = ($app) => { console.log(`021_QuizLPQuestions done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js.plan b/002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js.plan deleted file mode 100644 index eed97f9..0000000 --- a/002_source/pocketbase/pb_hooks/seed/021_QuizLPQuestions.js.plan +++ /dev/null @@ -1,35 +0,0 @@ -module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const getId = (id) => id.padStart(15, 0); - const id_v = getId("1"); //id_vocabulary - const id_c = getId("2"); //id_connectives - - let row_array = [ - [getId("1"), "keyboard", getAsset("keyboard.jpg"), getId("1")], - [getId("2"), "mouse", getAsset("mouse.jpg"), getId("1")], - ]; - dirtyTruncateTable("QuizLPQuestions"); - - let lt_collection = $app.findCollectionByNameOrId("QuizLPQuestions"); - - for (let i = 0; i < row_array.length; i++) { - let lesson_type = row_array[i]; - - let record = new Record(lt_collection); - record.set("id", lesson_type[0]); - record.set("word", lesson_type[1]); - record.set("sound", lesson_type[2]); - record.set("cat_id", lesson_type[3]); - - $app.save(record); - } - - console.log(`021 QuizLPQuestions done`); -}; - -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; diff --git a/002_source/pocketbase/pb_hooks/seed/030_QuizMFCategories.js b/002_source/pocketbase/pb_hooks/seed/030_QuizMFCategories.js index 15b48bc..fa134a3 100644 --- a/002_source/pocketbase/pb_hooks/seed/030_QuizMFCategories.js +++ b/002_source/pocketbase/pb_hooks/seed/030_QuizMFCategories.js @@ -1,9 +1,15 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const getId = (id) => id.padStart(15, 0); + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); let row_array = [ [getId("1"), "news (matching)", getAsset("ci_news.jpg"), 1, {}, "visible"], [getId("2"), "sports (matching)", getAsset("ci_sports.jpg"), 2, {}, "visible"], @@ -36,8 +42,9 @@ module.exports = ($app) => { console.log(`030_QuizMFCategories done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/031_QuizMFQuestions.js b/002_source/pocketbase/pb_hooks/seed/031_QuizMFQuestions.js index 0abcf84..dd295be 100644 --- a/002_source/pocketbase/pb_hooks/seed/031_QuizMFQuestions.js +++ b/002_source/pocketbase/pb_hooks/seed/031_QuizMFQuestions.js @@ -1,20 +1,20 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const cat_id_technology = "3".padStart(15, 0); - const getId = (id) => id.padStart(15, 0); + const { MF_cat_id_news, MF_cat_id_sports, MF_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + let row_array = [ - [getId("1") ,"news (MF)" ,getAsset("ci_news.jpg") ,1 ,{} ,"visible" ,"news" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("2") ,"sports (MF)" ,getAsset("ci_sports.jpg") ,2 ,{} ,"visible" ,"sports" ,getAsset("mouse.mp3") ,cat_id_technology] , - [getId("3") ,"technology (MF)" ,getAsset("ci_technology.jpg") ,3 ,{} ,"visible" ,"technology" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("4") ,"art (MF)" ,getAsset("ci_art.jpg") ,4 ,{} ,"visible" ,"art" ,getAsset("mouse.mp3") ,cat_id_technology] , - [getId("5") ,"basic (MF)" ,getAsset("ci_basic.jpg") ,5 ,{} ,"visible" ,"basic" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("6") ,"nature (MF)" ,getAsset("ci_nature.jpg") ,6 ,{} ,"visible" ,"nature" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("7") ,"workplace (MF)" ,getAsset("ci_workplace.jpg") ,7 ,{} ,"visible" ,"workplace" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("8") ,"workplace (MF)" ,getAsset("ci_workplace.jpg") ,8 ,{} ,"visible" ,"workplace" ,getAsset("keyboard.mp3") ,cat_id_technology] , - [getId("99") ,"test hidden (MF)" ,getAsset("ci_workplace.jpg") ,9 ,{} ,"hidden" ,"test" ,getAsset("keyboard.mp3") ,cat_id_technology] , + [getId("1"), "news (MF)", getAsset("ci_news.jpg"), 1, ["A", "B", "C"], "visible", "chinese_1", getAsset("keyboard.mp3"), MF_cat_id_news, "中文1"], + [getId("2"), "sports (MF)", getAsset("ci_sports.jpg"), 2, ["A", "B", "C"], "visible", "chinese_2", getAsset("mouse.mp3"), MF_cat_id_news, "中文2"], + [getId("3"), "technology (MF)", getAsset("ci_technology.jpg"), 3, ["A", "B", "C"], "visible", "chinese_3", getAsset("keyboard.mp3"), MF_cat_id_news, "中文3"], + [getId("4"), "art (MF)", getAsset("ci_art.jpg"), 4, ["A", "B", "C"], "visible", "chinese_1", getAsset("mouse.mp3"), MF_cat_id_sports, "中文1"], + [getId("5"), "basic (MF)", getAsset("ci_basic.jpg"), 5, ["A", "B", "C"], "visible", "chinese_2", getAsset("keyboard.mp3"), MF_cat_id_sports, "中文2"], + [getId("6"), "nature (MF)", getAsset("ci_nature.jpg"), 6, ["A", "B", "C"], "visible", "chinese_3", getAsset("keyboard.mp3"), MF_cat_id_sports, "中文3"], + [getId("7"), "workplace (MF)", getAsset("ci_workplace.jpg"), 7, ["A", "B", "C"], "visible", "chinese_1", getAsset("keyboard.mp3"), MF_cat_id_technology, "中文1"], + [getId("8"), "workplace (MF)", getAsset("ci_workplace.jpg"), 8, ["A", "B", "C"], "visible", "chinese_2", getAsset("keyboard.mp3"), MF_cat_id_technology, "中文2"], + [getId("99"), "test hidden (MF)", getAsset("ci_workplace.jpg"), 9, ["A", "B", "C"], "hidden", "chinese_3", getAsset("keyboard.mp3"), MF_cat_id_technology, "中文3"], ]; dirtyTruncateTable("QuizMFQuestions"); @@ -32,7 +32,8 @@ module.exports = ($app) => { record.set("visible", lesson_type[5]); record.set("word", lesson_type[6]); record.set("sound", lesson_type[7]); - record.set("cat_id", lesson_type[7]); + record.set("cat_id", lesson_type[8]); + record.set("word_c", lesson_type[9]); $app.save(record); } @@ -40,8 +41,9 @@ module.exports = ($app) => { console.log(`031_QuizMFQuestions done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/040_QuizCRCategories.js b/002_source/pocketbase/pb_hooks/seed/040_QuizCRCategories.js index 7db62e0..21d4dc7 100644 --- a/002_source/pocketbase/pb_hooks/seed/040_QuizCRCategories.js +++ b/002_source/pocketbase/pb_hooks/seed/040_QuizCRCategories.js @@ -1,9 +1,16 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const getId = (id) => id.padStart(15, 0); + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); + let row_array = [ [getId("1"), "news (connective)", getAsset("ci_news.jpg"), 1, {}, "visible"], [getId("2"), "sports (connective)", getAsset("ci_sports.jpg"), 2, {}, "visible"], @@ -36,8 +43,9 @@ module.exports = ($app) => { console.log(`040_QuizCRCategories done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/041_QuizCRQuestions.js b/002_source/pocketbase/pb_hooks/seed/041_QuizCRQuestions.js index 3b314c9..b0bb589 100644 --- a/002_source/pocketbase/pb_hooks/seed/041_QuizCRQuestions.js +++ b/002_source/pocketbase/pb_hooks/seed/041_QuizCRQuestions.js @@ -1,155 +1,26 @@ +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); + module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const cat_id_technology = "3".padStart(15, 0); - const getId = (id) => id.padStart(15, 0); + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const cat_id_technology = "3".padStart(15, 0); + // const getId = (id) => id.padStart(15, 0); let row_array = [ - [ - getId("1"), - "news (CR)", - getAsset("ci_news.jpg"), - 1, - ["A", "B", "C"], - "visible", - "news", - getAsset("keyboard.mp3"), - cat_id_technology, - "question_fh_1", - "question_sh_1", - "modal_ans_1", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("2"), - "sports (CR)", - getAsset("ci_sports.jpg"), - 2, - ["A", "B", "C"], - "visible", - "sports", - getAsset("mouse.mp3"), - cat_id_technology, - "question_fh_2", - "question_sh_2", - "modal_ans_2", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("3"), - "technology (CR)", - getAsset("ci_technology.jpg"), - 3, - ["A", "B", "C"], - "visible", - "technology", - getAsset("keyboard.mp3"), - cat_id_technology, - "question_fh_3", - "question_sh_3", - "modal_ans_3", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("4"), - "art (CR)", - getAsset("ci_art.jpg"), - 4, - ["A", "B", "C"], - "visible", - "art", - getAsset("mouse.mp3"), - cat_id_technology, - "question_fh_4", - "question_sh_4", - "modal_ans_4", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("5"), - "basic (CR)", - getAsset("ci_basic.jpg"), - 5, - ["A", "B", "C"], - "visible", - "basic", - getAsset("keyboard.mp3"), - cat_id_technology, - "question_fh_5", - "question_sh_5", - "modal_ans_5", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("6"), - "nature (CR)", - getAsset("ci_nature.jpg"), - 6, - ["A", "B", "C"], - "visible", - "nature", - getAsset("keyboard.mp3"), - cat_id_technology, - "question_fh_6", - "question_sh_6", - "modal_ans_6", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("7"), - "workplace (CR)", - getAsset("ci_workplace.jpg"), - 7, - ["A", "B", "C"], - "visible", - "workplace", - getAsset("keyboard.mp3"), - cat_id_technology, - "question_fh_7", - "question_sh_7", - "modal_ans_7", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("8"), - "workplace (CR)", - getAsset("ci_workplace.jpg"), - 8, - ["A", "B", "C"], - "visible", - "workplace", - getAsset("keyboard.mp3"), - cat_id_technology, - "question_fh_8", - "question_sh_8", - "modal_ans_8", - cat_id_technology, - ["A", "B", "C"], - ], - [ - getId("99"), - "test hidden (CR)", - getAsset("ci_workplace.jpg"), - 9, - ["A", "B", "C"], - "hidden", - "test", - getAsset("keyboard.mp3"), - cat_id_technology, - "question_fh_9", - "question_sh_9", - "modal_ans_9", - cat_id_technology, - ["A", "B", "C"], - ], + [getId("1"), "news (CR)", getAsset("ci_news.jpg"), 1, ["A", "B", "C"], "visible", "news", getAsset("keyboard.mp3"), CR_cat_id_technology, "question_fh_1", "question_sh_1", "modal_ans_1", CR_cat_id_news, ["A", "B", "C"]], + [getId("2"), "sports (CR)", getAsset("ci_sports.jpg"), 2, ["A", "B", "C"], "visible", "sports", getAsset("mouse.mp3"), CR_cat_id_technology, "question_fh_2", "question_sh_2", "modal_ans_2", CR_cat_id_news, ["A", "B", "C"]], + [getId("3"), "technology (CR)", getAsset("ci_technology.jpg"), 3, ["A", "B", "C"], "visible", "technology", getAsset("keyboard.mp3"), CR_cat_id_technology, "question_fh_3", "question_sh_3", "modal_ans_3", CR_cat_id_news, ["A", "B", "C"]], + [getId("4"), "art (CR)", getAsset("ci_art.jpg"), 4, ["A", "B", "C"], "visible", "art", getAsset("mouse.mp3"), CR_cat_id_technology, "question_fh_4", "question_sh_4", "modal_ans_4", CR_cat_id_news, ["A", "B", "C"]], + [getId("5"), "basic (CR)", getAsset("ci_basic.jpg"), 5, ["A", "B", "C"], "visible", "basic", getAsset("keyboard.mp3"), CR_cat_id_technology, "question_fh_5", "question_sh_5", "modal_ans_5", CR_cat_id_news, ["A", "B", "C"]], + [getId("6"), "nature (CR)", getAsset("ci_nature.jpg"), 6, ["A", "B", "C"], "visible", "nature", getAsset("keyboard.mp3"), CR_cat_id_technology, "question_fh_6", "question_sh_6", "modal_ans_6", CR_cat_id_technology, ["A", "B", "C"]], + [getId("7"), "workplace (CR)", getAsset("ci_workplace.jpg"), 7, ["A", "B", "C"], "visible", "workplace", getAsset("keyboard.mp3"), CR_cat_id_technology, "question_fh_7", "question_sh_7", "modal_ans_7", CR_cat_id_technology, ["A", "B", "C"]], + [getId("8"), "workplace (CR)", getAsset("ci_workplace.jpg"), 8, ["A", "B", "C"], "visible", "workplace", getAsset("keyboard.mp3"), CR_cat_id_technology, "question_fh_8", "question_sh_8", "modal_ans_8", CR_cat_id_technology, ["A", "B", "C"]], + [getId("99"), "test hidden (CR)", getAsset("ci_workplace.jpg"), 9, ["A", "B", "C"], "hidden", "test", getAsset("keyboard.mp3"), CR_cat_id_technology, "question_fh_9", "question_sh_9", "modal_ans_9", CR_cat_id_technology, ["A", "B", "C"]], ]; dirtyTruncateTable("QuizCRQuestions"); @@ -167,7 +38,7 @@ module.exports = ($app) => { record.set("visible", lesson_type[5]); record.set("word", lesson_type[6]); record.set("sound", lesson_type[7]); - record.set("cat_id", lesson_type[7]); + // record.set("cat_id", lesson_type[7]); record.set("question_fh", lesson_type[9]); record.set("question_sh", lesson_type[10]); record.set("modal_ans", lesson_type[11]); @@ -180,8 +51,9 @@ module.exports = ($app) => { console.log(`041_QuizCRQuestions done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/050_Customers.js b/002_source/pocketbase/pb_hooks/seed/050_Customers.js index 2a27e75..1e9cbf8 100644 --- a/002_source/pocketbase/pb_hooks/seed/050_Customers.js +++ b/002_source/pocketbase/pb_hooks/seed/050_Customers.js @@ -1,17 +1,23 @@ // // RULES: this is not a normal nodejs engine, it is a nodejs provided by golang, so fakerjs cannot be used here // +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); +// module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const getId = (id) => id.padStart(15, 0); + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); // generate from `./project/001_documentation/Requirements/REQ0006/gen_customer/gen_customer.mjs` const SAMPLE_CUSTOMER_ARRAY = [ [ - "000000000000001", + getId("1"), "May", getAsset("customer1.png"), "June_Wintheiser33@hotmail.com", @@ -32,7 +38,7 @@ module.exports = ($app) => { "active", ], [ - "000000000000002", + getId("2"), "Marilyne", getAsset("customer2.png"), "Carol_Blick@yahoo.com", @@ -53,7 +59,7 @@ module.exports = ($app) => { "pending", ], [ - "000000000000003", + getId("3"), "Jacklyn", getAsset("customer3.png"), "Tamara_Lynch11@yahoo.com", @@ -74,7 +80,7 @@ module.exports = ($app) => { "blocked", ], [ - "000000000000004", + getId("4"), "Alana", getAsset("customer4.png"), "Ahmed_Willms@hotmail.com", @@ -95,7 +101,7 @@ module.exports = ($app) => { "active", ], [ - "000000000000005", + getId("5"), "Rocky", getAsset("customer5.png"), "Angela_Kuhic@gmail.com", @@ -145,8 +151,9 @@ module.exports = ($app) => { console.log(`050_Customers done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/051_Teachers.js b/002_source/pocketbase/pb_hooks/seed/051_Teachers_xxx.js similarity index 80% rename from 002_source/pocketbase/pb_hooks/seed/051_Teachers.js rename to 002_source/pocketbase/pb_hooks/seed/051_Teachers_xxx.js index 0a991cc..2b2b9f0 100644 --- a/002_source/pocketbase/pb_hooks/seed/051_Teachers.js +++ b/002_source/pocketbase/pb_hooks/seed/051_Teachers_xxx.js @@ -1,13 +1,17 @@ // // RULES: this is not a normal nodejs engine, it is a nodejs provided by golang, so fakerjs cannot be used here // +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); +// module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const getId = (id) => id.padStart(15, 0); - + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); // generate from `./project/001_documentation/Requirements/REQ0006/gen_customer/gen_customer.mjs` const TEACHER_ARRAY = [ [ @@ -145,8 +149,9 @@ module.exports = ($app) => { console.log(`051_Teacher done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/052_Students.js b/002_source/pocketbase/pb_hooks/seed/052_Students.js index b66f021..aced88f 100644 --- a/002_source/pocketbase/pb_hooks/seed/052_Students.js +++ b/002_source/pocketbase/pb_hooks/seed/052_Students.js @@ -1,12 +1,18 @@ // // RULES: this is not a normal nodejs engine, it is a nodejs provided by golang, so fakerjs cannot be used here // +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); +// module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const getId = (id) => id.padStart(15, 0); + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); // generate from `./project/001_documentation/Requirements/REQ0006/gen_customer/gen_customer.mjs` const STUDENT_ARRAY = [ @@ -145,8 +151,9 @@ module.exports = ($app) => { console.log(`052_Students done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/060_Notifications.js b/002_source/pocketbase/pb_hooks/seed/060_Notifications.js index 09d86f0..4bf733d 100644 --- a/002_source/pocketbase/pb_hooks/seed/060_Notifications.js +++ b/002_source/pocketbase/pb_hooks/seed/060_Notifications.js @@ -1,53 +1,25 @@ // // RULES: this is not a normal nodejs engine, it is a nodejs provided by golang, so fakerjs cannot be used here // +const config = require("/pb_hooks/seed/config.js"); +const utils = require("/pb_hooks/seed/utils.js"); +// module.exports = ($app) => { - const ASSETS_DIR = "/pb_hooks/assets"; - const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); - const id_v = "1".padStart(15, 0); //id_vocabulary - const id_c = "2".padStart(15, 0); //id_connectives - const getId = (id) => id.padStart(15, 0); + const { CR_cat_id_news, CR_cat_id_technology } = config; + const { getId, getAsset, dirtyTruncateTable } = utils; + + // const ASSETS_DIR = "/pb_hooks/assets"; + // const getAsset = (name) => $filesystem.fileFromPath(ASSETS_DIR + "/" + name); + // const id_v = "1".padStart(15, 0); //id_vocabulary + // const id_c = "2".padStart(15, 0); //id_connectives + // const getId = (id) => id.padStart(15, 0); // generate from `./project/001_documentation/Requirements/REQ0006/gen_customer/gen_customer.mjs` const SAMPLE_CUSTOMER_ARRAY = [ - [ - getId('1'), - 'EV-004', - false, - 'new_job', - { "id":getId("1"),"name": 'Jie Yan', "avatar": '/assets/avatar-8.png' }, - { "title": 'Remote React / React Native Developer' }, - "" - ], - [ - getId('2'), - 'EV-003', - true, - 'new_job', - { "id": getId("2"),"name": 'Fran Perez', "avatar": '/assets/avatar-5.png' }, - { "title": 'Senior Golang Backend Engineer' }, - "" - - ], - [ - getId('3'), - 'EV-002', - true, - 'new_feature', - '', - '', - 'Logistics management is now available' - ], - [ - getId('4'), - 'EV-001', - true, - 'new_company', - {"id":getId("3"), "name": 'Jie Yan', "avatar": '/assets/avatar-8.png' }, - { "name": 'Stripe' }, - "" - - ], + [getId("1"), "EV-004", false, "new_job", { id: getId("1"), name: "Jie Yan", avatar: "/assets/avatar-8.png" }, { title: "Remote React / React Native Developer" }, ""], + [getId("2"), "EV-003", true, "new_job", { id: getId("2"), name: "Fran Perez", avatar: "/assets/avatar-5.png" }, { title: "Senior Golang Backend Engineer" }, ""], + [getId("3"), "EV-002", true, "new_feature", "", "", "Logistics management is now available"], + [getId("4"), "EV-001", true, "new_company", { id: getId("3"), name: "Jie Yan", avatar: "/assets/avatar-8.png" }, { name: "Stripe" }, ""], ]; let row_array = SAMPLE_CUSTOMER_ARRAY; @@ -73,8 +45,9 @@ module.exports = ($app) => { console.log(`060_Notifications done`); }; -const dirtyTruncateTable = (COLLECTION_NAME) => { - console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); - const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); - cmd_to_exec.output(); -}; +// TODO: remove me +// const dirtyTruncateTable = (COLLECTION_NAME) => { +// console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); +// const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); +// cmd_to_exec.output(); +// }; diff --git a/002_source/pocketbase/pb_hooks/seed/config.js b/002_source/pocketbase/pb_hooks/seed/config.js index dc3ae1b..891018c 100644 --- a/002_source/pocketbase/pb_hooks/seed/config.js +++ b/002_source/pocketbase/pb_hooks/seed/config.js @@ -1,6 +1,27 @@ module.exports = { - ASSETS_DIR: '/pb_hooks/assets', - id_v: '1'.padStart(15, 0), //id_vocabulary - id_c: '2'.padStart(15, 0), //id_connectives - cat_id_tech: '3'.padStart(15, 0), // category id of technology + ASSETS_DIR: "/pb_hooks/assets", + id_v: "1".padStart(15, 0), //id_vocabulary + id_c: "2".padStart(15, 0), //id_connectives + // + cat_id_news: "1".padStart(15, 0), // category id of news + cat_id_sport: "2".padStart(15, 0), // category id of sports + cat_id_tech: "3".padStart(15, 0), // category id of technology + cat_id_art: "4".padStart(15, 0), // category id of art + cat_id_basic: "5".padStart(15, 0), // category id of basic + cat_id_nature: "6".padStart(15, 0), // category id of nature + cat_id_workplace: "7".padStart(15, 0), // category id of workplace + // + cat_id_connectives_1: "11".padStart(15, 0), // category id of workplace + // + LP_cat_id_news: "1".padStart(15, 0), + LP_cat_id_sports: "2".padStart(15, 0), + LP_cat_id_technology: "3".padStart(15, 0), + // + MF_cat_id_news: "1".padStart(15, 0), + MF_cat_id_sports: "2".padStart(15, 0), + MF_cat_id_technology: "3".padStart(15, 0), + // + CR_cat_id_news: "1".padStart(15, 0), + CR_cat_id_sports: "2".padStart(15, 0), + CR_cat_id_technology: "3".padStart(15, 0), }; diff --git a/002_source/pocketbase/pb_hooks/seed/schema.json b/002_source/pocketbase/pb_hooks/seed/schema.json index 2148c38..d0abb32 100644 --- a/002_source/pocketbase/pb_hooks/seed/schema.json +++ b/002_source/pocketbase/pb_hooks/seed/schema.json @@ -304,6 +304,34 @@ "presentable": false, "system": false, "type": "autodate" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2058414169", + "max": 0, + "min": 0, + "name": "visible", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1146066909", + "max": 0, + "min": 0, + "name": "phone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" } ], "indexes": [ @@ -520,6 +548,201 @@ "indexes": [], "system": false }, + { + "id": "pbc_108570809", + "listRule": "", + "viewRule": "", + "createRule": "", + "updateRule": "", + "deleteRule": "", + "name": "Customers", + "type": "base", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3885137012", + "max": 0, + "min": 0, + "name": "email", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1146066909", + "max": 0, + "min": 0, + "name": "phone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number1813778413", + "max": null, + "min": null, + "name": "quota", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2063623452", + "max": 0, + "min": 0, + "name": "status", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "file507207115", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "avatar_file", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + }, + { + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2809058197", + "maxSelect": 1, + "minSelect": 0, + "name": "user_id", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "json2115670734", + "maxSize": 0, + "name": "billingAddress", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text922858135", + "max": 0, + "min": 0, + "name": "timezone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3571151285", + "max": 0, + "min": 0, + "name": "language", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1767278655", + "max": 0, + "min": 0, + "name": "currency", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "indexes": [], + "system": false + }, { "id": "pbc_1196309394", "listRule": "", @@ -787,6 +1010,125 @@ "indexes": [], "system": false }, + { + "id": "pbc_977978967", + "listRule": "", + "viewRule": "", + "createRule": "", + "updateRule": "", + "deleteRule": "", + "name": "Notifications", + "type": "base", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "bool2555855207", + "name": "read", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2363381545", + "max": 0, + "min": 0, + "name": "type", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "json3182418120", + "maxSize": 0, + "name": "author", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "json4225294584", + "maxSize": 0, + "name": "job", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1843675174", + "max": 0, + "min": 0, + "name": "description", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1798508311", + "max": 0, + "min": 0, + "name": "NOTI_ID", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "indexes": [], + "system": false + }, { "id": "pbc_4061499106", "listRule": "", @@ -993,6 +1335,16 @@ "presentable": false, "system": false, "type": "autodate" + }, + { + "hidden": false, + "id": "json227240121", + "maxSize": 0, + "name": "init_answer", + "presentable": false, + "required": false, + "system": false, + "type": "json" } ], "indexes": [], @@ -1933,6 +2285,16 @@ "system": false, "thumbs": [], "type": "file" + }, + { + "hidden": false, + "id": "json3915970527", + "maxSize": 0, + "name": "init_answer", + "presentable": false, + "required": false, + "system": false, + "type": "json" } ], "indexes": [], @@ -2027,6 +2389,396 @@ "indexes": [], "system": false }, + { + "id": "pbc_491894781", + "listRule": "", + "viewRule": "", + "createRule": "", + "updateRule": "", + "deleteRule": "", + "name": "Students", + "type": "base", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3885137012", + "max": 0, + "min": 0, + "name": "email", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1146066909", + "max": 0, + "min": 0, + "name": "phone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number1813778413", + "max": null, + "min": null, + "name": "quota", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2063623452", + "max": 0, + "min": 0, + "name": "status", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "file507207115", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "avatar_file", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + }, + { + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2809058197", + "maxSelect": 1, + "minSelect": 0, + "name": "user_id", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "json2115670734", + "maxSize": 0, + "name": "billingAddress", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text922858135", + "max": 0, + "min": 0, + "name": "timezone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3571151285", + "max": 0, + "min": 0, + "name": "language", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1767278655", + "max": 0, + "min": 0, + "name": "currency", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "indexes": [], + "system": false + }, + { + "id": "pbc_1413424569", + "listRule": "", + "viewRule": "", + "createRule": "", + "updateRule": "", + "deleteRule": "", + "name": "Teachers", + "type": "base", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3885137012", + "max": 0, + "min": 0, + "name": "email", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1146066909", + "max": 0, + "min": 0, + "name": "phone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number1813778413", + "max": null, + "min": null, + "name": "quota", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2063623452", + "max": 0, + "min": 0, + "name": "status", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "file507207115", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "avatar_file", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + }, + { + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2809058197", + "maxSelect": 1, + "minSelect": 0, + "name": "user_id", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "json2115670734", + "maxSize": 0, + "name": "billingAddress", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text922858135", + "max": 0, + "min": 0, + "name": "timezone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3571151285", + "max": 0, + "min": 0, + "name": "language", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1767278655", + "max": 0, + "min": 0, + "name": "currency", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "indexes": [], + "system": false + }, { "id": "pbc_1305841361", "listRule": "", @@ -2114,7 +2866,7 @@ "id": "text2744374011", "max": 0, "min": 0, - "name": "state", + "name": "status", "pattern": "", "presentable": false, "primaryKey": false, @@ -2149,6 +2901,45 @@ "required": false, "system": false, "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "email3885137012", + "name": "email", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "email" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1146066909", + "max": 0, + "min": 0, + "name": "phone", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" } ], "indexes": [], @@ -2321,6 +3112,34 @@ "presentable": false, "system": false, "type": "autodate" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2058414169", + "max": 0, + "min": 0, + "name": "visible", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2363381545", + "max": 0, + "min": 0, + "name": "type", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" } ], "indexes": [], @@ -2722,6 +3541,138 @@ ], "system": true }, + { + "id": "pbc_1509025625", + "listRule": null, + "viewRule": null, + "createRule": null, + "updateRule": null, + "deleteRule": null, + "name": "billingAddress", + "type": "base", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1400097126", + "max": 0, + "min": 0, + "name": "country", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2744374011", + "max": 0, + "min": 0, + "name": "state", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text760939060", + "max": 0, + "min": 0, + "name": "city", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text4114525948", + "max": 0, + "min": 0, + "name": "zipCode", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3620973610", + "max": 0, + "min": 0, + "name": "line1", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1322974608", + "max": 0, + "min": 0, + "name": "line2", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "indexes": [], + "system": false + }, { "id": "pbc_123408445", "listRule": "", diff --git a/002_source/pocketbase/pb_hooks/seed/utils.js b/002_source/pocketbase/pb_hooks/seed/utils.js index 27d917e..86a8ec3 100644 --- a/002_source/pocketbase/pb_hooks/seed/utils.js +++ b/002_source/pocketbase/pb_hooks/seed/utils.js @@ -1,12 +1,19 @@ -const config = require('/pb_hooks/seed/config.js'); +const config = require("/pb_hooks/seed/config.js"); module.exports = { - getAsset: name => { - const file_full_path = config.ASSETS_DIR + '/' + name; + getAsset: (name) => { + const file_full_path = config.ASSETS_DIR + "/" + name; try { return $filesystem.fileFromPath(file_full_path); } catch (error) { - console.log('file not found: ' + file_full_path, +'please check if file exist'); + console.log("file not found: " + file_full_path, +"please check if file exist"); } }, + getId: (id) => id.padStart(15, 0), + + dirtyTruncateTable: (COLLECTION_NAME) => { + console.log(`perform dirty method to truncate table "${COLLECTION_NAME}"`); + const cmd_to_exec = $os.cmd("sqlite3", "/pb_data/data.db", `DELETE from ${COLLECTION_NAME};`); + cmd_to_exec.output(); + }, };