diff --git a/.devcontainer/compose.extend.yml b/.devcontainer/compose.extend.yml new file mode 100644 index 00000000..ac2a77a3 --- /dev/null +++ b/.devcontainer/compose.extend.yml @@ -0,0 +1,13 @@ +services: + web: + image: node:22-bookworm + depends_on: + - db + restart: unless-stopped + # mounts the workspace folder from the local source tree into the Dev Container. + volumes: + - .:/workspace/cathedral:cached + # Overrides default command so things don't shut down after the process ends. + command: /bin/sh -c "while sleep 1000; do :; done" + # puts the Dev Container on the same network as the database, so that it can access it on localhost + network_mode: service:db \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3dfff5ca..0fd04cf9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,15 +1,22 @@ // For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node { - "name": "Node.js", - // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile - "image": "mcr.microsoft.com/devcontainers/javascript-node:dev-22-bookworm", + "name": "Cathedral", + "dockerComposeFile": [ + "../compose.yml", + "compose.extend.yml" + ], + "service": "web", + "workspaceFolder": "/workspace/${localWorkspaceFolderBasename}", + "shutdownAction": "stopCompose", // Features to add to the dev container. More info: https://containers.dev/features. "features": {}, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "npm install", + // https://www.kenmuse.com/blog/avoiding-dubious-ownership-in-dev-containers/ + "postStartCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}", // Configure tool-specific properties. "customizations": { "vscode": { diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..01798365 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +POSTGRES_USER: postgres +POSTGRES_PASSWORD: postgres +POSTGRES_HOST: localhost +POSTGRES_PORT: 5432 +POSTGRES_DB: cathedral \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8aad0668..b9e22af5 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,4 @@ logs public/apple-touch-icon-*.png public/favicon.ico public/maskable-icon-*.png -public/pwa-*.png - -# database -server/data/db/cathedral.sqlite \ No newline at end of file +public/pwa-*.png \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..050b8d63 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "client: chrome", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}" + }, + { + "type": "node", + "request": "launch", + "name": "server: nuxt", + "outputCapture": "std", + "program": "${workspaceFolder}/node_modules/nuxi/bin/nuxi.mjs", + "args": [ + "dev" + ], + } + ], + "compounds": [ + { + "name": "fullstack: nuxt", + "configurations": [ + "server: nuxt", + "client: chrome" + ] + } + ] +} \ No newline at end of file diff --git a/app.config.ts b/app.config.ts index d6968049..bd21c2c2 100644 --- a/app.config.ts +++ b/app.config.ts @@ -1,4 +1,3 @@ export default defineAppConfig({ - darkMode: 'light', - connString: 'idb://cathedral' + darkMode: 'light' }) diff --git a/application/AssumptionInteractor.ts b/application/AssumptionInteractor.ts deleted file mode 100644 index e56c0860..00000000 --- a/application/AssumptionInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Assumption from "../domain/Assumption"; - -export default class AssumptionInteractor extends Interactor { } \ No newline at end of file diff --git a/application/ComponentInteractor.ts b/application/ComponentInteractor.ts deleted file mode 100644 index 4b92d21b..00000000 --- a/application/ComponentInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Component from "~/domain/Component"; - -export default class ComponentInteractor extends Interactor { } \ No newline at end of file diff --git a/application/ConstraintCategoryInteractor.ts b/application/ConstraintCategoryInteractor.ts deleted file mode 100644 index 383bc9b3..00000000 --- a/application/ConstraintCategoryInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type ConstraintCategory from "../domain/ConstraintCategory"; - -export default class ConstraintCategoryInteractor extends Interactor { } \ No newline at end of file diff --git a/application/ConstraintInteractor.ts b/application/ConstraintInteractor.ts deleted file mode 100644 index 879ae01f..00000000 --- a/application/ConstraintInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Constraint from "../domain/Constraint"; - -export default class ConstraintInteractor extends Interactor { } \ No newline at end of file diff --git a/application/EffectInteractor.ts b/application/EffectInteractor.ts deleted file mode 100644 index 3fe6cf29..00000000 --- a/application/EffectInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Effect from "../domain/Effect"; - -export default class EffectInteractor extends Interactor { } \ No newline at end of file diff --git a/application/FunctionalBehaviorInteractor.ts b/application/FunctionalBehaviorInteractor.ts deleted file mode 100644 index 4e7a8464..00000000 --- a/application/FunctionalBehaviorInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type FunctionalBehavior from "../domain/FunctionalBehavior"; - -export default class FunctionalBehaviorInteractor extends Interactor { } \ No newline at end of file diff --git a/application/GlossaryTermInteractor.ts b/application/GlossaryTermInteractor.ts deleted file mode 100644 index bef8f168..00000000 --- a/application/GlossaryTermInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type GlossaryTerm from "../domain/GlossaryTerm"; - -export default class GlossaryTermInteractor extends Interactor { } \ No newline at end of file diff --git a/application/GoalInteractor.ts b/application/GoalInteractor.ts deleted file mode 100644 index 1ca989c8..00000000 --- a/application/GoalInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Goal from "../domain/Goal"; - -export default class GoalInteractor extends Interactor { } \ No newline at end of file diff --git a/application/Interactor.ts b/application/Interactor.ts deleted file mode 100644 index 797c3165..00000000 --- a/application/Interactor.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type Entity from "~/domain/Entity"; -import type Repository from "./Repository"; -import type { Uuid } from "~/domain/Uuid"; -import type { Properties } from "~/domain/Properties"; - -export default abstract class Interactor { - constructor( - readonly repository: Repository - ) { } - - create(item: Omit, 'id'>): Promise { - return this.repository.create(item) - } - - delete(id: Uuid): Promise { - return this.repository.delete(id) - } - - get(id: Uuid): Promise { - return this.repository.get(id) - } - - getAll(criteria?: Partial>): Promise { - return this.repository.getAll(criteria) - } - - update(item: Properties): Promise { - return this.repository.update(item) - } -} \ No newline at end of file diff --git a/application/InvariantInteractor.ts b/application/InvariantInteractor.ts deleted file mode 100644 index f6062076..00000000 --- a/application/InvariantInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Invariant from "../domain/Invariant"; - -export default class InvariantInteractor extends Interactor { } \ No newline at end of file diff --git a/application/LimitInteractor.ts b/application/LimitInteractor.ts deleted file mode 100644 index 159b238f..00000000 --- a/application/LimitInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Limit from "../domain/Limit"; - -export default class LimitInteractor extends Interactor { } \ No newline at end of file diff --git a/application/NonFunctionalBehaviorInteractor.ts b/application/NonFunctionalBehaviorInteractor.ts deleted file mode 100644 index a7a96829..00000000 --- a/application/NonFunctionalBehaviorInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type NonFunctionalBehavior from "../domain/NonFunctionalBehavior"; - -export default class NonFunctionalBehaviorInteractor extends Interactor { } \ No newline at end of file diff --git a/application/ObstacleInteractor.ts b/application/ObstacleInteractor.ts deleted file mode 100644 index 453c80c1..00000000 --- a/application/ObstacleInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Obstacle from "../domain/Obstacle"; - -export default class ObstacleInteractor extends Interactor { } \ No newline at end of file diff --git a/application/OutcomeInteractor.ts b/application/OutcomeInteractor.ts deleted file mode 100644 index 71ca40c1..00000000 --- a/application/OutcomeInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Outcome from "../domain/Outcome"; - -export default class OutcomeInteractor extends Interactor { } \ No newline at end of file diff --git a/application/PersonInteractor.ts b/application/PersonInteractor.ts deleted file mode 100644 index c936b6cd..00000000 --- a/application/PersonInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Person from "../domain/Person"; - -export default class PersonInteractor extends Interactor { } \ No newline at end of file diff --git a/application/SolutionInteractor.ts b/application/SolutionInteractor.ts deleted file mode 100644 index 0c506d2d..00000000 --- a/application/SolutionInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type Solution from "../domain/Solution"; -import Interactor from "~/application/Interactor"; - -export default class SolutionInteractor extends Interactor { } \ No newline at end of file diff --git a/application/StakeholderCategoryInteractor.ts b/application/StakeholderCategoryInteractor.ts deleted file mode 100644 index 8f1744b1..00000000 --- a/application/StakeholderCategoryInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type StakeholderCategory from "../domain/StakeholderCategory"; - -export default class StakeholderCategoryInteractor extends Interactor { } \ No newline at end of file diff --git a/application/StakeholderInteractor.ts b/application/StakeholderInteractor.ts deleted file mode 100644 index f98eeb21..00000000 --- a/application/StakeholderInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type Stakeholder from "../domain/Stakeholder"; - -export default class StakeholderInteractor extends Interactor { } \ No newline at end of file diff --git a/application/StakeholderSegmentationInteractor.ts b/application/StakeholderSegmentationInteractor.ts deleted file mode 100644 index 3ab8242d..00000000 --- a/application/StakeholderSegmentationInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type StakeholderSegmentation from "../domain/StakeholderSegmentation"; - -export default class StakeholderSegmentationInteractor extends Interactor { } \ No newline at end of file diff --git a/application/UseCase.ts b/application/UseCase.ts deleted file mode 100644 index 85c363f8..00000000 --- a/application/UseCase.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default abstract class UseCase { - abstract execute(input: T): Promise -} \ No newline at end of file diff --git a/application/UseCaseInteractor.ts b/application/UseCaseInteractor.ts deleted file mode 100644 index 522a705e..00000000 --- a/application/UseCaseInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import type UseCase from "../domain/UseCase"; - -export default class UseCaseInteractor extends Interactor { } \ No newline at end of file diff --git a/application/UserStoryInteractor.ts b/application/UserStoryInteractor.ts deleted file mode 100644 index 4f693f06..00000000 --- a/application/UserStoryInteractor.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Interactor from "~/application/Interactor"; -import UserStory from "../domain/UserStory"; - -export default class UserStoryInteractor extends Interactor { } \ No newline at end of file diff --git a/components/XDataTable.vue b/components/XDataTable.vue index 0a1c3228..0d240f84 100644 --- a/components/XDataTable.vue +++ b/components/XDataTable.vue @@ -1,16 +1,18 @@ - - diff --git a/pages/index.vue b/pages/index.client.vue similarity index 100% rename from pages/index.vue rename to pages/index.client.vue diff --git a/pages/settings.vue b/pages/settings.client.vue similarity index 52% rename from pages/settings.vue rename to pages/settings.client.vue index 8d1792d6..b70d9900 100644 --- a/pages/settings.vue +++ b/pages/settings.client.vue @@ -3,8 +3,4 @@ useHead({ title: 'Settings' }) \ No newline at end of file diff --git a/pages/solution/[slug]/edit-entry.vue b/pages/solution/[slug]/edit-entry.client.vue similarity index 67% rename from pages/solution/[slug]/edit-entry.vue rename to pages/solution/[slug]/edit-entry.client.vue index 8df7d9eb..c538ee9d 100644 --- a/pages/solution/[slug]/edit-entry.vue +++ b/pages/solution/[slug]/edit-entry.client.vue @@ -1,26 +1,23 @@ @@ -40,8 +37,8 @@ watch(() => name.value, (newName) => {
- +
@@ -57,7 +54,7 @@ watch(() => name.value, (newName) => {
+ class="w-23rem" :maxlength="Solution.maxDescriptionLength" v-model.trim="solution.description" />
diff --git a/pages/solution/[slug]/environment/assumptions.vue b/pages/solution/[slug]/environment/assumptions.client.vue similarity index 64% rename from pages/solution/[slug]/environment/assumptions.vue rename to pages/solution/[slug]/environment/assumptions.client.vue index 0591157a..b179c1ff 100644 --- a/pages/solution/[slug]/environment/assumptions.vue +++ b/pages/solution/[slug]/environment/assumptions.client.vue @@ -1,24 +1,19 @@ diff --git a/pages/solution/[slug]/environment/components.vue b/pages/solution/[slug]/environment/components.client.vue similarity index 50% rename from pages/solution/[slug]/environment/components.vue rename to pages/solution/[slug]/environment/components.client.vue index c5dbb8fc..4964c317 100644 --- a/pages/solution/[slug]/environment/components.vue +++ b/pages/solution/[slug]/environment/components.client.vue @@ -1,55 +1,52 @@ @@ -58,8 +55,8 @@ const onUpdate = async (data: ComponentViewModel) => { Environment components are the EXTERNAL elements that the system interacts with. These external components expose interfaces that the system uses to communicate with.

- +