From 918e9741bf212abead900bfeced2de61977b1ab3 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 12:22:52 +0100 Subject: [PATCH 01/32] replaced imports from shared submodule to http links --- .gitignore | 2 +- Pro0428-LocalEventShared | 1 + shared | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 160000 Pro0428-LocalEventShared diff --git a/.gitignore b/.gitignore index 24bbf88..2162829 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ node_modules PROMPTS.md To-do.md Claude/ -.claude/ \ No newline at end of file +.claude/ diff --git a/Pro0428-LocalEventShared b/Pro0428-LocalEventShared new file mode 160000 index 0000000..1592042 --- /dev/null +++ b/Pro0428-LocalEventShared @@ -0,0 +1 @@ +Subproject commit 15920427aa1a0dea6d5d636f7b1614783bd1d974 diff --git a/shared b/shared index bddcaa7..1592042 160000 --- a/shared +++ b/shared @@ -1 +1 @@ -Subproject commit bddcaa7804d4987f6cb84dc19d07359c1c16a8c7 +Subproject commit 15920427aa1a0dea6d5d636f7b1614783bd1d974 From 63a1b775416aea30b13c14a3c10c353d7dbfe55a Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 12:26:43 +0100 Subject: [PATCH 02/32] deno deploy fix --- Pro0428-LocalEventShared | 1 - deno.json | 1 - deno.lock | 5 +++- replace-imports.ts | 36 +++++++++++++++++++++++++ shared | 2 +- src/controllers/auth.controller.ts | 2 +- src/controllers/user.controller.ts | 2 +- src/services/auth.service.ts | 2 +- src/services/user.service.ts | 4 +-- src/utils/event.utils.ts | 2 +- testing/dummyData/event.samples.ts | 2 +- testing/dummyData/realData.samples.ts | 2 +- testing/testScripts/event.utils.test.ts | 2 +- 13 files changed, 50 insertions(+), 13 deletions(-) delete mode 160000 Pro0428-LocalEventShared create mode 100644 replace-imports.ts diff --git a/Pro0428-LocalEventShared b/Pro0428-LocalEventShared deleted file mode 160000 index 1592042..0000000 --- a/Pro0428-LocalEventShared +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 15920427aa1a0dea6d5d636f7b1614783bd1d974 diff --git a/deno.json b/deno.json index cfe60d1..2582fc7 100644 --- a/deno.json +++ b/deno.json @@ -8,7 +8,6 @@ "event-test": "deno run --allow-read --allow-write testing/testScripts/event.utils.test.ts" }, "imports": { - "models/": "./shared/src/models/", "mongodb": "npm:mongodb", "zod": "npm:zod", "@openai/openai": "jsr:@openai/openai@^4.98.0" diff --git a/deno.lock b/deno.lock index 5ca1e50..6e1490a 100644 --- a/deno.lock +++ b/deno.lock @@ -224,7 +224,10 @@ "https://deno.land/x/zod@v3.24.4/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c", "https://deno.land/x/zod@v3.24.4/mod.ts": "ec6e2b1255c1a350b80188f97bd0a6bac45801bb46fc48f50b9763aa66046039", "https://deno.land/x/zod@v3.24.4/standard-schema.ts": "4abb2e7bd784fb95d219584673971bb317e74fb4fd0c74c196b558ba46df4456", - "https://deno.land/x/zod@v3.24.4/types.ts": "cfdd77407d4b06e79bd63e9cfdb6091489aeb5f432d03a68c0531c1965d001fb" + "https://deno.land/x/zod@v3.24.4/types.ts": "cfdd77407d4b06e79bd63e9cfdb6091489aeb5f432d03a68c0531c1965d001fb", + "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/deps.ts": "fdb5c487e374fb289d37836f0c89ce1f1d0a56c131e01c10cb797aec1e5a8f7f", + "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts": "ef793ba4fe8a964fbddbeb9b38440810db0ccbd257afbde9592ba336ec3eafc7", + "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts": "1e863d6b3803d775c5784e3dfd9d8374c379f46c5d66e64c5c442bd10effacd4" }, "workspace": { "dependencies": [ diff --git a/replace-imports.ts b/replace-imports.ts new file mode 100644 index 0000000..6fcea25 --- /dev/null +++ b/replace-imports.ts @@ -0,0 +1,36 @@ +// replace-imports.ts +const filesToUpdate = [ + "src/controllers/auth.controller.ts", + "src/controllers/user.controller.ts", + "src/services/auth.service.ts", + "src/services/user.service.ts", + "src/utils/event.utils.ts", + "testing/dummyData/event.samples.ts", + "testing/dummyData/realData.samples.ts", + "testing/testScripts/event.utils.test.ts", +]; + +const remoteBaseURL = "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/"; + +for (const filePath of filesToUpdate) { + try { + let content = await Deno.readTextFile(filePath); + + // Regex to find imports from 'models/...' (single or double quotes) + const importRegex = /from\s+['"]models\/([^'"]+)['"]/g; + + // Replace all matching imports + const newContent = content.replace(importRegex, (_, modulePath) => { + return `from "${remoteBaseURL}${modulePath}"`; + }); + + if (content !== newContent) { + await Deno.writeTextFile(filePath, newContent); + console.log(`Updated imports in ${filePath}`); + } else { + console.log(`No imports to update in ${filePath}`); + } + } catch (error) { + console.error(`Failed to process ${filePath}:`, error.message); + } +} diff --git a/shared b/shared index 1592042..91990f8 160000 --- a/shared +++ b/shared @@ -1 +1 @@ -Subproject commit 15920427aa1a0dea6d5d636f7b1614783bd1d974 +Subproject commit 91990f8491802928a0dfa0f91b63f8894c4e893d diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index 9499db8..257fa43 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -1,6 +1,6 @@ // deno-lint-ignore-file require-await import { Context, RouterContext, Status } from '../../deps.ts'; -import { UserLogInSchema, UserSignUpSchema } from 'models/user.model.ts'; +import { UserLogInSchema, UserSignUpSchema } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; import { authService } from '../services/auth.service.ts'; export const getCurrentUser = async (ctx: Context) => { diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index d6f52cd..3286a61 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -2,7 +2,7 @@ import { Context, RouterContext } from '../../deps.ts'; import { userService } from '../services/user.service.ts'; import { Status } from '../../deps.ts'; -import { toSafeUser } from 'models/user.model.ts'; +import { toSafeUser } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; export const getUserProfile = async (ctx: Context) => { // TODO: Get user data from ctx.state.user ctx.response.body = { message: 'Get user profile' }; diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index 1a1e2e9..6d602c0 100644 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -5,7 +5,7 @@ import { UserInDB, UserLogInInput, UserSignUpInput, -} from 'models/user.model.ts'; +} from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; import { compare, hash } from '../../deps.ts'; import { generateToken } from '../utils/token.utils.ts'; import type { OptionalId } from '../../deps.ts'; diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 502575d..656ce9f 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -5,9 +5,9 @@ import 'https://deno.land/std@0.224.0/dotenv/load.ts'; import { db } from '../database/connect.ts'; -import { UserInDB } from 'models/user.model.ts'; +import { UserInDB } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; import { hash, OptionalId } from '../../deps.ts'; -import { NewUser } from 'models/user.model.ts'; +import { NewUser } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; const users = db.collection>('users'); diff --git a/src/utils/event.utils.ts b/src/utils/event.utils.ts index 4253acf..db81796 100644 --- a/src/utils/event.utils.ts +++ b/src/utils/event.utils.ts @@ -1,4 +1,4 @@ -import { Event, FrequencyObject, FullEvent } from 'models/event.model.ts'; +import { Event, FrequencyObject, FullEvent } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; // Initial cleaning of titles export const normalizeEventTitle = (event: Event): string => { diff --git a/testing/dummyData/event.samples.ts b/testing/dummyData/event.samples.ts index 092730c..5bce4ad 100644 --- a/testing/dummyData/event.samples.ts +++ b/testing/dummyData/event.samples.ts @@ -1,4 +1,4 @@ -import { Event } from 'models/event.model.ts'; +import { Event } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; // Test event examples export const testEvents: Event[] = [ diff --git a/testing/dummyData/realData.samples.ts b/testing/dummyData/realData.samples.ts index 56da6fc..dc6d748 100644 --- a/testing/dummyData/realData.samples.ts +++ b/testing/dummyData/realData.samples.ts @@ -1,4 +1,4 @@ -import { Event } from 'models/event.model.ts'; +import { Event } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; export const realData: Array = [ { diff --git a/testing/testScripts/event.utils.test.ts b/testing/testScripts/event.utils.test.ts index 3b28cbd..59e95f2 100644 --- a/testing/testScripts/event.utils.test.ts +++ b/testing/testScripts/event.utils.test.ts @@ -1,4 +1,4 @@ -import { FrequencyObject, FullEvent } from 'models/event.model.ts'; +import { FrequencyObject, FullEvent } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; import { realData } from '../dummyData/realData.samples.ts'; import { addNormalizedProperties, From ecc21a6f099e8e7c5a3be24ff76042a6f4ae27be Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 14:54:25 +0100 Subject: [PATCH 03/32] experimental delete of shred folder --- shared | 1 - 1 file changed, 1 deletion(-) delete mode 160000 shared diff --git a/shared b/shared deleted file mode 160000 index 91990f8..0000000 --- a/shared +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 91990f8491802928a0dfa0f91b63f8894c4e893d From b8fef6fd9ca628e93e15625f15aa88c7206ab3ce Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 14:56:27 +0100 Subject: [PATCH 04/32] updated one import --- src/controllers/event.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index a452c34..670d0c4 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -2,7 +2,7 @@ import { Context, ObjectId, RouterContext, Status } from '../../deps.ts'; import { eventService } from '../services/event.service.ts'; import { generateEvents } from '../services/openai.service.ts'; -import { eventFilterSchema } from 'models/event.model.ts'; +import { eventFilterSchema } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; export const getAllEvents = async (ctx: Context) => { const params = ctx.request.url.searchParams; From db2bf03a5b082c0b14863a1431040ac490ed339d Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 14:58:13 +0100 Subject: [PATCH 05/32] changed a few more imports --- src/services/event.service.ts | 2 +- src/services/openai.service.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/event.service.ts b/src/services/event.service.ts index 67bfa7c..d33d630 100644 --- a/src/services/event.service.ts +++ b/src/services/event.service.ts @@ -13,7 +13,7 @@ import { eventsArraySchema, eventSchema, FullEvent, -} from 'models/event.model.ts'; +} from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; import { normaliseEvents } from '../utils/event.utils.ts'; const events = db.collection('events'); diff --git a/src/services/openai.service.ts b/src/services/openai.service.ts index 169df60..e99a114 100644 --- a/src/services/openai.service.ts +++ b/src/services/openai.service.ts @@ -4,7 +4,7 @@ import { CompleteEventType, EventMode, eventsArraySchema, -} from 'models/event.model.ts'; +} from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; import { OpenAI, zodTextFormat } from '../../deps.ts'; import 'https://deno.land/std@0.224.0/dotenv/load.ts'; From 75c187ef4bd86dad363ace643b1d14dd68e81ee9 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 15:52:54 +0100 Subject: [PATCH 06/32] changed url --- src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 9b802f0..c89dd85 100644 --- a/src/app.ts +++ b/src/app.ts @@ -7,7 +7,7 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); app.use( - oakCors({ origin: ['http://localhost:5173', 'http://127.0.0.1:5173'] }), + oakCors({ origin: ['https://the-locals.netlify.app/'] }), ); // Allow local frontend to bypass cors requirement app.use(logRequest); app.use(router.routes()); From f0cf123255e724d8d9dfa8e49dd5fe8f4584fd84 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 16:12:52 +0100 Subject: [PATCH 07/32] attempt to solve corse error --- src/app.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index c89dd85..af718e2 100644 --- a/src/app.ts +++ b/src/app.ts @@ -7,7 +7,10 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); app.use( - oakCors({ origin: ['https://the-locals.netlify.app/'] }), + oakCors({ origin: ['https://the-locals.netlify.app'], + credentials: true, + optionsSuccessStatus: 200, // For legacy browser support + }), ); // Allow local frontend to bypass cors requirement app.use(logRequest); app.use(router.routes()); From 76691eb4f42decd1d4435f5345659cd600df2d40 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Mon, 9 Jun 2025 21:17:21 +0100 Subject: [PATCH 08/32] trial deploy bug fix -> using a more stable version of bycrypt --- api-examples/signup.rest | 8 ++++---- deno.lock | 6 ++++++ deps.ts | 3 ++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/api-examples/signup.rest b/api-examples/signup.rest index aa53c87..c107b4b 100644 --- a/api-examples/signup.rest +++ b/api-examples/signup.rest @@ -1,8 +1,8 @@ -POST http://localhost:3000/auth/signup +POST https://the-locals.deno.dev/auth/signup Content-Type: application/json { - "email": "Dkjdhsbfjewrbk@gmail.com", - "password": "securePassword123", - "username": "Donald-kjhsdbvcck" + "email": "Dkjdhsbfjebk@gmail.com", + "password": "securePasswod123", + "username": "Donald-kjhsdbck" } diff --git a/deno.lock b/deno.lock index 6e1490a..73355fa 100644 --- a/deno.lock +++ b/deno.lock @@ -163,6 +163,12 @@ "https://deno.land/std@0.224.0/dotenv/mod.ts": "0180eaeedaaf88647318811cdaa418cc64dc51fb08354f91f5f480d0a1309f7d", "https://deno.land/std@0.224.0/dotenv/parse.ts": "09977ff88dfd1f24f9973a338f0f91bbdb9307eb5ff6085446e7c423e4c7ba0c", "https://deno.land/std@0.224.0/dotenv/stringify.ts": "275da322c409170160440836342eaa7cf012a1d11a7e700d8ca4e7f2f8aa4615", + "https://deno.land/std@0.61.0/encoding/utf8.ts": "8654fa820aa69a37ec5eb11908e20b39d056c9bf1c23ab294303ff467f3d50a1", + "https://deno.land/x/bcrypt@v0.2.4/deps.ts": "dc2253e8aed3c5670f096fe9515913f644b650bae7212d8f6af5c14b88350461", + "https://deno.land/x/bcrypt@v0.2.4/mod.ts": "8eaac7e28fd305228e5994de60032b743282bfeadd5060c1759288d27f32d28e", + "https://deno.land/x/bcrypt@v0.2.4/src/bcrypt/base64.ts": "b8266450a4f1eb6960f60f2f7986afc4dde6b45bd2d7ee7ba10789e67e17b9f7", + "https://deno.land/x/bcrypt@v0.2.4/src/bcrypt/bcrypt.ts": "7845b01323458b530dcf6e9ab46e513c507b6ff1670457afaa0b3465721b56b4", + "https://deno.land/x/bcrypt@v0.2.4/src/main.ts": "4ac3ccc2247ce729f6c7d57654909949b62aafdabd996483c97f34aa1afac82a", "https://deno.land/x/bcrypt@v0.4.1/mod.ts": "ff09bdae282583cf5f7d87efe37ddcecef7f14f6d12e8b8066a3058db8c6c2f7", "https://deno.land/x/bcrypt@v0.4.1/src/bcrypt/base64.ts": "b8266450a4f1eb6960f60f2f7986afc4dde6b45bd2d7ee7ba10789e67e17b9f7", "https://deno.land/x/bcrypt@v0.4.1/src/bcrypt/bcrypt.ts": "ec221648cc6453ea5e3803bc817c01157dada06aa6f7a0ba6b9f87aae32b21e2", diff --git a/deps.ts b/deps.ts index 5cd6ff6..081d780 100644 --- a/deps.ts +++ b/deps.ts @@ -29,4 +29,5 @@ export type { Payload } from 'https://deno.land/x/djwt@v3.0.2/mod.ts'; export { Db, MongoClient, ObjectId } from 'npm:mongodb@6.1.0'; export type { OptionalId } from 'npm:mongodb@6.1.0'; -export { compare, hash } from 'https://deno.land/x/bcrypt@v0.4.1/mod.ts'; +//more stable version of bycrypt +export { compare, hash } from 'https://deno.land/x/bcrypt@v0.2.4/mod.ts'; From dd2dfb14b90948bf3d05a7acc2a29ed913314512 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 10:33:00 +0100 Subject: [PATCH 09/32] changed hash to hashSync --- api-examples/signup.rest | 6 ++-- deps.ts | 2 +- replace-imports.ts | 36 ------------------- src/controllers/auth.controller.ts | 5 +++ src/services/auth.service.ts | 56 +++++++++++++++++++----------- 5 files changed, 44 insertions(+), 61 deletions(-) delete mode 100644 replace-imports.ts diff --git a/api-examples/signup.rest b/api-examples/signup.rest index c107b4b..2a318c4 100644 --- a/api-examples/signup.rest +++ b/api-examples/signup.rest @@ -2,7 +2,7 @@ POST https://the-locals.deno.dev/auth/signup Content-Type: application/json { - "email": "Dkjdhsbfjebk@gmail.com", - "password": "securePasswod123", - "username": "Donald-kjhsdbck" + "email": "Dkjdhsbfje@gmail.com", + "password": "securePasswod1", + "username": "Donald-kjhsdb" } diff --git a/deps.ts b/deps.ts index 081d780..5619b42 100644 --- a/deps.ts +++ b/deps.ts @@ -30,4 +30,4 @@ export { Db, MongoClient, ObjectId } from 'npm:mongodb@6.1.0'; export type { OptionalId } from 'npm:mongodb@6.1.0'; //more stable version of bycrypt -export { compare, hash } from 'https://deno.land/x/bcrypt@v0.2.4/mod.ts'; +export { compare, hashSync } from 'https://deno.land/x/bcrypt@v0.2.4/mod.ts'; diff --git a/replace-imports.ts b/replace-imports.ts deleted file mode 100644 index 6fcea25..0000000 --- a/replace-imports.ts +++ /dev/null @@ -1,36 +0,0 @@ -// replace-imports.ts -const filesToUpdate = [ - "src/controllers/auth.controller.ts", - "src/controllers/user.controller.ts", - "src/services/auth.service.ts", - "src/services/user.service.ts", - "src/utils/event.utils.ts", - "testing/dummyData/event.samples.ts", - "testing/dummyData/realData.samples.ts", - "testing/testScripts/event.utils.test.ts", -]; - -const remoteBaseURL = "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/"; - -for (const filePath of filesToUpdate) { - try { - let content = await Deno.readTextFile(filePath); - - // Regex to find imports from 'models/...' (single or double quotes) - const importRegex = /from\s+['"]models\/([^'"]+)['"]/g; - - // Replace all matching imports - const newContent = content.replace(importRegex, (_, modulePath) => { - return `from "${remoteBaseURL}${modulePath}"`; - }); - - if (content !== newContent) { - await Deno.writeTextFile(filePath, newContent); - console.log(`Updated imports in ${filePath}`); - } else { - console.log(`No imports to update in ${filePath}`); - } - } catch (error) { - console.error(`Failed to process ${filePath}:`, error.message); - } -} diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index 257fa43..dab8580 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -19,9 +19,13 @@ export const getCurrentUser = async (ctx: Context) => { export const signUpUser = async (ctx: RouterContext<'/signup'>) => { const body = await ctx.request.body.json(); + console.log('Request body:', body); + const userInput = UserSignUpSchema.safeParse(body); + console.log('Validtion result:', userInput.success) if (!userInput.success) { + console.log('Validation Errors:', userInput.error) ctx.response.status = Status.BadRequest; ctx.response.body = { errors: userInput.error.flatten() }; return; @@ -33,6 +37,7 @@ export const signUpUser = async (ctx: RouterContext<'/signup'>) => { } catch (error) { ctx.response.status = Status.InternalServerError; if (error instanceof Error) { + console.log('Sign up user error:', error); ctx.response.body = { error: error.message }; } else { ctx.response.body = { error: 'Unkown error creating user' }; diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index 6d602c0..8e8cebe 100644 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -6,35 +6,49 @@ import { UserLogInInput, UserSignUpInput, } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; -import { compare, hash } from '../../deps.ts'; +import { compare, hashSync } from '../../deps.ts'; import { generateToken } from '../utils/token.utils.ts'; import type { OptionalId } from '../../deps.ts'; const users = db.collection>('users'); const createUser = async (userInput: UserSignUpInput) => { - const existingUser = await users.findOne({ - $or: [{ email: userInput.email }, { username: userInput.username }], - }); - - if (existingUser) { - if (existingUser.email === userInput.email) { - throw new Error('User with this email already exists'); - } - if (existingUser.username === userInput.username) { - throw new Error('This username is already in use'); +console.log("Create user called"); + try { + console.log("Checking for existing user...") + const existingUser = await users.findOne({ + $or: [{ email: userInput.email }, { username: userInput.username }], + }); + + if (existingUser) { + if (existingUser.email === userInput.email) { + throw new Error('User with this email already exists'); + } + if (existingUser.username === userInput.username) { + throw new Error('This username is already in use'); + } } + + console.log("hashing password...") + const passwordHash = hashSync(userInput.password); + // const passwordHash = compareSync(userInput.password, hash); + console.log('Password hashed successfully') + const userToInsert: NewUser = { + ...userInput, + password: passwordHash, + saved_events: [], + role: 'user', + }; + console.log('User to insert:', { ...userToInsert, password: '[HIDDEN]' }); + + const result = await users.insertOne(userToInsert); + if (!result) throw new Error('Failed to insert user'); + return result; + + } catch (error) { + console.error("Error in create user:", error); + throw error; } - const passwordHash = await hash(userInput.password); - const userToInsert: NewUser = { - ...userInput, - password: passwordHash, - saved_events: [], - role: 'user', - }; - const result = await users.insertOne(userToInsert); - if (!result) throw new Error('Failed to insert user'); - return result; }; const logInUser = async (userInput: UserLogInInput) => { From a6e6020d1881348e8d9071655e5015f2d7777454 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 10:33:58 +0100 Subject: [PATCH 10/32] Changed an uncaught hash --- src/services/user.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 656ce9f..6f1af40 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -6,7 +6,7 @@ import 'https://deno.land/std@0.224.0/dotenv/load.ts'; import { db } from '../database/connect.ts'; import { UserInDB } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; -import { hash, OptionalId } from '../../deps.ts'; +import { hashSync, OptionalId } from '../../deps.ts'; import { NewUser } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; const users = db.collection>('users'); @@ -23,7 +23,7 @@ export const userService = { }; const _createAdmin = async () => { - const passwordHash = await hash('supersecretadminpassword'); + const passwordHash = await hashSync('supersecretadminpassword'); const userToInsert: NewUser = { email: 'admin@example.com', username: 'admin', From ea2fefc1a36783a9f8a471517a8373959a770c10 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 10:57:02 +0100 Subject: [PATCH 11/32] added more explicit console logs --- deps.ts | 2 +- src/services/auth.service.ts | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/deps.ts b/deps.ts index 5619b42..9774498 100644 --- a/deps.ts +++ b/deps.ts @@ -30,4 +30,4 @@ export { Db, MongoClient, ObjectId } from 'npm:mongodb@6.1.0'; export type { OptionalId } from 'npm:mongodb@6.1.0'; //more stable version of bycrypt -export { compare, hashSync } from 'https://deno.land/x/bcrypt@v0.2.4/mod.ts'; +export { compareSync, hashSync } from 'https://deno.land/x/bcrypt@v0.2.4/mod.ts'; diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index 8e8cebe..3ea1734 100644 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -6,16 +6,16 @@ import { UserLogInInput, UserSignUpInput, } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; -import { compare, hashSync } from '../../deps.ts'; +import { compareSync, hashSync } from '../../deps.ts'; import { generateToken } from '../utils/token.utils.ts'; import type { OptionalId } from '../../deps.ts'; const users = db.collection>('users'); const createUser = async (userInput: UserSignUpInput) => { -console.log("Create user called"); +console.log("🍎Create user called"); try { - console.log("Checking for existing user...") + console.log("🍎Checking for existing user...") const existingUser = await users.findOne({ $or: [{ email: userInput.email }, { username: userInput.username }], }); @@ -29,19 +29,20 @@ console.log("Create user called"); } } - console.log("hashing password...") + console.log("🍎hashing password...") const passwordHash = hashSync(userInput.password); // const passwordHash = compareSync(userInput.password, hash); - console.log('Password hashed successfully') + console.log('🍎Password hashed successfully') const userToInsert: NewUser = { ...userInput, password: passwordHash, saved_events: [], role: 'user', }; - console.log('User to insert:', { ...userToInsert, password: '[HIDDEN]' }); + console.log('🍎User to insert:', { ...userToInsert, password: '[HIDDEN]' }); const result = await users.insertOne(userToInsert); + console.log('🍎User inserted into DB') if (!result) throw new Error('Failed to insert user'); return result; @@ -52,15 +53,20 @@ console.log("Create user called"); }; const logInUser = async (userInput: UserLogInInput) => { + console.log("🍏 Login user called") + console.log("🍏 Finding user") const exists = await users.findOne({ username: userInput.username }); + const validPassword = exists === null ? false - : await compare(userInput.password, exists.password); + : compareSync(userInput.password, exists.password); if (!(exists && validPassword)) { throw new Error('Invalid username or password'); } + console.log("🍏 User found") const safeUser = toSafeUser(exists); const token = await generateToken(safeUser); + console.log("🍏 Returning user token") return token; }; From 163ced89300131f6e97ca9e4d9ac68ca32485723 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 11:21:38 +0100 Subject: [PATCH 12/32] added cron --- .github/workflows/daily-job.yml | 4 ++++ src/app.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.github/workflows/daily-job.yml b/.github/workflows/daily-job.yml index cc28af6..ecf2a9d 100644 --- a/.github/workflows/daily-job.yml +++ b/.github/workflows/daily-job.yml @@ -11,3 +11,7 @@ jobs: steps: - name: Trigger daily task run: 'curl -H "X-Daily-Token: ${{ secrets.DAILY_JOB_TOKEN }}" https://your-deploy-url.deno.dev/' + + Deno.cron("sample cron", "*/10 * * * *", () => { + console.log("cron job executed every 10 minutes"); +}); \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index af718e2..458e51e 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,6 +6,10 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); +Deno.cron("sample cron", "*/10 * * * *", () => { + console.log("cron job executed every 10 minutes"); +}); + app.use( oakCors({ origin: ['https://the-locals.netlify.app'], credentials: true, From f0da16cd8707ebf10137065345f15466140ed112 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 11:30:46 +0100 Subject: [PATCH 13/32] changed cron timimgs for testing --- .github/workflows/daily-job.yml | 4 +--- src/app.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/daily-job.yml b/.github/workflows/daily-job.yml index ecf2a9d..2424af8 100644 --- a/.github/workflows/daily-job.yml +++ b/.github/workflows/daily-job.yml @@ -12,6 +12,4 @@ jobs: - name: Trigger daily task run: 'curl -H "X-Daily-Token: ${{ secrets.DAILY_JOB_TOKEN }}" https://your-deploy-url.deno.dev/' - Deno.cron("sample cron", "*/10 * * * *", () => { - console.log("cron job executed every 10 minutes"); -}); \ No newline at end of file + \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index 458e51e..3dab0a3 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,7 +6,7 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); -Deno.cron("sample cron", "*/10 * * * *", () => { +Deno.cron("sample cron", "*/3 * * * *", () => { console.log("cron job executed every 10 minutes"); }); From 1bd496cb0021a81ce3afbb03063872b9b9f08514 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 15:41:01 +0100 Subject: [PATCH 14/32] updated cron to update at midnight --- src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 3dab0a3..129363f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,7 +6,7 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); -Deno.cron("sample cron", "*/3 * * * *", () => { +Deno.cron("sample cron", "0 0 * * *", () => { console.log("cron job executed every 10 minutes"); }); From 4e5b1731a6c8748a512079cb5e358d368ca1e78d Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 15:46:35 +0100 Subject: [PATCH 15/32] added dev url to backend --- src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 129363f..168f1ff 100644 --- a/src/app.ts +++ b/src/app.ts @@ -11,7 +11,7 @@ Deno.cron("sample cron", "0 0 * * *", () => { }); app.use( - oakCors({ origin: ['https://the-locals.netlify.app'], + oakCors({ origin: ['https://the-locals.netlify.app', 'http://localhost:5173/login'], credentials: true, optionsSuccessStatus: 200, // For legacy browser support }), From b99cf5b32e5699be7524b9e2a313622bf037abf6 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 15:49:26 +0100 Subject: [PATCH 16/32] fixing silly mistake --- src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 168f1ff..2e607d9 100644 --- a/src/app.ts +++ b/src/app.ts @@ -11,7 +11,7 @@ Deno.cron("sample cron", "0 0 * * *", () => { }); app.use( - oakCors({ origin: ['https://the-locals.netlify.app', 'http://localhost:5173/login'], + oakCors({ origin: ['https://the-locals.netlify.app', 'http://localhost:5173'], credentials: true, optionsSuccessStatus: 200, // For legacy browser support }), From 4665eaa847e4444340b17e5002efee93b14051da Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 20:57:23 +0100 Subject: [PATCH 17/32] trying out a new ai prompt --- src/services/openai.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/openai.service.ts b/src/services/openai.service.ts index e99a114..979787a 100644 --- a/src/services/openai.service.ts +++ b/src/services/openai.service.ts @@ -24,7 +24,7 @@ export const generateEvents = async ( const catString: string = category.join(' '); const userPrompt: string = - `List 5 events each for ${catString} near ${location}. Return only valid JSON in this format: + `Search for and list your top 75 interesting/fun/educational/charitable etc events within a 20km radius of ${location} (and don't be afraid to find the occasional obscure event!). Label each event as one of these categories to the best of your ability: ${catString}. Return only valid JSON in this format: { musicEvents: [ { From be6132b16ea28b2fa684afde51c6a2ba3bbb337a Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 21:01:57 +0100 Subject: [PATCH 18/32] changed cron job for production --- src/app.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 2e607d9..57a3bbc 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,7 +6,7 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); -Deno.cron("sample cron", "0 0 * * *", () => { +Deno.cron("sample cron", "*/10 * * * *", () => { console.log("cron job executed every 10 minutes"); }); @@ -21,3 +21,9 @@ app.use(router.routes()); app.use(router.allowedMethods()); export default app; + +//cron for every 10mins +// "*/10 * * * *" + +// cron for midnight +// "0 0 * * *" \ No newline at end of file From 351912cda09709e89c8943a4a64587f58b400cc7 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 21:19:24 +0100 Subject: [PATCH 19/32] cron targets cron route --- src/app.ts | 10 ---------- src/cron.ts | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 src/cron.ts diff --git a/src/app.ts b/src/app.ts index 57a3bbc..1d7c086 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,10 +6,6 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); -Deno.cron("sample cron", "*/10 * * * *", () => { - console.log("cron job executed every 10 minutes"); -}); - app.use( oakCors({ origin: ['https://the-locals.netlify.app', 'http://localhost:5173'], credentials: true, @@ -21,9 +17,3 @@ app.use(router.routes()); app.use(router.allowedMethods()); export default app; - -//cron for every 10mins -// "*/10 * * * *" - -// cron for midnight -// "0 0 * * *" \ No newline at end of file diff --git a/src/cron.ts b/src/cron.ts new file mode 100644 index 0000000..eb1047e --- /dev/null +++ b/src/cron.ts @@ -0,0 +1,24 @@ +Deno.cron("save events cron", "*/10 * * * *", async () => { + try { + const response = await fetch("https://the-locals.deno.dev/events/cron/save-events", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + }); + + if (response.ok) { + console.log("Events cron job executed successfully"); + } else { + console.error("Cron job failed with status:", response.status); + } + } catch (error) { + console.error("Cron job failed:", error); + } +}); + +//cron for every 10mins +// "*/10 * * * *" + +// cron for midnight +// "0 0 * * *" \ No newline at end of file From b84f7acb3d627a52a61b912522e628f47dad70b2 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 21:21:58 +0100 Subject: [PATCH 20/32] imported cron to app --- src/app.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app.ts b/src/app.ts index 1d7c086..e623f00 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,6 +1,7 @@ import 'https://deno.land/std@0.224.0/dotenv/load.ts'; import { Application, oakCors } from '../deps.ts'; import './database/connect.ts'; +import './cron.ts'; import router from './routes/index.ts'; import logRequest from './middleware/logRequest.ts'; From a863eaba888794e951b9facdfcd0c8c111897175 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 21:46:23 +0100 Subject: [PATCH 21/32] added console logs --- src/controllers/event.controller.ts | 2 +- src/cron.ts | 1 + src/services/openai.service.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index 670d0c4..68224f6 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -68,7 +68,7 @@ export const saveNewEvent = async (ctx: Context) => { }; export const saveEventsCronHandler = async (ctx: Context) => { - console.log('Server pinged'); + console.log('Called saveEventsCronHandler()'); const token = ctx.request.headers.get('X-Daily-Token'); // Change this to appropriate .env or github secret diff --git a/src/cron.ts b/src/cron.ts index eb1047e..5e389e8 100644 --- a/src/cron.ts +++ b/src/cron.ts @@ -1,4 +1,5 @@ Deno.cron("save events cron", "*/10 * * * *", async () => { + console.log("executing cron job...") try { const response = await fetch("https://the-locals.deno.dev/events/cron/save-events", { method: "POST", diff --git a/src/services/openai.service.ts b/src/services/openai.service.ts index 979787a..6e826fb 100644 --- a/src/services/openai.service.ts +++ b/src/services/openai.service.ts @@ -21,6 +21,7 @@ export const generateEvents = async ( category: EventMode[], location: string, ): Promise => { + console.log('Generating events') const catString: string = category.join(' '); const userPrompt: string = From dd924ddb776dc69f32f21a17c4f1daa104842f4d Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 21:55:35 +0100 Subject: [PATCH 22/32] added dailt token to cron job --- src/cron.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cron.ts b/src/cron.ts index 5e389e8..d79888a 100644 --- a/src/cron.ts +++ b/src/cron.ts @@ -5,6 +5,7 @@ Deno.cron("save events cron", "*/10 * * * *", async () => { method: "POST", headers: { "Content-Type": "application/json", + "X-Daily-Token": Deno.env.get('DAILY_JOB_TOKEN') || '', }, }); From faab68b97d45b0fc7f89943251cfee9dc72bcb58 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Wed, 11 Jun 2025 22:03:34 +0100 Subject: [PATCH 23/32] calling cron job internally --- src/controllers/event.controller.ts | 62 ++++++++++++++--------------- src/cron.ts | 25 +++++++----- src/routes/event.routes.ts | 4 +- 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index 68224f6..15bf3f9 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -1,7 +1,7 @@ // deno-lint-ignore-file require-await import { Context, ObjectId, RouterContext, Status } from '../../deps.ts'; import { eventService } from '../services/event.service.ts'; -import { generateEvents } from '../services/openai.service.ts'; +//import { generateEvents } from '../services/openai.service.ts'; import { eventFilterSchema } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; export const getAllEvents = async (ctx: Context) => { @@ -67,36 +67,36 @@ export const saveNewEvent = async (ctx: Context) => { } }; -export const saveEventsCronHandler = async (ctx: Context) => { - console.log('Called saveEventsCronHandler()'); - const token = ctx.request.headers.get('X-Daily-Token'); - - // Change this to appropriate .env or github secret - const expectedToken = Deno.env.get('DAILY_JOB_TOKEN'); - - if (token !== expectedToken) { - ctx.response.status = Status.Forbidden; - ctx.response.body = 'Forbidden'; - return; - } - - console.log('Daily task triggered'); - - const events = await generateEvents( - ['music', 'charity', 'sports', 'other'], - 'Finsbury Park', - ); - - if (events !== null) { - await eventService.saveEvents(events); - ctx.response.body = 'Events saved sucessfully'; - console.log('Events saved'); - } else { - ctx.response.status = Status.NoContent; - ctx.response.body = 'No events to save'; - console.log('There were no events to save'); - } -}; +// export const saveEventsCronHandler = async (ctx: Context) => { +// console.log('Called saveEventsCronHandler()'); +// const token = ctx.request.headers.get('X-Daily-Token'); + +// // Change this to appropriate .env or github secret +// const expectedToken = Deno.env.get('DAILY_JOB_TOKEN'); + +// if (token !== expectedToken) { +// ctx.response.status = Status.Forbidden; +// ctx.response.body = 'Forbidden'; +// return; +// } + +// console.log('Daily task triggered'); + +// const events = await generateEvents( +// ['music', 'charity', 'sports', 'other'], +// 'Finsbury Park', +// ); + +// if (events !== null) { +// await eventService.saveEvents(events); +// ctx.response.body = 'Events saved sucessfully'; +// console.log('Events saved'); +// } else { +// ctx.response.status = Status.NoContent; +// ctx.response.body = 'No events to save'; +// console.log('There were no events to save'); +// } +// }; export const updateEvent = async (ctx: Context) => { // TODO: Update event in DB diff --git a/src/cron.ts b/src/cron.ts index d79888a..1ddb731 100644 --- a/src/cron.ts +++ b/src/cron.ts @@ -1,18 +1,21 @@ +import { eventService } from './services/event.service.ts'; +import { generateEvents } from './services/openai.service.ts'; + Deno.cron("save events cron", "*/10 * * * *", async () => { - console.log("executing cron job...") + console.log("executing cron job...") try { - const response = await fetch("https://the-locals.deno.dev/events/cron/save-events", { - method: "POST", - headers: { - "Content-Type": "application/json", - "X-Daily-Token": Deno.env.get('DAILY_JOB_TOKEN') || '', - }, - }); + console.log('Daily task triggered'); - if (response.ok) { - console.log("Events cron job executed successfully"); + const events = await generateEvents( + ['music', 'charity', 'sports', 'other'], + 'Finsbury Park', + ); + + if (events !== null) { + await eventService.saveEvents(events); + console.log('Events saved successfully'); } else { - console.error("Cron job failed with status:", response.status); + console.log('There were no events to save'); } } catch (error) { console.error("Cron job failed:", error); diff --git a/src/routes/event.routes.ts b/src/routes/event.routes.ts index eddfb69..c57c2da 100644 --- a/src/routes/event.routes.ts +++ b/src/routes/event.routes.ts @@ -2,7 +2,7 @@ import { Router } from '../../deps.ts'; import { getAllEvents, getEventById, - saveEventsCronHandler, + //saveEventsCronHandler, saveNewEvent, } from '../controllers/event.controller.ts'; @@ -14,7 +14,7 @@ const router = new Router(); router.get('/', getAllEvents); router.get('/:id', getEventById); router.post('/save-event', saveNewEvent); -router.post('/cron/save-events', saveEventsCronHandler); +//router.post('/cron/save-events', saveEventsCronHandler); // router.post("/") // router.put("/:id", updateEvent) // router.delete("/:id", deleteEvent) From 34c43408711224972b270e3a41429647e6a9f5f3 Mon Sep 17 00:00:00 2001 From: David Ogden Date: Thu, 12 Jun 2025 15:30:19 +0100 Subject: [PATCH 24/32] feat: :sparkles: Set up back end routes for user Events GetAllEvents now gets user events by mode as well and returns an pbject of all events and the object Ids of the saved user events. Those id's are then checked on the front end against the rest of the events. The handle user events handles the toggling of the save button. --- shared | 2 +- src/controllers/event.controller.ts | 43 +++++++++++++++++++++++------ src/controllers/user.controller.ts | 34 +++++++++++++++++++++-- src/routes/user.routes.ts | 18 ++++-------- src/services/user.service.ts | 40 +++++++++++++++++++++++---- 5 files changed, 107 insertions(+), 30 deletions(-) diff --git a/shared b/shared index bddcaa7..e33f2b8 160000 --- a/shared +++ b/shared @@ -1 +1 @@ -Subproject commit bddcaa7804d4987f6cb84dc19d07359c1c16a8c7 +Subproject commit e33f2b8fb41afa8dbeab22570c0039cb53c1af45 diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index faebce5..a2c6d96 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -2,26 +2,37 @@ import { Context, ObjectId, RouterContext, Status } from '../../deps.ts'; import { eventService } from '../services/event.service.ts'; import { generateEvents } from '../services/openai.service.ts'; import { eventFilterSchema, FullEvent } from 'models/event.model.ts'; +import { verifyToken } from '../utils/token.utils.ts'; +import { Payload } from '../../deps.ts'; +import { userService } from '../services/user.service.ts'; export const getAllEvents = async (ctx: Context) => { - const params = ctx.request.url.searchParams; + const auth = ctx.request.headers.get('Authorization'); + const token = auth && auth.split(' ')[1]; + + let userId: string | null = null; + if (token) { + try { + const user: Payload = await verifyToken(token); + userId = user._id as string; + } catch (error) { + + console.warn('Invalid token in /events/with-saved: ' + error); + } + } + const params = ctx.request.url.searchParams; const rawModes = params.getAll('mode'); - const normalizedModes = rawModes .flatMap((param) => param.split(',')) .map((mode) => mode.trim().toLowerCase()) - .filter(Boolean); // removes empty strings + .filter(Boolean); const parseResult = eventFilterSchema.safeParse({ mode: normalizedModes.length > 0 ? normalizedModes : undefined, }); - let allEvents; - if (parseResult.success) { - console.log(parseResult.data); - allEvents = await eventService.getAllEvents(parseResult.data); - } else { + if (!parseResult.success) { ctx.response.status = Status.BadRequest; ctx.response.body = { error: 'Invalid query parameters', @@ -30,7 +41,21 @@ export const getAllEvents = async (ctx: Context) => { return; } - ctx.response.body = allEvents; + try { + const [allEvents, savedEvents] = await Promise.all([ + eventService.getAllEvents(parseResult.data), + userId ? userService.getUserEvents(userId) : Promise.resolve([]), + ]); + + ctx.response.body = { + events: allEvents, + savedEventIds: savedEvents.map(x => x._id), + }; + } catch (err) { + console.error("Error fetching combined event data:", err); + ctx.response.status = Status.InternalServerError; + ctx.response.body = { error: "Internal server error" }; + } }; export const getEventById = async (ctx: RouterContext<'/:id'>) => { diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index d6f52cd..902c382 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -1,8 +1,10 @@ // deno-lint-ignore-file require-await -import { Context, RouterContext } from '../../deps.ts'; +import { Context, Payload, RouterContext } from '../../deps.ts'; import { userService } from '../services/user.service.ts'; import { Status } from '../../deps.ts'; import { toSafeUser } from 'models/user.model.ts'; +import { verifyToken } from '../utils/token.utils.ts'; + export const getUserProfile = async (ctx: Context) => { // TODO: Get user data from ctx.state.user ctx.response.body = { message: 'Get user profile' }; @@ -17,7 +19,7 @@ export const deleteUserAccount = async (ctx: Context) => { // TODO: Call userService.deleteUser(ctx.state.user.id) ctx.response.body = { message: 'Delete user account' }; }; -export const getAllUsers = async (ctx: RouterContext<'/:role'>) => { +export const getAllUsers = async (ctx: RouterContext<'/getUsers:role'>) => { const role = ctx.params.role; if (role !== 'user' && role !== 'admin' && role !== 'all') { @@ -40,3 +42,31 @@ export const getAllUsers = async (ctx: RouterContext<'/:role'>) => { } } }; + +export const handleUserEvents = async (ctx: Context) => { + const auth = ctx.request.headers.get('Authorization'); + const token = auth && auth.split(' ')[1]; + +if (!token) { + return ctx.response.status = Status.Unauthorized; + +} + + try { + const user: Payload = await verifyToken(token); + + if (!user || !user._id) { + ctx.response.status = Status.Unauthorized; + ctx.response.body = { message: 'Unauthorized: Invalid token' }; + return; + } + const body = await ctx.request.body.json(); + const { eventId, active } = body; + const userId = user._id as string; + + await userService.handleUserEvents(eventId, userId, active); + return ctx.response.body = "User event handled" + } catch (error) { + console.error('Issue saving user events: ' + error) + } +} diff --git a/src/routes/user.routes.ts b/src/routes/user.routes.ts index 36ff637..8356787 100644 --- a/src/routes/user.routes.ts +++ b/src/routes/user.routes.ts @@ -1,19 +1,11 @@ import { Router } from '../../deps.ts'; import protectAdmin from '../middleware/requireAdmin.ts'; import ProtectRoute from '../middleware/protectRoute.ts'; -import { getAllUsers } from '../controllers/user.controller.ts'; -const router = new Router(); +import { getAllUsers, handleUserEvents } from '../controllers/user.controller.ts'; -// Routes under /users -// Temporary stub for testing -router.get('/', (ctx) => { - ctx.response.body = 'User route root'; -}); -router.get('/:role', ProtectRoute, protectAdmin, getAllUsers); -// -> to controllers -// router.get("/me", getUserProfile) -// router.put("/me", updateUserProfile) -// router.delete("/me", deleteUserAccount) +const router = new Router(); -export default router; +router.get('/getUsers:role', ProtectRoute, protectAdmin, getAllUsers); +router.post('/saveUserEvents', ProtectRoute, handleUserEvents); +export default router; \ No newline at end of file diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 502575d..7170d97 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -6,10 +6,12 @@ import 'https://deno.land/std@0.224.0/dotenv/load.ts'; import { db } from '../database/connect.ts'; import { UserInDB } from 'models/user.model.ts'; -import { hash, OptionalId } from '../../deps.ts'; +import { hash, ObjectId, OptionalId } from '../../deps.ts'; import { NewUser } from 'models/user.model.ts'; +import { FullEvent } from '../../shared/src/models/event.model.ts'; const users = db.collection>('users'); +const events = db.collection('events') const getAllUsers = async ( role: 'user' | 'admin' | 'all', @@ -18,10 +20,6 @@ const getAllUsers = async ( return await users.find(query).toArray(); }; -export const userService = { - getAllUsers, -}; - const _createAdmin = async () => { const passwordHash = await hash('supersecretadminpassword'); const userToInsert: NewUser = { @@ -37,3 +35,35 @@ const _createAdmin = async () => { console.log('Admin created:', result); }; + +const handleUserEvents = async (eventId: string, userId: string, saving: boolean) => { + console.log(saving) + if (saving === true) { + await users.updateOne( + { _id: new ObjectId(userId) }, + { $addToSet : { saved_events: new ObjectId(eventId) } } + ) + } else { + await users.updateOne( + { _id: new ObjectId(userId) }, + { $pull: { saved_events: new ObjectId(eventId) } } + ) + } +} + +const getUserEvents = async (userId: string) => { + const user = await users.findOne({_id: new ObjectId(userId) }); + const savedEvents = user?.saved_events ?? []; + const eventsList = await events.find({ _id: { $in: savedEvents } }).toArray(); + return eventsList; +} + +export const userService = { + getAllUsers, + handleUserEvents, + getUserEvents +}; +/* +User clicks heart. Event target id? This is passed to backend via post request. Route grabs this. Calls this function via the +user controller. Save the id which should reference +*/ \ No newline at end of file From 28b2db73894e40429bb179d86901044517b5fcfe Mon Sep 17 00:00:00 2001 From: David Ogden Date: Thu, 12 Jun 2025 15:37:06 +0100 Subject: [PATCH 25/32] style: :art: Ran lint, check and fmt. --- src/controllers/event.controller.ts | 9 ++++---- src/controllers/user.controller.ts | 13 +++++------ src/routes/user.routes.ts | 8 ++++--- src/services/user.service.ts | 36 ++++++++++++++++------------- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index a2c6d96..ec7d15e 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -7,7 +7,7 @@ import { Payload } from '../../deps.ts'; import { userService } from '../services/user.service.ts'; export const getAllEvents = async (ctx: Context) => { - const auth = ctx.request.headers.get('Authorization'); + const auth = ctx.request.headers.get('Authorization'); const token = auth && auth.split(' ')[1]; let userId: string | null = null; @@ -16,7 +16,6 @@ export const getAllEvents = async (ctx: Context) => { const user: Payload = await verifyToken(token); userId = user._id as string; } catch (error) { - console.warn('Invalid token in /events/with-saved: ' + error); } } @@ -49,12 +48,12 @@ export const getAllEvents = async (ctx: Context) => { ctx.response.body = { events: allEvents, - savedEventIds: savedEvents.map(x => x._id), + savedEventIds: savedEvents.map((x) => x._id), }; } catch (err) { - console.error("Error fetching combined event data:", err); + console.error('Error fetching combined event data:', err); ctx.response.status = Status.InternalServerError; - ctx.response.body = { error: "Internal server error" }; + ctx.response.body = { error: 'Internal server error' }; } }; diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index 902c382..f92752f 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -47,10 +47,9 @@ export const handleUserEvents = async (ctx: Context) => { const auth = ctx.request.headers.get('Authorization'); const token = auth && auth.split(' ')[1]; -if (!token) { - return ctx.response.status = Status.Unauthorized; - -} + if (!token) { + return ctx.response.status = Status.Unauthorized; + } try { const user: Payload = await verifyToken(token); @@ -65,8 +64,8 @@ if (!token) { const userId = user._id as string; await userService.handleUserEvents(eventId, userId, active); - return ctx.response.body = "User event handled" + return ctx.response.body = 'User event handled'; } catch (error) { - console.error('Issue saving user events: ' + error) + console.error('Issue saving user events: ' + error); } -} +}; diff --git a/src/routes/user.routes.ts b/src/routes/user.routes.ts index 8356787..fabb53b 100644 --- a/src/routes/user.routes.ts +++ b/src/routes/user.routes.ts @@ -1,11 +1,13 @@ import { Router } from '../../deps.ts'; import protectAdmin from '../middleware/requireAdmin.ts'; import ProtectRoute from '../middleware/protectRoute.ts'; -import { getAllUsers, handleUserEvents } from '../controllers/user.controller.ts'; - +import { + getAllUsers, + handleUserEvents, +} from '../controllers/user.controller.ts'; const router = new Router(); router.get('/getUsers:role', ProtectRoute, protectAdmin, getAllUsers); router.post('/saveUserEvents', ProtectRoute, handleUserEvents); -export default router; \ No newline at end of file +export default router; diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 7170d97..e3cc139 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -11,7 +11,7 @@ import { NewUser } from 'models/user.model.ts'; import { FullEvent } from '../../shared/src/models/event.model.ts'; const users = db.collection>('users'); -const events = db.collection('events') +const events = db.collection('events'); const getAllUsers = async ( role: 'user' | 'admin' | 'all', @@ -36,34 +36,38 @@ const _createAdmin = async () => { console.log('Admin created:', result); }; -const handleUserEvents = async (eventId: string, userId: string, saving: boolean) => { - console.log(saving) +const handleUserEvents = async ( + eventId: string, + userId: string, + saving: boolean, +) => { + console.log(saving); if (saving === true) { - await users.updateOne( - { _id: new ObjectId(userId) }, - { $addToSet : { saved_events: new ObjectId(eventId) } } - ) + await users.updateOne( + { _id: new ObjectId(userId) }, + { $addToSet: { saved_events: new ObjectId(eventId) } }, + ); } else { await users.updateOne( { _id: new ObjectId(userId) }, - { $pull: { saved_events: new ObjectId(eventId) } } - ) + { $pull: { saved_events: new ObjectId(eventId) } }, + ); } -} +}; const getUserEvents = async (userId: string) => { - const user = await users.findOne({_id: new ObjectId(userId) }); + const user = await users.findOne({ _id: new ObjectId(userId) }); const savedEvents = user?.saved_events ?? []; const eventsList = await events.find({ _id: { $in: savedEvents } }).toArray(); return eventsList; -} +}; export const userService = { getAllUsers, handleUserEvents, - getUserEvents + getUserEvents, }; /* -User clicks heart. Event target id? This is passed to backend via post request. Route grabs this. Calls this function via the -user controller. Save the id which should reference -*/ \ No newline at end of file +User clicks heart. Event target id? This is passed to backend via post request. Route grabs this. Calls this function via the +user controller. Save the id which should reference +*/ From 4f7b6b0d64815c66243b8ca3435f92bd107b778d Mon Sep 17 00:00:00 2001 From: David Ogden Date: Thu, 12 Jun 2025 17:14:49 +0100 Subject: [PATCH 26/32] Change to update event to make its fullevent a partial to match front end --- src/controllers/event.controller.ts | 4 ++-- src/services/event.service.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index ec7d15e..a4582a2 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -88,8 +88,8 @@ export const updateEventById = async (ctx: RouterContext<'/:id'>) => { } const id: string = ctx.params.id; - const event: FullEvent = await ctx.request.body.json(); - + const event: Partial = await ctx.request.body.json(); +console.log(event) if (!ObjectId.isValid(id)) { ctx.response.status = Status.BadRequest; ctx.response.body = `Invalid event id "${id}"`; diff --git a/src/services/event.service.ts b/src/services/event.service.ts index db9d2ff..f9621b2 100644 --- a/src/services/event.service.ts +++ b/src/services/event.service.ts @@ -32,7 +32,7 @@ const getEventById = async (id: string): Promise => { return await events.findOne({ _id: new ObjectId(id) }); }; -const updateEventById = async (id: string, event: FullEvent) => { +const updateEventById = async (id: string, event: Partial) => { return await events.updateOne({ _id: new ObjectId(id) }, { $set: event }); }; From 54bc436dba8c2d9b6a5c5b4fb92fdfa65f7b6d99 Mon Sep 17 00:00:00 2001 From: David Ogden Date: Thu, 12 Jun 2025 17:21:41 +0100 Subject: [PATCH 27/32] Ran check, fmt, lint --- src/controllers/event.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index a4582a2..c0ee9e8 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -89,7 +89,7 @@ export const updateEventById = async (ctx: RouterContext<'/:id'>) => { const id: string = ctx.params.id; const event: Partial = await ctx.request.body.json(); -console.log(event) + console.log(event); if (!ObjectId.isValid(id)) { ctx.response.status = Status.BadRequest; ctx.response.body = `Invalid event id "${id}"`; From 023241c2cb6732c0d6cede4c451e71465fd13d24 Mon Sep 17 00:00:00 2001 From: David Ogden Date: Thu, 12 Jun 2025 18:24:38 +0100 Subject: [PATCH 28/32] Change to console.log --- src/controllers/event.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index c0ee9e8..d3d1dd5 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -16,7 +16,7 @@ export const getAllEvents = async (ctx: Context) => { const user: Payload = await verifyToken(token); userId = user._id as string; } catch (error) { - console.warn('Invalid token in /events/with-saved: ' + error); + console.warn('Invalid token in /events: ' + error); } } From c6d741bd79e93584fbc8b911a734b4960e3c3961 Mon Sep 17 00:00:00 2001 From: David Ogden Date: Thu, 12 Jun 2025 18:28:45 +0100 Subject: [PATCH 29/32] Simplified handleUserEvents auth --- src/controllers/user.controller.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index f92752f..70d71cd 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -3,7 +3,6 @@ import { Context, Payload, RouterContext } from '../../deps.ts'; import { userService } from '../services/user.service.ts'; import { Status } from '../../deps.ts'; import { toSafeUser } from 'models/user.model.ts'; -import { verifyToken } from '../utils/token.utils.ts'; export const getUserProfile = async (ctx: Context) => { // TODO: Get user data from ctx.state.user @@ -44,15 +43,9 @@ export const getAllUsers = async (ctx: RouterContext<'/getUsers:role'>) => { }; export const handleUserEvents = async (ctx: Context) => { - const auth = ctx.request.headers.get('Authorization'); - const token = auth && auth.split(' ')[1]; - - if (!token) { - return ctx.response.status = Status.Unauthorized; - } try { - const user: Payload = await verifyToken(token); + const user: Payload = ctx.state.user if (!user || !user._id) { ctx.response.status = Status.Unauthorized; From bc48ef165e5cb47127fce57047f9d86cc4e4cb4f Mon Sep 17 00:00:00 2001 From: David Ogden Date: Thu, 12 Jun 2025 18:35:45 +0100 Subject: [PATCH 30/32] Ran deno fmt --- src/controllers/user.controller.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index 70d71cd..40053e8 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -43,9 +43,8 @@ export const getAllUsers = async (ctx: RouterContext<'/getUsers:role'>) => { }; export const handleUserEvents = async (ctx: Context) => { - try { - const user: Payload = ctx.state.user + const user: Payload = ctx.state.user; if (!user || !user._id) { ctx.response.status = Status.Unauthorized; From f965db2de1ffc0a3839a7f025fbe369b4232cef8 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Fri, 13 Jun 2025 21:03:22 +0100 Subject: [PATCH 31/32] set cron to midnight --- src/cron.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cron.ts b/src/cron.ts index 1ddb731..a29ba9b 100644 --- a/src/cron.ts +++ b/src/cron.ts @@ -1,7 +1,7 @@ import { eventService } from './services/event.service.ts'; import { generateEvents } from './services/openai.service.ts'; -Deno.cron("save events cron", "*/10 * * * *", async () => { +Deno.cron("save events cron", "0 0 * * *", async () => { console.log("executing cron job...") try { console.log('Daily task triggered'); From d7ee995879844f32069f623a4e5a40b5c9d40d83 Mon Sep 17 00:00:00 2001 From: Jaz-spec Date: Sat, 14 Jun 2025 12:50:32 +0100 Subject: [PATCH 32/32] linting --- .github/workflows/daily-job.yml | 2 -- deps.ts | 5 +++- src/app.ts | 5 ++-- src/controllers/auth.controller.ts | 9 ++++--- src/controllers/event.controller.ts | 21 ++++++++------- src/controllers/user.controller.ts | 2 +- src/cron.ts | 10 +++---- src/services/auth.service.ts | 35 ++++++++++++------------- src/services/openai.service.ts | 4 +-- src/services/user.service.ts | 6 ++--- src/utils/event.utils.ts | 6 ++++- testing/dummyData/event.samples.ts | 2 +- testing/dummyData/realData.samples.ts | 2 +- testing/testScripts/event.utils.test.ts | 5 +++- 14 files changed, 64 insertions(+), 50 deletions(-) diff --git a/.github/workflows/daily-job.yml b/.github/workflows/daily-job.yml index 2424af8..cc28af6 100644 --- a/.github/workflows/daily-job.yml +++ b/.github/workflows/daily-job.yml @@ -11,5 +11,3 @@ jobs: steps: - name: Trigger daily task run: 'curl -H "X-Daily-Token: ${{ secrets.DAILY_JOB_TOKEN }}" https://your-deploy-url.deno.dev/' - - \ No newline at end of file diff --git a/deps.ts b/deps.ts index 9774498..bfb4442 100644 --- a/deps.ts +++ b/deps.ts @@ -30,4 +30,7 @@ export { Db, MongoClient, ObjectId } from 'npm:mongodb@6.1.0'; export type { OptionalId } from 'npm:mongodb@6.1.0'; //more stable version of bycrypt -export { compareSync, hashSync } from 'https://deno.land/x/bcrypt@v0.2.4/mod.ts'; +export { + compareSync, + hashSync, +} from 'https://deno.land/x/bcrypt@v0.2.4/mod.ts'; diff --git a/src/app.ts b/src/app.ts index e623f00..6bf1d7c 100644 --- a/src/app.ts +++ b/src/app.ts @@ -8,10 +8,11 @@ import logRequest from './middleware/logRequest.ts'; const app = new Application(); app.use( - oakCors({ origin: ['https://the-locals.netlify.app', 'http://localhost:5173'], + oakCors({ + origin: ['https://the-locals.netlify.app', 'http://localhost:5173'], credentials: true, optionsSuccessStatus: 200, // For legacy browser support - }), + }), ); // Allow local frontend to bypass cors requirement app.use(logRequest); app.use(router.routes()); diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index dab8580..92ed325 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -1,6 +1,9 @@ // deno-lint-ignore-file require-await import { Context, RouterContext, Status } from '../../deps.ts'; -import { UserLogInSchema, UserSignUpSchema } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; +import { + UserLogInSchema, + UserSignUpSchema, +} from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts'; import { authService } from '../services/auth.service.ts'; export const getCurrentUser = async (ctx: Context) => { @@ -22,10 +25,10 @@ export const signUpUser = async (ctx: RouterContext<'/signup'>) => { console.log('Request body:', body); const userInput = UserSignUpSchema.safeParse(body); - console.log('Validtion result:', userInput.success) + console.log('Validtion result:', userInput.success); if (!userInput.success) { - console.log('Validation Errors:', userInput.error) + console.log('Validation Errors:', userInput.error); ctx.response.status = Status.BadRequest; ctx.response.body = { errors: userInput.error.flatten() }; return; diff --git a/src/controllers/event.controller.ts b/src/controllers/event.controller.ts index ebab894..f4c799d 100644 --- a/src/controllers/event.controller.ts +++ b/src/controllers/event.controller.ts @@ -1,7 +1,10 @@ import { Context, ObjectId, RouterContext, Status } from '../../deps.ts'; import { eventService } from '../services/event.service.ts'; //import { generateEvents } from '../services/openai.service.ts'; -import { eventFilterSchema, FullEvent } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; +import { + eventFilterSchema, + FullEvent, +} from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; import { verifyToken } from '../utils/token.utils.ts'; import { Payload } from '../../deps.ts'; import { userService } from '../services/user.service.ts'; @@ -184,12 +187,12 @@ export const saveNewEvent = async (ctx: Context) => { // } // }; -export const updateEvent = async (ctx: Context) => { - // TODO: Update event in DB - ctx.response.body = { message: `Update event of params.id` }; -}; +// export const updateEvent = async (ctx: Context) => { +// // TODO: Update event in DB +// ctx.response.body = { message: `Update event of params.id` }; +// }; -export const deleteEvent = async (ctx: Context) => { - // TODO: Delete event from DB - ctx.response.body = { message: `Delete event params.id` }; -}; +// export const deleteEvent = async (ctx: Context) => { +// // TODO: Delete event from DB +// ctx.response.body = { message: `Delete event params.id` }; +// }; diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index c47c80f..242874d 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -2,7 +2,7 @@ import { Context, Payload, RouterContext } from '../../deps.ts'; import { userService } from '../services/user.service.ts'; import { Status } from '../../deps.ts'; -import { toSafeUser } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; +import { toSafeUser } from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts'; export const getUserProfile = async (ctx: Context) => { // TODO: Get user data from ctx.state.user ctx.response.body = { message: 'Get user profile' }; diff --git a/src/cron.ts b/src/cron.ts index a29ba9b..82e875e 100644 --- a/src/cron.ts +++ b/src/cron.ts @@ -1,11 +1,11 @@ import { eventService } from './services/event.service.ts'; import { generateEvents } from './services/openai.service.ts'; -Deno.cron("save events cron", "0 0 * * *", async () => { - console.log("executing cron job...") +Deno.cron('save events cron', '0 0 * * *', async () => { + console.log('executing cron job...'); try { console.log('Daily task triggered'); - + const events = await generateEvents( ['music', 'charity', 'sports', 'other'], 'Finsbury Park', @@ -18,7 +18,7 @@ Deno.cron("save events cron", "0 0 * * *", async () => { console.log('There were no events to save'); } } catch (error) { - console.error("Cron job failed:", error); + console.error('Cron job failed:', error); } }); @@ -26,4 +26,4 @@ Deno.cron("save events cron", "0 0 * * *", async () => { // "*/10 * * * *" // cron for midnight -// "0 0 * * *" \ No newline at end of file +// "0 0 * * *" diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index 3ea1734..3b505dc 100644 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -5,7 +5,7 @@ import { UserInDB, UserLogInInput, UserSignUpInput, -} from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; +} from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts'; import { compareSync, hashSync } from '../../deps.ts'; import { generateToken } from '../utils/token.utils.ts'; import type { OptionalId } from '../../deps.ts'; @@ -13,13 +13,13 @@ import type { OptionalId } from '../../deps.ts'; const users = db.collection>('users'); const createUser = async (userInput: UserSignUpInput) => { -console.log("🍎Create user called"); - try { - console.log("🍎Checking for existing user...") - const existingUser = await users.findOne({ - $or: [{ email: userInput.email }, { username: userInput.username }], + console.log('🍎Create user called'); + try { + console.log('🍎Checking for existing user...'); + const existingUser = await users.findOne({ + $or: [{ email: userInput.email }, { username: userInput.username }], }); - + if (existingUser) { if (existingUser.email === userInput.email) { throw new Error('User with this email already exists'); @@ -28,11 +28,11 @@ console.log("🍎Create user called"); throw new Error('This username is already in use'); } } - - console.log("🍎hashing password...") + + console.log('🍎hashing password...'); const passwordHash = hashSync(userInput.password); // const passwordHash = compareSync(userInput.password, hash); - console.log('🍎Password hashed successfully') + console.log('🍎Password hashed successfully'); const userToInsert: NewUser = { ...userInput, password: passwordHash, @@ -40,21 +40,20 @@ console.log("🍎Create user called"); role: 'user', }; console.log('🍎User to insert:', { ...userToInsert, password: '[HIDDEN]' }); - + const result = await users.insertOne(userToInsert); - console.log('🍎User inserted into DB') + console.log('🍎User inserted into DB'); if (!result) throw new Error('Failed to insert user'); return result; - } catch (error) { - console.error("Error in create user:", error); + console.error('Error in create user:', error); throw error; } }; const logInUser = async (userInput: UserLogInInput) => { - console.log("🍏 Login user called") - console.log("🍏 Finding user") + console.log('🍏 Login user called'); + console.log('🍏 Finding user'); const exists = await users.findOne({ username: userInput.username }); const validPassword = exists === null @@ -63,10 +62,10 @@ const logInUser = async (userInput: UserLogInInput) => { if (!(exists && validPassword)) { throw new Error('Invalid username or password'); } - console.log("🍏 User found") + console.log('🍏 User found'); const safeUser = toSafeUser(exists); const token = await generateToken(safeUser); - console.log("🍏 Returning user token") + console.log('🍏 Returning user token'); return token; }; diff --git a/src/services/openai.service.ts b/src/services/openai.service.ts index 6e826fb..1372286 100644 --- a/src/services/openai.service.ts +++ b/src/services/openai.service.ts @@ -4,7 +4,7 @@ import { CompleteEventType, EventMode, eventsArraySchema, -} from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; +} from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; import { OpenAI, zodTextFormat } from '../../deps.ts'; import 'https://deno.land/std@0.224.0/dotenv/load.ts'; @@ -21,7 +21,7 @@ export const generateEvents = async ( category: EventMode[], location: string, ): Promise => { - console.log('Generating events') + console.log('Generating events'); const catString: string = category.join(' '); const userPrompt: string = diff --git a/src/services/user.service.ts b/src/services/user.service.ts index f8279eb..7dfdb93 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -5,10 +5,10 @@ import 'https://deno.land/std@0.224.0/dotenv/load.ts'; import { db } from '../database/connect.ts'; -import { UserInDB } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; +import { UserInDB } from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts'; import { hashSync, ObjectId, OptionalId } from '../../deps.ts'; -import { NewUser } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts"; -import { FullEvent } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts" +import { NewUser } from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/user.model.ts'; +import { FullEvent } from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; const users = db.collection>('users'); const events = db.collection('events'); diff --git a/src/utils/event.utils.ts b/src/utils/event.utils.ts index db81796..34ba3ac 100644 --- a/src/utils/event.utils.ts +++ b/src/utils/event.utils.ts @@ -1,4 +1,8 @@ -import { Event, FrequencyObject, FullEvent } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; +import { + Event, + FrequencyObject, + FullEvent, +} from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; // Initial cleaning of titles export const normalizeEventTitle = (event: Event): string => { diff --git a/testing/dummyData/event.samples.ts b/testing/dummyData/event.samples.ts index 5bce4ad..ef8dc9f 100644 --- a/testing/dummyData/event.samples.ts +++ b/testing/dummyData/event.samples.ts @@ -1,4 +1,4 @@ -import { Event } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; +import { Event } from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; // Test event examples export const testEvents: Event[] = [ diff --git a/testing/dummyData/realData.samples.ts b/testing/dummyData/realData.samples.ts index dc6d748..f4afb54 100644 --- a/testing/dummyData/realData.samples.ts +++ b/testing/dummyData/realData.samples.ts @@ -1,4 +1,4 @@ -import { Event } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; +import { Event } from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; export const realData: Array = [ { diff --git a/testing/testScripts/event.utils.test.ts b/testing/testScripts/event.utils.test.ts index 59e95f2..fa50db6 100644 --- a/testing/testScripts/event.utils.test.ts +++ b/testing/testScripts/event.utils.test.ts @@ -1,4 +1,7 @@ -import { FrequencyObject, FullEvent } from "https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts"; +import { + FrequencyObject, + FullEvent, +} from 'https://raw.githubusercontent.com/fac-31/Pro0428-LocalEventShared/main/src/models/event.model.ts'; import { realData } from '../dummyData/realData.samples.ts'; import { addNormalizedProperties,