From be427eda102c02aefc79b960ccdbf121e88cc54b Mon Sep 17 00:00:00 2001 From: AndrewTrieu Date: Thu, 9 Mar 2023 11:21:18 +0200 Subject: [PATCH] First commit --- .Rhistory | 0 README.md | 7 +++ docker-compose.yml | 43 +++++++++++++++++++ drill-and-practice/Dockerfile | 13 ++++++ drill-and-practice/app-launch.js | 3 ++ drill-and-practice/app.js | 14 ++++++ drill-and-practice/config/readme.txt | 1 + drill-and-practice/database/database.js | 10 +++++ drill-and-practice/deps.js | 11 +++++ .../middlewares/errorMiddleware.js | 9 ++++ .../middlewares/renderMiddleware.js | 16 +++++++ .../middlewares/serveStaticMiddleware.js | 15 +++++++ drill-and-practice/routes/apis/readme.txt | 1 + .../routes/controllers/mainController.js | 5 +++ drill-and-practice/routes/routes.js | 8 ++++ drill-and-practice/services/readme.txt | 1 + drill-and-practice/static/readme.txt | 1 + drill-and-practice/tests/readme.txt | 1 + drill-and-practice/views/layouts/layout.eta | 1 + drill-and-practice/views/main.eta | 3 ++ drill-and-practice/views/partials/readme.txt | 1 + e2e-playwright/Dockerfile | 9 ++++ e2e-playwright/package.json | 8 ++++ e2e-playwright/playwright.config.js | 19 ++++++++ e2e-playwright/tests/hello-world.spec.js | 5 +++ flyway/sql/V1___initial_schema.sql | 41 ++++++++++++++++++ project.env | 16 +++++++ 27 files changed, 262 insertions(+) create mode 100644 .Rhistory create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 drill-and-practice/Dockerfile create mode 100644 drill-and-practice/app-launch.js create mode 100644 drill-and-practice/app.js create mode 100644 drill-and-practice/config/readme.txt create mode 100644 drill-and-practice/database/database.js create mode 100644 drill-and-practice/deps.js create mode 100644 drill-and-practice/middlewares/errorMiddleware.js create mode 100644 drill-and-practice/middlewares/renderMiddleware.js create mode 100644 drill-and-practice/middlewares/serveStaticMiddleware.js create mode 100644 drill-and-practice/routes/apis/readme.txt create mode 100644 drill-and-practice/routes/controllers/mainController.js create mode 100644 drill-and-practice/routes/routes.js create mode 100644 drill-and-practice/services/readme.txt create mode 100644 drill-and-practice/static/readme.txt create mode 100644 drill-and-practice/tests/readme.txt create mode 100644 drill-and-practice/views/layouts/layout.eta create mode 100644 drill-and-practice/views/main.eta create mode 100644 drill-and-practice/views/partials/readme.txt create mode 100644 e2e-playwright/Dockerfile create mode 100644 e2e-playwright/package.json create mode 100644 e2e-playwright/playwright.config.js create mode 100644 e2e-playwright/tests/hello-world.spec.js create mode 100644 flyway/sql/V1___initial_schema.sql create mode 100644 project.env diff --git a/.Rhistory b/.Rhistory new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a48dbcf --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Project 2: XXX + +Write the documentation of your project here. Do not include your personal +details (e.g. name or student number). + +Remember to include the address of the online location where your project is +running as it is a key part of the submission. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9260e97 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,43 @@ +version: "3.4" + +services: + drill-and-practice: + build: drill-and-practice + image: drill-and-practice + restart: "no" + volumes: + - ./drill-and-practice/:/app + ports: + - 7777:7777 + depends_on: + - database + - flyway + env_file: + - project.env + + database: + container_name: database-p2-e8774b8e-c7a9-4cce-a779-3b59be02206d + image: postgres:14.1 + restart: "no" + env_file: + - project.env + + flyway: + image: flyway/flyway:9.11.0-alpine + depends_on: + - database + volumes: + - .:/flyway/sql + command: -connectRetries=60 -baselineOnMigrate=true migrate + env_file: + - project.env + + e2e-playwright: + entrypoint: "/bin/true" # Prevent startup on docker-compose up + build: e2e-playwright + image: e2e-playwright + network_mode: host + depends_on: + - drill-and-practice + volumes: + - ./e2e-playwright/tests:/e2e-playwright/tests \ No newline at end of file diff --git a/drill-and-practice/Dockerfile b/drill-and-practice/Dockerfile new file mode 100644 index 0000000..7297269 --- /dev/null +++ b/drill-and-practice/Dockerfile @@ -0,0 +1,13 @@ +FROM denoland/deno:alpine-1.29.2 + +EXPOSE 7777 + +WORKDIR /app + +COPY deps.js . + +RUN deno cache deps.js + +COPY . . + +CMD [ "run", "--unstable", "--watch", "--allow-net", "--allow-read", "--allow-env", "--no-check", "app-launch.js" ] \ No newline at end of file diff --git a/drill-and-practice/app-launch.js b/drill-and-practice/app-launch.js new file mode 100644 index 0000000..0b5139b --- /dev/null +++ b/drill-and-practice/app-launch.js @@ -0,0 +1,3 @@ +import { app } from "./app.js"; + +app.listen({ port: 7777 }); diff --git a/drill-and-practice/app.js b/drill-and-practice/app.js new file mode 100644 index 0000000..e7970cd --- /dev/null +++ b/drill-and-practice/app.js @@ -0,0 +1,14 @@ +import { Application } from "./deps.js"; +import { errorMiddleware } from "./middlewares/errorMiddleware.js"; +import { renderMiddleware } from "./middlewares/renderMiddleware.js"; +import { serveStaticMiddleware } from "./middlewares/serveStaticMiddleware.js"; +import { router } from "./routes/routes.js"; + +const app = new Application(); + +app.use(errorMiddleware); +app.use(serveStaticMiddleware); +app.use(renderMiddleware); +app.use(router.routes()); + +export { app }; diff --git a/drill-and-practice/config/readme.txt b/drill-and-practice/config/readme.txt new file mode 100644 index 0000000..f3fec56 --- /dev/null +++ b/drill-and-practice/config/readme.txt @@ -0,0 +1 @@ +You could add project configuration files here. \ No newline at end of file diff --git a/drill-and-practice/database/database.js b/drill-and-practice/database/database.js new file mode 100644 index 0000000..a2a2600 --- /dev/null +++ b/drill-and-practice/database/database.js @@ -0,0 +1,10 @@ +import { postgres } from "../deps.js"; + +let sql; +if (Deno.env.get("DATABASE_URL")) { + sql = postgres(Deno.env.get("DATABASE_URL")); +} else { + sql = postgres({}); +} + +export { sql }; diff --git a/drill-and-practice/deps.js b/drill-and-practice/deps.js new file mode 100644 index 0000000..de76cf2 --- /dev/null +++ b/drill-and-practice/deps.js @@ -0,0 +1,11 @@ +export { configure, renderFile } from "https://deno.land/x/eta@v2.0.0/mod.ts"; +export { + Application, + Router, + send, +} from "https://deno.land/x/oak@v11.1.0/mod.ts"; +import postgres from "https://deno.land/x/postgresjs@v3.3.3/mod.js"; +export { postgres }; +export { Session } from "https://deno.land/x/oak_sessions@v4.0.5/mod.ts"; +export * as bcrypt from "https://deno.land/x/bcrypt@v0.4.1/mod.ts"; +export * as validasaur from "https://deno.land/x/validasaur@v0.15.0/mod.ts"; diff --git a/drill-and-practice/middlewares/errorMiddleware.js b/drill-and-practice/middlewares/errorMiddleware.js new file mode 100644 index 0000000..f0e2373 --- /dev/null +++ b/drill-and-practice/middlewares/errorMiddleware.js @@ -0,0 +1,9 @@ +const errorMiddleware = async (context, next) => { + try { + await next(); + } catch (e) { + console.log(e); + } +}; + +export { errorMiddleware }; diff --git a/drill-and-practice/middlewares/renderMiddleware.js b/drill-and-practice/middlewares/renderMiddleware.js new file mode 100644 index 0000000..d735040 --- /dev/null +++ b/drill-and-practice/middlewares/renderMiddleware.js @@ -0,0 +1,16 @@ +import { configure, renderFile } from "../deps.js"; + +const renderMiddleware = async (context, next) => { + configure({ + views: `${Deno.cwd()}/views/`, + }); + + context.render = async (file, data) => { + context.response.headers.set("Content-Type", "text/html; charset=utf-8"); + context.response.body = await renderFile(file, data); + }; + + await next(); +}; + +export { renderMiddleware }; diff --git a/drill-and-practice/middlewares/serveStaticMiddleware.js b/drill-and-practice/middlewares/serveStaticMiddleware.js new file mode 100644 index 0000000..041e9a4 --- /dev/null +++ b/drill-and-practice/middlewares/serveStaticMiddleware.js @@ -0,0 +1,15 @@ +import { send } from "../deps.js"; + +const serveStaticMiddleware = async (context, next) => { + if (context.request.url.pathname.startsWith("/static")) { + const path = context.request.url.pathname.substring(7); + + await send(context, path, { + root: `${Deno.cwd()}/static`, + }); + } else { + await next(); + } +}; + +export { serveStaticMiddleware }; diff --git a/drill-and-practice/routes/apis/readme.txt b/drill-and-practice/routes/apis/readme.txt new file mode 100644 index 0000000..3151dea --- /dev/null +++ b/drill-and-practice/routes/apis/readme.txt @@ -0,0 +1 @@ +You could add api-related endpoints here. \ No newline at end of file diff --git a/drill-and-practice/routes/controllers/mainController.js b/drill-and-practice/routes/controllers/mainController.js new file mode 100644 index 0000000..3927f09 --- /dev/null +++ b/drill-and-practice/routes/controllers/mainController.js @@ -0,0 +1,5 @@ +const showMain = ({ render }) => { + render("main.eta"); +}; + +export { showMain }; diff --git a/drill-and-practice/routes/routes.js b/drill-and-practice/routes/routes.js new file mode 100644 index 0000000..44cd48f --- /dev/null +++ b/drill-and-practice/routes/routes.js @@ -0,0 +1,8 @@ +import { Router } from "../deps.js"; +import * as mainController from "./controllers/mainController.js"; + +const router = new Router(); + +router.get("/", mainController.showMain); + +export { router }; diff --git a/drill-and-practice/services/readme.txt b/drill-and-practice/services/readme.txt new file mode 100644 index 0000000..8be2a0e --- /dev/null +++ b/drill-and-practice/services/readme.txt @@ -0,0 +1 @@ +You could add services here \ No newline at end of file diff --git a/drill-and-practice/static/readme.txt b/drill-and-practice/static/readme.txt new file mode 100644 index 0000000..de4317a --- /dev/null +++ b/drill-and-practice/static/readme.txt @@ -0,0 +1 @@ +You could add static content here. Note that you cannot currently submit binary data. \ No newline at end of file diff --git a/drill-and-practice/tests/readme.txt b/drill-and-practice/tests/readme.txt new file mode 100644 index 0000000..8fb4892 --- /dev/null +++ b/drill-and-practice/tests/readme.txt @@ -0,0 +1 @@ +Implement tests here. \ No newline at end of file diff --git a/drill-and-practice/views/layouts/layout.eta b/drill-and-practice/views/layouts/layout.eta new file mode 100644 index 0000000..3d6632f --- /dev/null +++ b/drill-and-practice/views/layouts/layout.eta @@ -0,0 +1 @@ +<%~ it.body %> diff --git a/drill-and-practice/views/main.eta b/drill-and-practice/views/main.eta new file mode 100644 index 0000000..4601935 --- /dev/null +++ b/drill-and-practice/views/main.eta @@ -0,0 +1,3 @@ +<% layout("./layouts/layout.eta") %> + +

Hello world!

diff --git a/drill-and-practice/views/partials/readme.txt b/drill-and-practice/views/partials/readme.txt new file mode 100644 index 0000000..b5ac817 --- /dev/null +++ b/drill-and-practice/views/partials/readme.txt @@ -0,0 +1 @@ +Add any necessary partials here. \ No newline at end of file diff --git a/e2e-playwright/Dockerfile b/e2e-playwright/Dockerfile new file mode 100644 index 0000000..aa38567 --- /dev/null +++ b/e2e-playwright/Dockerfile @@ -0,0 +1,9 @@ +FROM mcr.microsoft.com/playwright:v1.29.2-focal + +COPY . /e2e-playwright + +WORKDIR /e2e-playwright + +RUN npm install + +CMD [ "npx", "playwright", "test", "--reporter=list" ] \ No newline at end of file diff --git a/e2e-playwright/package.json b/e2e-playwright/package.json new file mode 100644 index 0000000..0becd67 --- /dev/null +++ b/e2e-playwright/package.json @@ -0,0 +1,8 @@ +{ + "name": "e2e-playwright-in-docker", + "version": "1.0.0", + "dependencies": { + "playwright": "^1.29.2", + "@playwright/test": "^1.29.2" + } +} \ No newline at end of file diff --git a/e2e-playwright/playwright.config.js b/e2e-playwright/playwright.config.js new file mode 100644 index 0000000..a048c5e --- /dev/null +++ b/e2e-playwright/playwright.config.js @@ -0,0 +1,19 @@ +module.exports = { + timeout: 10000, + retries: 0, + reporter: "list", + workers: 5, + use: { + baseURL: "http://localhost:7777", + headless: true, + ignoreHTTPSErrors: true, + }, + projects: [ + { + name: "e2e-headless-chromium", + use: { + browserName: "chromium", + }, + }, + ], +}; \ No newline at end of file diff --git a/e2e-playwright/tests/hello-world.spec.js b/e2e-playwright/tests/hello-world.spec.js new file mode 100644 index 0000000..64e155f --- /dev/null +++ b/e2e-playwright/tests/hello-world.spec.js @@ -0,0 +1,5 @@ +const { test, expect } = require("@playwright/test"); + +test("Empty test", async ({ page }) => { + +}); \ No newline at end of file diff --git a/flyway/sql/V1___initial_schema.sql b/flyway/sql/V1___initial_schema.sql new file mode 100644 index 0000000..4f8ce02 --- /dev/null +++ b/flyway/sql/V1___initial_schema.sql @@ -0,0 +1,41 @@ +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + email VARCHAR(255) UNIQUE, + password CHAR(60), + admin BOOLEAN DEFAULT FALSE +); + +CREATE TABLE topics ( + id SERIAL PRIMARY KEY, + user_id INTEGER REFERENCES users(id), + name VARCHAR(255) UNIQUE +); + +CREATE TABLE questions ( + id SERIAL PRIMARY KEY, + user_id INTEGER REFERENCES users(id), + topic_id INTEGER REFERENCES topics(id), + question_text TEXT NOT NULL +); + +CREATE TABLE question_answer_options ( + id SERIAL PRIMARY KEY, + question_id INTEGER REFERENCES questions(id), + option_text TEXT NOT NULL, + is_correct BOOLEAN DEFAULT FALSE +); + +CREATE TABLE question_answers ( + id SERIAL PRIMARY KEY, + user_id INTEGER REFERENCES users(id), + question_id INTEGER REFERENCES questions(id), + question_answer_option_id INTEGER REFERENCES question_answer_options(id) +); + +CREATE UNIQUE INDEX ON users((lower(email))); + +INSERT INTO users (email, password, admin) + VALUES ('admin@admin.com','$2a$10$IML8QCf6xA.alRbW.CG5PuvYc3Qs94vJvoTwbsSehs8s515cUMuZa', true); + +INSERT INTO topics (user_id, name) + VALUES ((SELECT id FROM users WHERE email = 'admin@admin.com'), 'Finnish language'); diff --git a/project.env b/project.env new file mode 100644 index 0000000..d85243e --- /dev/null +++ b/project.env @@ -0,0 +1,16 @@ +# Database configuration for PostgreSQL (running in container called "database-p2-e8774b8e-c7a9-4cce-a779-3b59be02206d") +POSTGRES_USER=username +POSTGRES_PASSWORD=password +POSTGRES_DB=database + +# Database configuration for Flyway (used for database migrations) +FLYWAY_USER=username +FLYWAY_PASSWORD=password +FLYWAY_URL=jdbc:postgresql://database-p2-e8774b8e-c7a9-4cce-a779-3b59be02206d:5432/database + +# Database configuration for Deno's PostgreSQL driver +PGUSER=username +PGPASSWORD=password +PGHOST=database-p2-e8774b8e-c7a9-4cce-a779-3b59be02206d +PGPORT=5432 +PGDATABASE=database