From bb968706ada5eab7411778ad11abffe9c4aee3ac Mon Sep 17 00:00:00 2001 From: "Lin, Hung-Shin" Date: Sun, 26 Nov 2023 18:29:52 +0800 Subject: [PATCH] feat: refactor quest models + separate stage and exception + reuse commandResponder --- packages/models/commandResponder.js | 19 ++++++ packages/models/condition.js | 28 ++++++++ packages/models/exception.js | 8 +++ packages/models/globalException.js | 10 +++ packages/models/hint.js | 10 +++ packages/models/quest.js | 100 ++-------------------------- packages/models/requirement.js | 12 ++++ packages/models/response.js | 15 +++++ packages/models/stage.js | 24 +++++++ packages/models/stageException.js | 14 ++++ 10 files changed, 146 insertions(+), 94 deletions(-) create mode 100644 packages/models/commandResponder.js create mode 100644 packages/models/condition.js create mode 100644 packages/models/exception.js create mode 100644 packages/models/globalException.js create mode 100644 packages/models/hint.js create mode 100644 packages/models/requirement.js create mode 100644 packages/models/response.js create mode 100644 packages/models/stage.js create mode 100644 packages/models/stageException.js diff --git a/packages/models/commandResponder.js b/packages/models/commandResponder.js new file mode 100644 index 0000000..0078cb7 --- /dev/null +++ b/packages/models/commandResponder.js @@ -0,0 +1,19 @@ +import { Schema } from 'mongoose' +import conditionSchema from './condition.js' +import responseSchema from './response.js' +import hintSchema from './hint.js' + +const commandResponderSchema = new Schema({ + condition: { + type: conditionSchema, + required: false, + }, + responses: { + type: [responseSchema], + required: true, + }, +}) + +commandResponderSchema.add(hintSchema) + +export default commandResponderSchema diff --git a/packages/models/condition.js b/packages/models/condition.js new file mode 100644 index 0000000..8f236af --- /dev/null +++ b/packages/models/condition.js @@ -0,0 +1,28 @@ +import { Schema } from 'mongoose' + +const fileConditionSchema = new Schema({ + path: { + type: String, + required: true, + }, + type: String, + exists: { + type: Boolean, + default: true, + }, +}) + +const conditionSchema = new Schema({ + command: [String], + output: [String], + error: [String], + pwd: [String], + files: [fileConditionSchema], +}) + +conditionSchema.add({ + or: [conditionSchema], + not: conditionSchema, +}) + +export default conditionSchema diff --git a/packages/models/exception.js b/packages/models/exception.js new file mode 100644 index 0000000..60e90b6 --- /dev/null +++ b/packages/models/exception.js @@ -0,0 +1,8 @@ +import { Schema } from 'mongoose' +import commandResponderSchema from './commandResponder.js' + +const exceptionSchema = new Schema({}) + +exceptionSchema.add(commandResponderSchema) + +export default exceptionSchema diff --git a/packages/models/globalException.js b/packages/models/globalException.js new file mode 100644 index 0000000..5fd191d --- /dev/null +++ b/packages/models/globalException.js @@ -0,0 +1,10 @@ +import { Schema } from 'mongoose' +import exceptionSchema from './exception.js' +import requirementSchema from './requirement.js' + +const globalExceptionSchema = new Schema({}) + +globalExceptionSchema.add(exceptionSchema) +globalExceptionSchema.add(requirementSchema) + +export default globalExceptionSchema diff --git a/packages/models/hint.js b/packages/models/hint.js new file mode 100644 index 0000000..a46eab9 --- /dev/null +++ b/packages/models/hint.js @@ -0,0 +1,10 @@ +import { Schema } from 'mongoose' + +const hintSchema = new Schema({ + hints: { + type: [String], + required: true, + }, +}) + +export default hintSchema diff --git a/packages/models/quest.js b/packages/models/quest.js index 2f808cb..69f4c80 100644 --- a/packages/models/quest.js +++ b/packages/models/quest.js @@ -1,98 +1,6 @@ import { model, Schema } from 'mongoose' - -const responseSchema = new Schema({ - type: { - type: String, - enum: ['narrative', 'dialogue'], - default: 'dialogue', - required: true, - }, - content: [String], - speaker: { type: String, default: 'Ada' }, - color: String, -}) - -const fileConditionSchema = new Schema({ - path: { - type: String, - required: true, - }, - type: String, - exists: { - type: Boolean, - default: true, - }, -}) - -const conditionSchema = new Schema({ - command: [String], - output: [String], - error: [String], - pwd: [String], - files: [fileConditionSchema], -}) - -conditionSchema.add({ - or: [conditionSchema], - not: conditionSchema, -}) - -const exceptionSchema = new Schema({ - condition: { - type: conditionSchema, - required: false, - }, - catchAll: { - type: Boolean, - required: true, - default: false, - }, - responses: { - type: [responseSchema], - required: true, - }, - hints: { - type: [String], - required: true, - }, -}) - -const stageSchema = new Schema({ - id: { - type: String, - required: true, - }, - task: { - type: String, - }, - requirements: [ - { - type: String, - required: true, - }, - ], - repeatable: { - type: Boolean, - required: true, - default: false, - }, - condition: { - type: conditionSchema, - required: true, - }, - responses: { - type: [responseSchema], - required: true, - }, - hints: { - type: [String], - required: true, - }, - exceptions: { - type: [exceptionSchema], - required: true, - }, -}) +import stageSchema from './stage.js' +import globalExceptionSchema from './globalException.js' const Quest = model( 'Quest', @@ -126,6 +34,10 @@ const Quest = model( type: [stageSchema], required: true, }, + exceptions: { + type: [globalExceptionSchema], + required: true, + }, }) ) diff --git a/packages/models/requirement.js b/packages/models/requirement.js new file mode 100644 index 0000000..9edf61e --- /dev/null +++ b/packages/models/requirement.js @@ -0,0 +1,12 @@ +import { Schema } from 'mongoose' + +const requirementSchema = new Schema({ + requirements: [ + { + type: String, + required: true, + }, + ], +}) + +export default requirementSchema diff --git a/packages/models/response.js b/packages/models/response.js new file mode 100644 index 0000000..a2bf5b0 --- /dev/null +++ b/packages/models/response.js @@ -0,0 +1,15 @@ +import { Schema } from 'mongoose' + +const responseSchema = new Schema({ + type: { + type: String, + enum: ['narrative', 'dialogue'], + default: 'dialogue', + required: true, + }, + content: [String], + speaker: { type: String, default: 'Ada' }, + color: String, +}) + +export default responseSchema diff --git a/packages/models/stage.js b/packages/models/stage.js new file mode 100644 index 0000000..73c6070 --- /dev/null +++ b/packages/models/stage.js @@ -0,0 +1,24 @@ +import { Schema } from 'mongoose' +import commandResponderSchema from './commandResponder.js' +import stageExceptionSchema from './stageException.js' +import requirementSchema from './requirement.js' + +const stageSchema = new Schema({ + id: { + type: String, + required: true, + }, + task: { + type: String, + required: true, + }, + exceptions: { + type: [stageExceptionSchema], + required: true, + }, +}) + +stageSchema.add(commandResponderSchema) +stageSchema.add(requirementSchema) + +export default stageSchema diff --git a/packages/models/stageException.js b/packages/models/stageException.js new file mode 100644 index 0000000..f11d7d7 --- /dev/null +++ b/packages/models/stageException.js @@ -0,0 +1,14 @@ +import { Schema } from 'mongoose' +import exceptionSchema from './exception.js' + +const stageExceptionSchema = new Schema({ + catchAll: { + type: Boolean, + required: true, + default: false, + }, +}) + +stageExceptionSchema.add(exceptionSchema) + +export default stageExceptionSchema