From 99e26ab0b6e29d9fb4c6a0e14a14cd4eca6828ce Mon Sep 17 00:00:00 2001 From: Nguyen Huu Nguyen Y Date: Sat, 31 May 2025 17:31:15 +0700 Subject: [PATCH 01/24] feat: update next backend --- .stylelintrc.json | 13 +- app/@core/scss/base/skins/_bordered.scss | 4 +- app/app.vue | 9 +- app/plugins/notification.client.ts | 2 +- e2e/function/dashboard.test.ts | 9 - .../list-project-button-navigate.test.ts | 30 - e2e/function/list-project-search.test.ts | 59 -- .../shoud-display-the-list-project-page.png | Bin 146964 -> 0 bytes ...hould-display-the-account-setting-page.png | Bin 83952 -> 0 bytes .../should-display-the-billing-plan-page.png | Bin 75112 -> 0 bytes ...should-display-the-create-project-page.png | Bin 128968 -> 0 bytes .../should-display-the-dashboard.png | Bin 62984 -> 0 bytes ...splay-the-list-project-page-dark-theme.png | Bin 129403 -> 0 bytes .../should-display-the-pricing-page.png | Bin 84344 -> 0 bytes e2e/gui/create-project.test.ts | 64 -- e2e/gui/dashboard.test.ts | 17 - e2e/gui/list-project-dark-theme.test.ts | 27 - e2e/gui/list-project.test.ts | 40 -- e2e/gui/setting-account.test.ts | 81 --- e2e/gui/setting-billingplans.test.ts | 28 - e2e/gui/setting-pricing.test.ts | 34 -- e2e/setup/1.init.ts | 27 - e2e/setup/cookies.json | 14 - env.d.ts | 6 - nuxt.config.ts | 11 - package.json | 6 +- packages/config/eslint/index.mjs | 4 - pnpm-lock.yaml | 556 ++++++------------ puppeteer.config.mjs | 9 - server/api/auth/me.get.ts | 25 + server/api/{ => auth}/me.patch.ts | 5 +- server/api/auth/notification.patch.ts | 34 ++ server/api/auth/password.post.ts | 44 ++ server/api/devices/index.delete.ts | 18 + server/api/devices/index.post.ts | 26 + server/api/faq.get.ts | 10 - server/api/firebase.post.ts | 14 +- server/api/logto/webhook.post.ts | 277 +++++++++ server/api/notifications.ts | 256 ++++++++ .../[notificationUId]/index.delete.ts | 14 + .../[notificationUId]/read.patch.ts | 14 + .../[notificationUId]/unread.patch.ts | 14 + server/api/notifications/index.get.ts | 14 + server/api/notifications/read.patch.ts | 14 + server/api/notifications/unread.get.ts | 14 + server/api/notifications/unread.patch.ts | 14 + server/api/payments/payos/callback.get.ts | 79 --- server/api/payments/payos/cancel.get.ts | 66 --- server/api/payments/payos/checkout.post.ts | 6 +- server/api/payments/payos/query.post.ts | 28 - server/api/payments/payos/webhook.post.ts | 95 +-- .../{vnpay => sepay}/checkout.post.ts | 8 +- server/api/payments/sepay/status.get.ts | 40 ++ server/api/payments/sepay/webhook.post.ts | 114 ++++ .../[customerId]/subscriptions/index.post.ts | 2 + .../payments/stripe/customers/index.post.ts | 2 + server/api/payments/stripe/me.get.ts | 4 +- .../products/[productId]/prices/index.get.ts | 4 +- .../api/payments/stripe/products/index.get.ts | 2 +- server/api/payments/vnpay/IPN.get.ts | 72 --- server/api/payments/vnpay/callback.get.ts | 121 ---- server/api/payments/vnpay/query.post.ts | 41 -- server/api/products/credit-packages.get.ts | 16 + server/api/products/index.get.ts | 16 + server/api/ref/[referCode].get.ts | 19 + server/api/scopes.get.ts | 2 + .../users/[userId]/devices/index.delete.ts | 16 - .../api/users/[userId]/devices/index.get.ts | 16 - .../api/users/[userId]/devices/index.post.ts | 32 - .../notifications/[notificationUId].delete.ts | 19 - .../notifications/[notificationUId].patch.ts | 27 - .../users/[userId]/notifications/index.get.ts | 19 - .../notifications/mark-all-read.patch.ts | 16 - .../notifications/mark-all-unread.patch.ts | 16 - .../[userId]/notifications/unread.get.ts | 15 - .../shortcuts/[shortcutUId].delete.ts | 18 - .../[userId]/shortcuts/[shortcutUId].get.ts | 24 - .../[userId]/shortcuts/[shortcutUId].patch.ts | 23 - .../api/users/[userId]/shortcuts/count.get.ts | 22 - .../api/users/[userId]/shortcuts/index.get.ts | 19 - .../users/[userId]/shortcuts/index.post.ts | 22 - server/composables/useCredit.ts | 41 ++ server/composables/useCrud.ts | 164 ------ server/composables/useDeviceToken.ts | 42 ++ server/composables/useFaqCrud.ts | 31 - server/composables/useIdentity.ts | 79 +++ server/composables/useNotification.ts | 153 +++++ server/composables/useNotificationCrud.ts | 66 --- server/composables/usePayment.ts | 100 ++++ server/composables/useProduct.ts | 56 ++ server/composables/useReference.ts | 90 +++ server/composables/useShortcutCrud.ts | 61 -- server/composables/useUser.ts | 139 +++++ .../.gitkeep => composables/useUserDevice.ts} | 0 server/composables/useUserDeviceCrud.ts | 38 -- server/db/schemas/credit_histories.schema.ts | 16 +- server/db/schemas/credit_packages.schema.ts | 13 - server/db/schemas/devices.schema.ts | 18 + server/db/schemas/enum.schema.ts | 15 + server/db/schemas/identities.schema.ts | 21 + server/db/schemas/index.ts | 18 +- server/db/schemas/notifications.schema.ts | 21 + server/db/schemas/orders.schema.ts | 37 ++ .../payment_provider_transactions.schema.ts | 16 +- server/db/schemas/payments.schema.ts | 33 ++ server/db/schemas/products.schema.ts | 29 + server/db/schemas/reference_usages.schema.ts | 25 + server/db/schemas/references.schema.ts | 24 + .../db/schemas/sys_faq_categories.schema.ts | 15 - server/db/schemas/sys_faqs.schema.ts | 19 - server/db/schemas/sys_notifications.schema.ts | 11 - server/db/schemas/user_devices.schema.ts | 8 - server/db/schemas/user_orders.schema.ts | 17 - server/db/schemas/user_payments.schema.ts | 27 - server/db/schemas/user_shortcuts.schema.ts | 7 - server/db/schemas/users.schema.ts | 55 ++ server/db/seeds/all.seed.ts | 8 - server/db/seeds/index.seed.ts | 7 - server/db/seeds/index.ts | 10 + server/db/seeds/notifications.seed.ts | 12 + server/db/seeds/products.seed.ts | 126 ++++ server/plugins/logger.ts | 14 + server/plugins/mongo.ts | 15 + server/plugins/redis.ts | 19 +- server/tasks/.gitkeep | 0 server/tasks/db/backup.ts | 156 +++++ server/tasks/email/test.ts | 17 + server/types/logto.ts | 12 + server/types/models.ts | 95 +++ server/utils/array.ts | 1 - server/utils/auth/scope.ts | 5 +- server/utils/db.ts | 12 +- server/utils/error-message.ts | 16 - server/utils/error.ts | 26 +- server/utils/firebase.ts | 32 +- server/utils/index.ts | 8 +- server/utils/logger.ts | 291 +++++++++ server/utils/logto.ts | 27 +- server/utils/notification.ts | 25 +- server/utils/options.ts | 15 +- server/utils/payment/credit/index.ts | 37 ++ server/utils/payment/index.ts | 2 + server/utils/payment/vn/index.ts | 111 ++-- server/utils/payment/vn/payos.ts | 33 +- server/utils/payment/vn/sepay.ts | 29 + server/utils/payment/vn/vnpay.ts | 38 -- server/utils/storage.ts | 18 +- server/utils/stripe/customer.ts | 3 +- server/utils/stripe/index.ts | 9 - server/utils/uuid.ts | 6 + 150 files changed, 3278 insertions(+), 2360 deletions(-) delete mode 100644 e2e/function/dashboard.test.ts delete mode 100644 e2e/function/list-project-button-navigate.test.ts delete mode 100644 e2e/function/list-project-search.test.ts delete mode 100644 e2e/gui/__screenshots__/shoud-display-the-list-project-page.png delete mode 100644 e2e/gui/__screenshots__/should-display-the-account-setting-page.png delete mode 100644 e2e/gui/__screenshots__/should-display-the-billing-plan-page.png delete mode 100644 e2e/gui/__screenshots__/should-display-the-create-project-page.png delete mode 100644 e2e/gui/__screenshots__/should-display-the-dashboard.png delete mode 100644 e2e/gui/__screenshots__/should-display-the-list-project-page-dark-theme.png delete mode 100644 e2e/gui/__screenshots__/should-display-the-pricing-page.png delete mode 100644 e2e/gui/create-project.test.ts delete mode 100644 e2e/gui/dashboard.test.ts delete mode 100644 e2e/gui/list-project-dark-theme.test.ts delete mode 100644 e2e/gui/list-project.test.ts delete mode 100644 e2e/gui/setting-account.test.ts delete mode 100644 e2e/gui/setting-billingplans.test.ts delete mode 100644 e2e/gui/setting-pricing.test.ts delete mode 100644 e2e/setup/1.init.ts delete mode 100644 e2e/setup/cookies.json delete mode 100644 puppeteer.config.mjs create mode 100644 server/api/auth/me.get.ts rename server/api/{ => auth}/me.patch.ts (83%) create mode 100644 server/api/auth/notification.patch.ts create mode 100644 server/api/auth/password.post.ts create mode 100644 server/api/devices/index.delete.ts create mode 100644 server/api/devices/index.post.ts delete mode 100644 server/api/faq.get.ts create mode 100644 server/api/logto/webhook.post.ts create mode 100644 server/api/notifications.ts create mode 100644 server/api/notifications/[notificationUId]/index.delete.ts create mode 100644 server/api/notifications/[notificationUId]/read.patch.ts create mode 100644 server/api/notifications/[notificationUId]/unread.patch.ts create mode 100644 server/api/notifications/index.get.ts create mode 100644 server/api/notifications/read.patch.ts create mode 100644 server/api/notifications/unread.get.ts create mode 100644 server/api/notifications/unread.patch.ts delete mode 100644 server/api/payments/payos/callback.get.ts delete mode 100644 server/api/payments/payos/cancel.get.ts delete mode 100644 server/api/payments/payos/query.post.ts rename server/api/payments/{vnpay => sepay}/checkout.post.ts (67%) create mode 100644 server/api/payments/sepay/status.get.ts create mode 100644 server/api/payments/sepay/webhook.post.ts delete mode 100644 server/api/payments/vnpay/IPN.get.ts delete mode 100644 server/api/payments/vnpay/callback.get.ts delete mode 100644 server/api/payments/vnpay/query.post.ts create mode 100644 server/api/products/credit-packages.get.ts create mode 100644 server/api/products/index.get.ts create mode 100644 server/api/ref/[referCode].get.ts delete mode 100644 server/api/users/[userId]/devices/index.delete.ts delete mode 100644 server/api/users/[userId]/devices/index.get.ts delete mode 100644 server/api/users/[userId]/devices/index.post.ts delete mode 100644 server/api/users/[userId]/notifications/[notificationUId].delete.ts delete mode 100644 server/api/users/[userId]/notifications/[notificationUId].patch.ts delete mode 100644 server/api/users/[userId]/notifications/index.get.ts delete mode 100644 server/api/users/[userId]/notifications/mark-all-read.patch.ts delete mode 100644 server/api/users/[userId]/notifications/mark-all-unread.patch.ts delete mode 100644 server/api/users/[userId]/notifications/unread.get.ts delete mode 100644 server/api/users/[userId]/shortcuts/[shortcutUId].delete.ts delete mode 100644 server/api/users/[userId]/shortcuts/[shortcutUId].get.ts delete mode 100644 server/api/users/[userId]/shortcuts/[shortcutUId].patch.ts delete mode 100644 server/api/users/[userId]/shortcuts/count.get.ts delete mode 100644 server/api/users/[userId]/shortcuts/index.get.ts delete mode 100644 server/api/users/[userId]/shortcuts/index.post.ts create mode 100644 server/composables/useCredit.ts delete mode 100644 server/composables/useCrud.ts create mode 100644 server/composables/useDeviceToken.ts delete mode 100644 server/composables/useFaqCrud.ts create mode 100644 server/composables/useIdentity.ts create mode 100644 server/composables/useNotification.ts delete mode 100644 server/composables/useNotificationCrud.ts create mode 100644 server/composables/usePayment.ts create mode 100644 server/composables/useProduct.ts create mode 100644 server/composables/useReference.ts delete mode 100644 server/composables/useShortcutCrud.ts create mode 100644 server/composables/useUser.ts rename server/{api/users/.gitkeep => composables/useUserDevice.ts} (100%) delete mode 100644 server/composables/useUserDeviceCrud.ts delete mode 100644 server/db/schemas/credit_packages.schema.ts create mode 100644 server/db/schemas/devices.schema.ts create mode 100644 server/db/schemas/identities.schema.ts create mode 100644 server/db/schemas/notifications.schema.ts create mode 100644 server/db/schemas/orders.schema.ts create mode 100644 server/db/schemas/payments.schema.ts create mode 100644 server/db/schemas/products.schema.ts create mode 100644 server/db/schemas/reference_usages.schema.ts create mode 100644 server/db/schemas/references.schema.ts delete mode 100644 server/db/schemas/sys_faq_categories.schema.ts delete mode 100644 server/db/schemas/sys_faqs.schema.ts delete mode 100644 server/db/schemas/sys_notifications.schema.ts delete mode 100644 server/db/schemas/user_devices.schema.ts delete mode 100644 server/db/schemas/user_orders.schema.ts delete mode 100644 server/db/schemas/user_payments.schema.ts delete mode 100644 server/db/schemas/user_shortcuts.schema.ts create mode 100644 server/db/schemas/users.schema.ts delete mode 100644 server/db/seeds/all.seed.ts delete mode 100644 server/db/seeds/index.seed.ts create mode 100644 server/db/seeds/index.ts create mode 100644 server/db/seeds/notifications.seed.ts create mode 100644 server/db/seeds/products.seed.ts create mode 100644 server/plugins/logger.ts create mode 100644 server/plugins/mongo.ts create mode 100644 server/tasks/.gitkeep create mode 100644 server/tasks/db/backup.ts create mode 100644 server/tasks/email/test.ts create mode 100644 server/types/logto.ts create mode 100644 server/types/models.ts delete mode 100644 server/utils/array.ts delete mode 100644 server/utils/error-message.ts create mode 100644 server/utils/logger.ts create mode 100644 server/utils/payment/credit/index.ts create mode 100644 server/utils/payment/vn/sepay.ts delete mode 100644 server/utils/payment/vn/vnpay.ts create mode 100644 server/utils/uuid.ts diff --git a/.stylelintrc.json b/.stylelintrc.json index 815fe5d8..6bf62ca7 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -1,11 +1,7 @@ { "extends": [ "stylelint-config-standard-scss", - "stylelint-config-idiomatic-order", - "@stylistic/stylelint-config" - ], - "plugins": [ - "@stylistic/stylelint-plugin" + "stylelint-config-idiomatic-order" ], "overrides": [ { @@ -22,13 +18,6 @@ } ], "rules": { - "@stylistic/max-line-length": [ - 220, - { - "ignore": "comments" - } - ], - "@stylistic/indentation": 2, "selector-class-pattern": null, "color-function-notation": null, "annotation-no-unknown": [ diff --git a/app/@core/scss/base/skins/_bordered.scss b/app/@core/scss/base/skins/_bordered.scss index ade00d92..7a8fa715 100644 --- a/app/@core/scss/base/skins/_bordered.scss +++ b/app/@core/scss/base/skins/_bordered.scss @@ -25,9 +25,7 @@ $header: ".layout-navbar"; .layout-nav-type-vertical.window-scrolled #{$header} { border-block-start: none !important; } - } - // stylelint-disable-next-line @stylistic/indentation - @else { + } @else { @include mixins.bordered-skin(".layout-nav-type-vertical.window-scrolled.layout-navbar-sticky #{$header}", "border-bottom"); } diff --git a/app/app.vue b/app/app.vue index 5b1676d0..2ea7d585 100644 --- a/app/app.vue +++ b/app/app.vue @@ -5,12 +5,11 @@ import ScrollToTop from '@base/@core/components/ScrollToTop.vue' import initCore from '@base/@core/initCore' import { initConfigStore, useConfigStore } from '@base/@core/stores/config' import { hexToRgb } from '@base/@core/utils/colorConverter' -import { isInAppBrowser } from '~/utils/browser' +import { isInAppBrowser } from '@base/utils/browser' // ℹ️ Sync current theme with initial loader theme initCore() initConfigStore() -const runtimeConfig = useRuntimeConfig() const configStore = useConfigStore() const { isMobile } = useDevice() @@ -28,12 +27,6 @@ onBeforeMount(async () => { // notify(payload.notification?.body as string, { type: 'primary', link: `/projects/${linkSplits![1]}` }) }) } - - // ℹ️ Initialize Hotjar - if (runtimeConfig.public.hotjar.projectId) { - const { initialize } = useHotjar() - initialize() - } }) diff --git a/app/plugins/notification.client.ts b/app/plugins/notification.client.ts index 6d11ea8a..5e88bb8f 100644 --- a/app/plugins/notification.client.ts +++ b/app/plugins/notification.client.ts @@ -1,5 +1,5 @@ import { getMessaging, getToken } from 'firebase/messaging' -import { isInAppBrowser } from '~/utils/browser' +import { isInAppBrowser } from '@base/utils/browser' export default defineNuxtPlugin({ setup(nuxtApp) { diff --git a/e2e/function/dashboard.test.ts b/e2e/function/dashboard.test.ts deleted file mode 100644 index c098d2a7..00000000 --- a/e2e/function/dashboard.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -describe('/dashboard', () => { - it('should display the dashboard', { timeout: 0 }, async () => { - await $page.goto('http://localhost:3000/dashboard') - - const dashboardHTML = await $page.$eval('[data-test="dashboard"]', el => el.innerHTML) - - expect(dashboardHTML).toContain('Welcome to Nuxt Dashboard') - }) -}) diff --git a/e2e/function/list-project-button-navigate.test.ts b/e2e/function/list-project-button-navigate.test.ts deleted file mode 100644 index dd66342a..00000000 --- a/e2e/function/list-project-button-navigate.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { kebabCase } from 'lodash-es' - -describe('/projects', () => { - it('should redirect to detail project page', { timeout: 0 }, async () => { - await $page.goto('http://localhost:3000/projects') - - const buttonDetail = await $page.$('[data-test="project-item-button-detail"]:not([disabled])') - if (!buttonDetail) - return - buttonDetail.click() - - await $page.waitForNavigation({ waitUntil: 'networkidle0' }) - - let currentURL = $page.url() - - expect(currentURL).toContain('/projects/') - - await $page.goto('http://localhost:3000/projects') - - await $page.locator('[data-test="button-create-project"]:not([disabled])').click() - - await $page.waitForNavigation({ waitUntil: 'networkidle0' }) - - currentURL = $page.url() - - expect(currentURL).toContain('/projects/create') - }) -}) diff --git a/e2e/function/list-project-search.test.ts b/e2e/function/list-project-search.test.ts deleted file mode 100644 index aa7eed3d..00000000 --- a/e2e/function/list-project-search.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { title } from 'node:process' -import { setTimeout } from 'node:timers/promises' - -describe('/projects', () => { - it('should search the projects match the keyword ', { timeout: 0 }, async () => { - await $page.goto('http://localhost:3000/projects') - - const searchValue = 'test' - - await $page.locator('[data-test="container-input-search-projects"] input[type="text"]').fill(searchValue) - - $page.waitForNetworkIdle({ idleTime: 1000 }) - - const gridProjects = await $page.$('[data-test="grid-list-projects"]') - - if (gridProjects) { - const listTitles = await $page.$$eval('[data-test="project-item-title"]', titles => titles.map(title => title.textContent)) - const listDescriptions = await $page.$$eval('[data-test="project-item-description"]', list => list.map(el => el.textContent)) - - if (!listTitles || listTitles.length === 0) - return - - const check = listTitles.every((title, index) => { - return title?.toLowerCase().includes(searchValue) || listDescriptions[index]?.toLowerCase().includes(searchValue) - }) - - expect(check).toBe(true) - } - - await $page.locator('[data-test="container-select-category-projects"]').click() - - const listCategories = await $page.$$('.v-overlay__content.v-select__content div > .v-list-item') - - expect(listCategories.length).greaterThanOrEqual(1) - - for (const index in listCategories) { - if (index !== '0') { - listCategories[index]?.click() - break - } - } - - $page.waitForNetworkIdle({ idleTime: 1000 }) - - await setTimeout(1000) - - const categoryTitle = await $page.$eval('[data-test="container-select-category-projects"] .v-select__selection-text', el => el.textContent) - - const listTitles = await $page.$$eval('[data-test="project-item-category-title"]', titles => titles.map(title => title.textContent)) - - if (listTitles.length > 0) { - const check = listTitles.every((title) => { - return title === categoryTitle - }) - - expect(check).toBe(true) - } - }) -}) diff --git a/e2e/gui/__screenshots__/shoud-display-the-list-project-page.png b/e2e/gui/__screenshots__/shoud-display-the-list-project-page.png deleted file mode 100644 index d6caf11052df002e801bdb1c0dada1356ba73b7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146964 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 StFew1cDZlp@k60% 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 z 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 diff --git a/e2e/gui/__screenshots__/should-display-the-billing-plan-page.png b/e2e/gui/__screenshots__/should-display-the-billing-plan-page.png deleted file mode 100644 index 4436cff9901901e971e60b0eb314a8fe2100c594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75112 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 z 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 diff --git a/e2e/gui/__screenshots__/should-display-the-create-project-page.png b/e2e/gui/__screenshots__/should-display-the-create-project-page.png deleted file mode 100644 index e7d608a04c13694df0a0606bb1f85b3d267cbaa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128968 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 diff --git a/e2e/gui/__screenshots__/should-display-the-dashboard.png b/e2e/gui/__screenshots__/should-display-the-dashboard.png deleted file mode 100644 index a910d0932b958f81530a2b356d38ff1d210f8bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62984 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 E2TM(_a{vGU diff --git a/e2e/gui/__screenshots__/should-display-the-list-project-page-dark-theme.png b/e2e/gui/__screenshots__/should-display-the-list-project-page-dark-theme.png deleted file mode 100644 index 7eca54022108f2c82a139dce61920b7e95ce311f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129403 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

jT%4V0Y1{Xw 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

6#wFu$} zi83h18@c9%zV@@YTb{E*5S5T;FrFo6E7K`xHNJli=2IIY(gzYDZn(jbOXH)|Uv)w)?}+nI(9F?<9*;KqM4jhZXV2#>Rzl zwn8NKKA;;Nx&%Q4Av3p>s(lfXt4BY1&GtYwN&xd#j{Z^MJO$aUncL~v#(f21`PM=(SJ3gv*Sj^C!E zfAKZ)p|S+@d#C(61}5koI79*heWhp~lJbQ~ivAW&+nhjKSu!z!DP=J8t?XMjz{4le zUriu46a-In0{7m$X2f;<-$Wh_y2tUUwDwfP70F`JZvXlGXFaGkH$#R89l;w z!FdT=Lhvh1Df?xs?f2^;uNV68Q>bOPj)G}|WLoDqXE}jVfJW9wa0!^nhdxV-kEP(< zYu7LIfr;dLL%e2UQ$cNc>T16?8eKZQ;#|FWJ2S4E^S;rvGIL8r8hz^L&%W)WHHNr# zAYIct0rEt@f0kWlW{yK|6l6k$w)3jutiU*i2RB(3E?Gv9#BZEgI|)61FTEYj%I=%ZqUW+GR{nWU;^_R4BSHSzK_y2^_LFLM)_fc1KSlBqZT<|&MKk!$zl(P@otqqM8cDaR?^jYv-263>TfLNCnu5bS zv?OW6CnYJdB?*S?KhP;Sp0r&$t)WI|TCHU#OiqfN*)puh$Gj+Z`gNClNrhPfBY@SoYZf|G8wDC)NhWW7cte1|;aR&&>&Oric^p6* z9=Y%Ccb}Pm=1%)kgQod0jp=gVL_oZ9$d=~BtANK3&mPp&XO}D)&>hy8?k>&0p#sBj z-WS&vRl9l02}}sWDCN9y@ty0RbIQymcmfT@8v?mFMjD!wQp~J}Ba0ONkMG=Ll0Wqm zQF;{se|z&_j$jFgv26jqgD;gm@_c63#q?hP&{6aDwuqC7uy12!t!2)NXxy)q*Gj)P zUCfw}k?p?a=KFr4xJTkj_R6__TtnEsg=YHQB5uXp5CoD-<6 zHGxuBG;R}*nY3p-IC!c3r)damb}QCwovdVue@b|R7KfGr zN{FVRGhrvCR)Jr>>wMJ4#%uC{qs&)*rFe9uy3I65UV?#mDOvY2JAVz;k_D(DkByC= zTxip2+{$@(>nBefsU95p`QZrRjWdt&*INW3k8N3?&l73~eKhZ|bCjHk#gx2}SG+T| zrln9*u;mqAUx8dQxqVk1V0aIi;uATw3t@)0`m)$By+Xi<5{Ghe-`C7*RMuA6EQJFr zdr#GLu^CU^yL=&n_<<%D-OTR1?RPOclc~{jjjyvD@j40GzEQo2?Q>GE9;EDCD)W?( zLWK<9|M3qXgh-^oBpToHJ|tU8LS0X| zG5w?aeH0i3f0y{S&BY9HHb{vY1nGOWrj>Ka7_*>oz6bW1lIknR$sL+J+TMp|0B zL0Y5)q+39`q&qiA$ENcvpZ9yu_wW2XUR)|%?9I)6uQlhGW6m|k7Wa=QmT?R!OdP!o z79H+3BY&Q)JXqV+NWN91rwaE#NWp!YE1mm&bR61A>0vtANs;~J47Jgmt+xS@uCVvjQddh?R(ZWZT5S}y4b_G%DefppW^^0LD z7Ne^)rRN{;@$-O6>A+Ux3#VmGySG~@6Lge9M$vkt^;7W>D`!tV%k9;vaL&9cA|&a` z?IXq2mL{$*OL(tb*v8Tn+B(?P z>i0;S*>d~vX?rC){nA?Uz*VHRoVIRjr4LdZcw#F=Y~Kot=+mr=ix?f8gU})UR>Vn} z4DP|ofgX+Bxm`NI{HRRDlQ52Qd1h7hlV7V{osR8j=kC^Haa5D=%Eyy|n-t4yGh!Fy z@KKQqlHS=t2uE7wo7N9nan}>vS&*xFtI)R$Hs!F#N3i`yO5DwxHxLj8nPCATuTl^@ zO%xu`&#y0MX2YrA79f6D39iEpVc1U_tBa~nNm_*;H!qiT4}osgr|W-^9bvHtHbD3L za^ra}tGi7V49)uBcSTG)#`7kWKnuouuIM_Qif^c4q5PyD{2szQp-2m#Hqj={U`A7x z8N!F|!iR%a6Wj1a>tQ@@GFnIlQ!%AX>&QkMyZz&{2Mwy)ZoIXU@F2Ha<_0O} zDO1(Y&j*L}@%Yv1U#)-ICI4aD`ZlAYL>kc>BzL<;s5ENzv)pe*Y2i55JTer1&6IQL z<-Wbbsi@DusZn+ns;Ehqlyv2Lpr8Ho+ZC67MU=2$+?XnO=LDlXNQVi)F_>YYG;eFb zYN_Fhl%y;9Nkd9}dMku?GDtqt=$-S7817j?c-EXWkc8Kwbu!GVHGO;~zdb3WHjreu zL&&1<|_%YN8ABnvEVtm)DO&P{nmI?h zMwgGBI2JW9IASLrWJ=9RzNBozG9xHpWI5YkzFWffn2+soE;oQcJqBr;h8(M^>WK7w zKK>8eHc`&Sb%j}`KrnmiMR@o1#0Vb$ejn_!!r-HHZrNzR4*Vfa0wua`%F>Hfem?A` zJ%LgweDcr2Jyz!%KJj42M+pG!tbS%d4G2brSd#j3ggmj2vB_nc#-#H1@|r7K0%>e{GOL&?dru-6$! zi?Bhz|ILd3YA>H(0r6?}Src1GmjqEo2mcG~@Mr*0zCMbcyeL$iPEPWFS8C(jJn|!m z>Cf^MU`Ot=f7MI_GtQ;=5`p6z zO5D0}aKecwGFZk@oeP&p0_kttWmYo%!Oj(Wp&3XKbv;T17bQe@Dca*parqH`JlQQqnjI65_ryO%b7lZGaPrk8x9^LO z3kW<;r;Z=S=?^E;p0DPnd=7(VD_kSJ`e20hO?B$T)D z4Bd6G4{dfoB))N;4}s5X(IJM>t5OE@>sQIwGL2rLr!aq1CJ!G;ZI-C`whm9?y&beo zF^#>=W35-9V#EzcU;FVo1Kzbg(4hYjO8!3eYPG|CHVLF(#LkbikH^b11N_Cy)4RH` zQ+W}iI8Geok^ZYIlKr6v!%v4EJ&bL6%z*k{>O z-}^G2`RJ{9w(f5`%N72zGf20rU=JUUu-pCKXe}6B=-L?MC#3|Tnc;hW!IFR{p+8x; zho$jd?c3`|&F{o>2rdI=UoN1DDSQ+KqhG?p$iy6R#LuGsI-|Bfy7iW`)%bHNQsEN! z_v=u{<5P@E>3@JA3PKOjJdiHpn6xyj*a)%?P=8|F_l5d(KM>K#h8OJO?etduS&WI?2qm(0xw*v7$?FRq#8q>+MTkxG`)tlMJNXY*p@DU z3X)>{_IsslmUj$ea1YL$OX<^bsbBeA&7Yne^TV6ih)%OLzH6?B6FX1ZY@B>rNE4j+ zWvj7U3znIj;hz~eo0@w%f(sSSMFU$OEXjIUy1kNYv>k`GHz>f+ElWTlR@T(k{Ftv% zwz0YSk^qxXN#>iS_3|Iq%$YV$YzX%h&x-Q$!sI5-?cXEwB9$i;Jkl zSiCY;&p5cddR8A4pxl^e{ceM;?{n8tGb~+%401*x>D)+F#s7*jrtnPR%sXEWB6;i) z;V~51t4^QL&x9i`_PBI80G=K`aVGqIh`6xPSIjUwj)6heD7C}cTP<~l(su%-kU%cM z)5xLm?L-GkWzU`NER@P?@z=4H>yE+iY9BjW>Ys+KQg+Mv(Tkm$u`hU1K&(e3yuYm# zlZT}W>?ts@YUND>*~;?x0eKI7q7-_wjT!OWfI)R|GkBQW{oQ@VJ01$M)=(t@8zXD_ zGTJ;yT#Xs~+x62I;-pNwG-FG10sloN+JyUOXc;vkIl=iF(;!9l;lJ}~i|Wos3SCOvAHLLJ<8ZHsk*e~%PDjgjiM+jYXNxNww%2YU* zS3+;)&n>$<*C2l!5)YvaFlg}UOR!<3__@2;QA%1eyKq)@Ms!GHKJ_L{C_>5M3NWCf zX9R;MourE5@1lj-`S`_X&bV2;3sk^Hd~uHSv_#!>v9ZOX{i#*@FLehlMX0>;l@A}) z8cxv3PN5JI!Y3Bf$BuLYRu${lwXsqp!K&*ZcA zP?l^kk~l^R^M_`3M^7hA8Nyg3_0Wn@I&!oxn+^Jg{cDg${csTnzAhTC=C-ZNmEX*t zd*FWU2@9^~rdRZZX8y0WG>Fi>4@}w(-c&O9xKLHa^(ItheeH?Q(|L;bk75n%T|=D{ zm7+2^Ee7$rVYI}F7*uV+*qu0Di`#&Jp(Cve>8fMVYQx*toRTxsO!9i2MbUbMvE6P| z*c%k8{Du57B+a+VA|l=`_>0YM@Pwz!R`FcstMnMb;uwMA7_dOiXu*Y)zvb!MOcFV& zC4_xQ?GE1HX|EI>%=}D?l-)exhpS)VI1=zjV<luIA+75g5xo0Km96>7;_=? zd7F^lHT%Mg)X&J1>8@+<9aJtwS7(#od>tooV|&PbhOk9>i#*-JkmTwlRSs_PkH_YQ zkCX{XVt~#({t_5Kf`IS?JFbs`=%Z|5;pyeg7!D%a%nvfkm{IrFgOEf;L)L^O4wtB+ zd{WGu(FA&298SS-Q5c$20q5Wy7w^kRPh{jaylCaEG?B04tTf!8VwI^lwu#-SB`Jct zsS-MWSUiz?a{R?Om0wB5(1}i`NWQ=(&-ESrNFZkS1J+ysUr z$PLh)%x#%`yNd4*T7}lM;t)zYd{PJ!G9>W7a;qhK5V3OxW^Y2jh>d~)o@>eAl00@v zd;eOdW$mz!AEqJIOCp=Sb|ZsJG7+P+HEiQVA;P~fG#92}!3%sC0d%F|;)U<>QZ*lO zR!mPz-P$XpXG_+@zo8SzjyS?>9!9uwac`&kSclXq>l6I|YEL)IKid|gnCD$-71cLR zw3zng(gOGgVYz}GxCz{b$!}$pi{m6X+(kURE>+hTE`tX@olU5Nv zh2ft88v9d-Y_|m7hC`}Cn}+U1%EU;*+VKy~1*!xs#5=Nz9rYSJ+N9*^$w$6y=Y$}B z4?3CcNsc?OE=LcIavclSYxNX3O&Ig^o;ykinopy8VkRNUbrOJeAyPRIWMrxW-!>Tw zk_R=No*BSz7_;x^rV-|_T{cu6b3Ru^@JJlvhMnuHG3*Y}=4jbuf9{n)HG9V`nB}DP zo57)DC3kQs0^3QsH31sn5J+djk)!<|+dg5>JoV}=(1N;6Pd z(n``?L^Rw(mZdgP`_XCfg!o0)TUgm!o9XxhYW!UZh$oc5H9)!6oZ9HCn^M;53Cyd@ zzU>VOW-O$x}!DuYaI=G-E9=q}g3^;@n@v%YBx50Vw%(61Z@Urgy5Fe|C6 zCxn?VFdcZVp8oYbxcR_s@2^C|Y2|7MGOV;T>DuvUMa=<%zmPy8l6%(M? z+;yz;`2ra18@HdiUh5>_QfwYtJ4Skn@gUm8Zfd&t;c@9FoZD~wi`^B#*owK|)S32h z@&L#Br9fDw)va?5FI*ASIxkXua_hHqwwgWJ$Cjo}YVQKE6if>N+_c>!pb^N`m||n$ zLV!kr!T}|uvGFELeriCH%J$VgMhbmgf7y{yWSSfKj3qBsa8Xuof<=p5w?s@;N~D5F zPQHEO0L#b@9+w3}b_#<4&au1Y&*2k~j=eS)K4iu9hh%aE3UYYwhF>sYgp)h`yH+Q*Lpz*KmkmBJVT)cc$`I(p8IhwRpWJcB$8SA;NZQ6mce!+X%r86}olM8D z9u7^k9nzoUJ;PJjAs9{`y>xlF_n{BMeBR_O*ly2yZ(QLgDdsw{j1>l+amcq z5dk4twqwPN^X@uqO;PGyU&Hw!7eq`1M2ig`WaSW($VK;|v4=7O>b&FBSl8pS+ZgoUulfgFf zOF68aNNvCgCt$s*W2irFTTs*;6)s5?f8k97A&+H~L5~3RssTEho`9W*#o+Jz z9+-TCK8KRbg!1z&&C}d+aLlyz@!{r|8(HBx+r8Uk`vcrPT&Sn(mqIvgse)-+@Nxgp zU60wF6PJDfDKup8DJwlfGT9{UAr7l6QD{u>9hyfC8Uj{>tIb|YGwYL=;*40OQv%@7 z*<2Y^Kwt-c{T0m2A}msGwY6-gzlcS~8Q{hKAqx@zQo54Iw@*%b#d?U{y9VKzHxFE0 z=h#7jD*uhTVwIH>Z(R6s~Tu&?edg zHtUzwP7#H7j0qzs zJf7zINuBdaxxoDhoA8Iw&{6bT9O;#6c#OQR4T>1(hj6tLxAFgd)w9B|G8_Uah1>;$^L&Qt7Xyt z>xKS_3=X^XYHM62BpZx;`)JeX{7;$V-ybZ&5hsiP`S1VvyCWavzt{cWFaH14 zL+#W%ME}1(^;4m$dF|nBn*cVX?JOgOF+%rnAM6sev1k9cDZE-WwlFg@H)X>9SF7^7 z-eC*)27>>-f!wlDuv|KyoRHMdv57uaQMyEOeqp8_G(W#4G4GwC-$bTV0DCZRIg7z9 z-uS3&-^<1OL1GUd*zV6#&2oIykgO~N-}`3@bt{~uJouP%2Qjn@8?D$7MA~HIltE!w zrXl!YKWxb>7G5G8BQVwI%1Hl~mi{fiHs-XA)S_Z0mDXe2=vwOQG9fV==8kHV<9l0cY3+f`c z5X3^-WQZIl1_m{lt??fCIx6gXv)`|7p-7jnn`KfHeRKZ+6MPv&c^RASD@}!S6IB&DjRF3_yE|jH#dhHj8=g!`4j^IXy z48rJe!`D76pkz4L5a1JR&UM9?>UW`dEe?WNyQ-tbFDS^ZreZ?zm~MoTia)ezb6~?ALZJ(wfw3#7kCSQeVMx--VGGy=ixv&L|a^6b!zNKLkfr)L3<0+uaKHB}%P*Lj@WQ(b2eo3!g+3bnX*sID$duBwQ##LH5+dEe zWAt8ZDKWcma^Qn7v>*E8bcLi2VJ=*zVmR|&XrE1OcrSqkMePpM4@u+^2Ptx${2-$)n9km#cu`H_r0^Rq> z>P^C8CWwn{|Fv8PCaqna;h`&!Yv-_$K4_}q@1^ECp<;upC;lhvwD}yBH8p6Ili-MO zrqV+661EU3;i-j1>3|55v~>jpgN#>H$dixrq-Lo`OI zu3k0-@fi?);3rGy?}Itf(b3_E3)MShz0Rte-U^*6HDH~AG1H?z_cgFPKU@-eI8yPK zQv)I&QhGLMQfdzE&Y4Ac(b1)Pdc0p~08qoYaCCB=f5*J%3H8uk@eh~G%db&j!KDu7 zCa&%LdUW*avovGy*k+=0IG4J%Dmc=tlH++fd!nw;xUxW&h1xg-yI_GSA4z$8Ba3(U z_5F3SFx`oYiaBinCcLq|%#0k!LGCxLzwtOy2BS$5-m3}MI5^lTC5;mB-yV9#_UaiL zT61IoN#6Sb=1NutmAn7e4JZO$qDx?5MnAuM;?^I?jC+3{#7~y1s;aBY$-%MX)QBUF z!?~^^|7d9IVVu=tEaLt^C2l!2AQ(?G+UEVxR?yPjb!Zh=(+LwR=r-q@XrkYxv>)uw1-@Q;v`5TI{Jy*j@2TMyr zJ}MuP6%YpypLV7fP3hJD459vT@xI1(GIh8Ie0Jh-2bPj#e%0^LcY3__(z4a9tr8U2 zwkvf!d|K|XUDxI%wc5ODYbi4*x&M81bGx+!SX?rWL{AXNb-*d?BdkOn1+DTj70g{) z;3*{~g`|(!yN$Jap;w`7!%nDg&u726z5CNE$j`|bx1LLhE?>GlJ2f?RZl60XO0Yb% zi0EP>v7(Jp?t__TsU#I@m>e`eL_BxQiiZ@lbK}(7<~uzdUFJjuqEdp|fGz7wln_L* zZyMi0xP2Kr?8#!K<=89?q0G`u_-e)LurKp8;0;w;cnQimNA|RY zmmRo}t9>=ozPAHv1zEk+2g<`+##OT1=I)yrQBR+&2pq@@-859^p;NAR_p57F7|K9A zTiRN^-KM5BtDaaUjQ4HB!7ipt7*BL?;s5P_Iq(WwoX@__e|_WC@bFaHa1Suey1p)Y z&wh3x)H^G0sJHj~SKw1#1iP`leoGgZp=?Sra4U7x$Wg;C+Fh|PlQ!U<@0gh~h)G7; zyhn^#x8R;2<~2H=aEgDX$!~VIV`J!3Y17Qe;FB$kXWUMdWKnj%4-ARyF-FE}jedNb zTo!I@Y#OPszmUO!d*8=826Rx+6^{Ca4vKh&K;+)y7fx8uGV{Vtf0tVESO=?8iOo!E zR0*YfQk$lkU!>8|wi6V%}Q=0RtsSe1RRu!uk1d9zs{NKCS4sD#% z5&U@GYDk4MJcO>-gt=f_Nc%EpB`1@%WyJ#;*D}Fbn$){-frb7SKcw9YGfY;Q=m@+l z&SH!@_y+koc--1F#5t)$qkPhG-|H)}2sHO`TQ1X9bdxKL+CA@Ylzebe(ct$19j^?% zgYFYC-fXbN=^XN1yPp?# zr+XgpXH76FJPmj+e-IM&)@qLnfrUKXTv|rP;vslQgtM$LIg@nie2=d;x&M*u+pHoFIlwH0{q+eNmD1(mc;L zn|?QsMj*v>h1~!bAz|p2V}psw#mvgA1NWBQLX!>!wrnA10^PynVFft%EeeyNKlbh1iVh?&q=PRb4H7&tS!?8ZVwx| zEJini#6MF&sEDJph5S#t`zIi|$y*rvsr;q2rrR+G#I=Itv2c%;9jk3UWK1lKg;^H4 zLe9`!l)xaYABCP0r)mX1o94LE+=?3o$>idRl`zE-l_o%77$tSB7*Ojm#$U*P%#p$s)V_NIAu zoLwCbMO~Wn@nXf7YAle60B`y{XTG_#qV8p^3GBq<*|VVb>!l;ch+je&&m{x|n4lC* zg`PoTl@_VN8cbbgx&!g`nB;QT(}%Z{t&M^Q#Udvhfvb*<`jw;gkL5vEq~>sagtR2> zA$``P`Pz*B?efy*UQ+w8|xhS zsO`>YS3^cOC%%%{h)P^g@-Sg8mVh@uj&|tbO1}Z}c5`zb^*ma%ZqKUj2A0N?hWf1T z1M#%vI!_VML^)dwD|O4a9Qm2|_L`c!_pD1DKQ2xFOn+Tbqw*T|BoQiyv~c)CSAlt8 zP$d%@jRuA@e>mT2#%Z4cjB<1Dckz4E@v}!}o7??OK#)vzrBzKmZ_1zqgckP%I8L{o zY-Jg3n3wXKd61jQM%S7-FErIENpy8FZm=PTh5|MH2voE=+O2h}Tvd-fO>d`Y+Lw{= zYv{!_KU}e>JI-S8ZD@qd=@yao6$mCDlb+#05TWEL%40M{Jql-D!s2}#B8D2;3`z2R z1w_eobXhcVTU)!c!vK+hOx&sJ@!k>g=vmrovNTT@Ee#xVrKNj;(${{rFAXUONcTwp z1tb<+Fe`E~JvD8+RK3&D+139FWZ;bXbZVSan3f?4F;Jmy@;pcn#UPn(cU}E4vp2Kj zLL5zp4f%WCq|H(>vxoRJK)Lu`sq>wmzx(LzucC8To~`w~io<0sBX9LW4d~^5+lwR^ zP*&%vhKu-!7*Sw9>=v%fOH0=~Ea)3)&HSl8Nm^;&f+NRot9n}>k+(ejE6g_MD2L^^ zx`*9Z7+(vs006bM-%PKPrPKP|PhD>>6l2fsDB6M`yc?`%kMntq;IRpn1IE`?KUWTY zoFBz}E9{S!m-eQ4uYDdiUlvK{&()bFs8V>G*MgeC+Ni#+s=T(g&}?Ju2ZjY>+*g12 zLP~R!cfH+GOHs+kz3E{_nYj3R1EG4e*%A#VA|kT;oL3K$Ii=n=CBkOYxOZKCPN>86ST_{ymnYK~&AT}Gb4D+3z?lz$ z;^^Nkn^5@moi@wG`lX+&bjh~Ju?tW!efJIqGQXZK?-q=xLci7Rs!uI}!(sH0j5E!4 zi}LauBQ?s?+?m53LsK((upoY+UI=I^GBY!gZfwZJkdl$rh~5SiGcymIbRe}%ykS4S z6>SOi*S5A=rg#|%Kt0fI{N;8oZx}eZyXkPyre31q(BgT#RenLXPzRvR=VqDVy+#D{ zg#5R0Gy)s~X)R;+?ssYY@ikl+%J@DyZ|HU|>Wk5r_m-agf`6 z<^GPk*BOiUM}Je7j5)S5qQDje80<|4J;aogsM-4_%F~k+vzNoKnEpI!y-JW4!LBwr zF(oNBR^{$6NlPyN?l>&FCN&aVf8XCM+2}VESKtfGOhf*ci&;kL+b!#C*sg6V^23L4uQOTnkn(J8BwTAGypD<2Vh#(_+wd}#{o zka8<)Ri+oV-pIt%t8E)B?%<@u`;S>d?wtp2T3Y46y;RoF(Ejxc)R2@){a&0jus;-4 zn$gfuH=PY&J!)IuCKA_)_h{aAlKsg2TMu*E8>XY^UUEMheABa;RE4Dk^KI$Padv0ro=BGLr=c@iag_U0A$Eh`| zGH5WpU7_IP=Vrk^&dA7NCm=|RjI485`2J-D1Ntse?*%H+f}c6~+Pp6BTaEoC=c5dy zN&psDCRFOU9X1`urfg>B^#F0&k7BvRVWl*`S{NgR|9|00HrTU?2z$dmOSx$?$<(lqpu37DlL>8xjf&pmwvz;MG zYjyTk=hyd@cMr8c`NUaXHv8RACpym`U1BZRf-=@wgE;!PDRSE6!ii7Q9# zU{i`m_1OLj%baQj3#;<+l=<*f6$JIF>rhbbHl7D*Ldg7XAq5w~@s+rXF zjjIxMe!d6kpP?W!QquJkkE@xI2&Yob{46KI+neWievg;_#~Tj!xBhE+tG|aY-cWoS zNIO>(S$L8S^-ZRswl$%#>!I#)=coydwOgs%*(tujCm@K8idphHY7HcgmM)$U$WkVa zB_}6WW55@xa~Pbm0y6Zvdc2SjcN>TfuQecPRT&_N5=5NgQ&ZDr1{0eX9wTi8_hG*w z4M+dl6stIVu*^1(oq_4s8PmKxH0`Dm47eyEzg}nP@i|y`Dm3WZ^OI^aY-09$Ohw3> z7#dQM%X|i`?3K#kY;VYFnDJ^$EI_m(XQcs<<34tY1c8{IYskto)Q(9b< zJ3}0OVGJ26r$&9&1nH8={;ci9HSJlWNgeXolzXsns30^6@{V7)S_>rSxwekqT%3!GZy;?2n-x5$i2Fgme$?b&_U=(JF-bZK zrQeyT*M4Z`*9z@7(5nHyvg>;ixb=W5@PGzV%qo*`xeLNOCRpUW5srqVx}RrF#2{tk z>ABEn%s4+8q9a5%Yq0rI*nV0Q=TyJW>Tso9@K#R#`O^S|F7~%2rk0ko2PYsm0^|`B z1iHSpg1x%Bd2bm{GJo)oarJf)=7Pf9wRXzPtkD0VaMT-`ox2tXT;J(c3J12~GSbo~ znFVFGhgoR~=F3m5fD^$>6r~9e0||XA!%z>OWVsDXQu(pbI?fjx>OKn!vPmZfs_$Jm ze@wZ(pvy5atifMoX*5a_bMA-ePplEejy+mDr+!LNeK>8wRv+2fjAuId4bpC!I$mT? zsaAQEbbllPTVb@whN_=L7t@`d(?_+qHyy8h94f-~v)q=NYNbMu0I3g1_eOoNIkwXj z`~QrMvCG9%#W{{(SfuN8S@>S|yn-MGp6{hkSLnbOYiQ?vFG^_$2ZP z=v#e~Sph`-a8Hk!*>wD+`)YLW1}GxO|1P0o`1Sr=d8Pddl?0An#Zc9z=)=W(v>tJo86V_dRn`S%;(4mV@C5-Xaw12}tNa{7?a?0)y8 zDC7y2K2Csv?b2E@dOsH8PGs(aB^HxF16ZjPPF_8Z5sg=(6Je>0dsoLKC3=18+z;Z(bD&%;~6%2);RWwfU!x37CJt&|$u{f)baNXHxYzn91&7k6PT zBCj5}2c@F{Qk2d&4o~$Rr4*NC!R;~rcyX5z8R=%fG5|Y`zg>T0g2?jxzhkp#Aa$~* zoqpHU!0pa5w2hNZE!yE|4m$8vH|79MoQB?5WvJB{`HKJia z0=Wt*89h=+sd?y=_&HN#lx7Lllfa|4*%q@t;odGQ$Z2b z6KwUp4|tms_uk?GwdyEeLQRrMfBhSF!qg+* zEXo9Ct!WPQAO%WWz+L95UJXpyG%UI9oW3a6Y_>m02P_b1e$|}&$pkyo$e<(avkA$bsPo*wBOU4Dvsh}$Mtjd2Bq0GD z4W{0`1M%3jvLord7L;}g^oyBRJC%3%;Gt9SGftu3#Vu?o^?%YWHz)jkaI!vExVyK9 zda88dVQcCVHMpjsRms58r$U1Z_w_HD(p`t&94idD9V{;YXj(RAB_^$=3?|)3K*l2X zJ8ZNV7#t)a(Hy;a#*RS21(FkM)vp4g%+S!#UV6GHPiY%QCAF%6Tp^roN19&*5LSb> zz?@jr5b@$E^cGR_EFB8MfvKHi#ml4N3&ZL0xSe6X|4Ob<`aQ^V33`1&ensxB1;|TZrDH#K~UG@7;dvDFb(rGwo+hX=GLz z^`P|dRkx&)>$?vDD3$tp>RAc-#6)C0FIqO0C;HW|LC@-cw-iVrdwlkG9>&74y%Ngw z;@?V3i<_)_(u<_yX&e@9{f+PE!IM=~RDRfee0WM}Nv=@fM%Ka)S#5xT0=)@7(qBthUzvTY1UB;ZCE|x!0*0O}%-| zqLsOciJMIcEd1O?E*?L!8~lnURo&4U_1NMb`g-o}Scd8p*ig{@R0EdMGTUco+bNWQ=0Q@NK|U4=c_qzQH)x>mMn+59JJuq&p;myScR&@W9^2-`g32u-hS_C*09gz z^3ttQA0%mvQY{fM2?2ihFY<*Me6>XAjUc!0|ACe2RP1EBnKf=b<8{jdQm8+jg_7ae9DFo3kD%Tcply%xxw>$l^I@~?(TlyZ3oopwOYil*Vj6;b zfr3iE(W~{_kFRxgH(WV>Yd7Z^YmT$V9F^b709$<3&zVu!czQBxUH7YF6R8o8*J-p zUv()2>Op;tA0N7IJfLd2plKaxb#vHN(eD4_$JY*1PSDxgzn@xISeb76cw1KvAUC*Z z&=5{aPS$Vm*g0^Iv1ptK2?Mx?aSv5-%`$Yxk$u__mu(!4m z__+JCKefK7WPBUG)WC5ht)$}M@2N8vN}nxD^Y;z=cI4ms|RXS_$Ct$RpJ} zBqAcf`-+2j5E@n~0*0W_oYyyZeg*oty^I;>xUJeK=B?#9nrn3)Jc73+UjMmVU<;kCWXTnu7zDiFd)WtzSb;?II4# zpZ#Sd*lfw#ha*qK)h4?)H<#(%*BW)aZ=Yk5dy&-ZE;zWC8P#9ly?XpxyT=z_Y~1X2 zFD(}i+M>1KVQsS+nx|NZB;!j+Q1eVNgL;`dxX9qJK9=0QQJ?XNCG;p&n?)CNl-1N? z!YFf~=k}+O@h6m|0!}Wy7v*;4!{7r#8Qbf;J4pmuKH>}l3g{A-msn(;x7wfwK50@t zXJu|NlAX|B0NQ!}``1_-Bj3Su@1C-6RZfv*-*4be=-2+@0P0~^*IMwgkJIY93O2z( zSWHV7!LdBc%hFmzO8nT~f4mPt!G!g_pXdVSXy(WX9#F^o0OmL7MIO|G$IgDDhTi@7}3-yy4!|4GDq1^7Ju zm*>AQp|lBZ&G!dHB?qF8+PSJ4@5+y_pG{2YD202U&4ycY&(Hq&ZY?FnP2B2P>N_=X zGp9*TTn9k=i3jP$bo0jzO)OF*~!Uo8VsRf zM;F;2_WG|37*9M}YD$F;gq$oA;>Ed%h5gr@=9y5LyWo~}lkt4T47+2w)UWRHvAB77 zuY4ZTp3yNx5Z6WXmKnmFnvtI$WnQ$k1;mVuykpk#+nUJfFwqmvE(50NI!!*X`IarQ z5!J4v-CaO#zaAz5SNa*CgIkT zt66om_TBV3H2r{1TN@dXHZjcZq`-zuSL$^gx__w5N1z~)?1@ks%mOmN8{uM*gZb8j zJ)_46#Y{iPv&^>p98n--W!T>91Lp9uG=q%Fo!NF)8JlD|=NB&9SjC?PP>jA$6&TB2 zYW{D8M3#s+=L2&PC1@>Kh5Z2=<)$fJxY@mKvv$= zlED|=n$hhx9b?y@oMEhkO8Z?kq%{JAVpa@0x!1+UZbIhwqmf#=sbN0T zDS{i``3v3DuO~*e%uw_WnovhwItw>a6f>b<5$N<=c<2I>f-pI=$y=5-NrRl&P<$0nm_pz$qR>Qncd0mR$ zFb|#2a3pPUna=pnHhvYFTwGjsa$3^d+&EE5zR2}eKEMt6LhUBml8T1~MPDgazVa=O z?!1c{`lS0bAXiCRWd)1q-1i5lTukg^o$&Fn*dlPI-Z?oru@hRh zIgdtK#mvSITOaHlIoQ~=7iY=F#P88FA5?w~4%8 z?z7LoU{2BYRNGryiEOOE0lQJ#KxnH+<#H}0Q{RjPRz@%FdRm~aTBdM04ofyHwz0A! zxsNn=p-B)a`S6xYLk0}Kva2;V3V?AglIY)Xg6|eH8bxhwZ8?wYg|{oCh4X_0S#J=A zvEzB(J%jc_Wtra$LHzvB0Uq3~lFl0>Go3pJ0R_9z6BC0~9ihYBX`x&c!C4wbS zie6z@BBU~Zx3Mm@u|BfE!oZ03zdZ0yZTgJxewT-v*B2N)vw*Rs>IEvkH8mjy1cV}B zro92)Ab}=)&ev5|FH<-t71y^vjggPf;*z?#DN8t?WXziAVWgBqu1xgrdv?%%Z(U&nMq)7qze14a zbkc4O{quq4=AYX$bWgxqe;O3dUzP(ui~{xF&3r!sI93!C6wn8!r2O!4E>G_qv( zSRC;AP_9|5h<)gG5#?uZZ?Ej7Yt7H%?&2buvFnKL4Z?c4CZpd=NwQ z;tNm?=j`jZVZ%oU2YBKI#f33`O`LCvr=$(X?dyw+3$1I3Tb0{?8uxoVVXh=W4a-PB zY|yV5&-H?~;TX)1R~GKm)6zDU>?muRZ~c818%1<7QVd>JKm!Iy%`D7NDeb3LMuvy0 zQitR6BloAb;fytnVb76ks;f;YRiN)-HJ?d0{$e%N*4njfyv4`gq@S~k#|NB;n#kE2 zV1Ph7h#GH=S*vos%6G4>TrWNSkRgoMydzF-&xE|_F<-^!Oi17^ZX`uZf$ zYhL@V!m#iRksv9#janag$^EiDIb;vB!-@c8v#@7c?ytbcvD-Yl6odIg30SkPjCfa^p zM(UP><^wQzY`a}vLn9~+!S3k^!4mz+%tK2{h`xL7Rb1o!NaDc9%`0WdOi2kQQ+Cd8 zii)1w^EzK{^DKlFma)cT0D3XgD-?9e>~Ze)rxnZv6Q&9D3NEz4wZ_=6vQe=Ul5} z`*rE`U5qS+Tnh5T`pdcIMU>p{Im~;$Wx0sLD*Vy0G1*E?|K}+R>xj!auf1PoxkzdM z!dD&psD(_%WL$ktXk~ChN;H zmyBl%)pWi3Ectx4f;-~abfzXJop!I7BdM;#OJv>HbE(Onw#eS!A@f{HeXFx zs8(iYa?y6j1K#%yT7eIrX>hhOI$tWSt-SySzwlj>RK|X>_jNJ2d8Wo-dWts|%+*mY z$Bli{YIuXbos7&y$ubijjbNqu>R};J@YXYfqn@%@B_O>gdg!b>|I(a&tVmByqr#}i zAK%*C)bfpP&-Mv&+N?}1r@$j?EAsiRXZE}Ei^IhBUzYJ6+Ji2L3v5u|^m7!df8ZpW z@!yU2x%^owR(hxr+7TJ!xUvzv%%o7HSLJLmw)PzwuU)O4^6gtKc%#LKB`q5o0jG-s zLJ=o6n}6j3{CYOwdOgKE{yV@w2#-e0zP`G8KRUwe!^zJFw^#l&VQ1-CloN57{3H+9 z>+P1uZ}{gGN~fLSQ>k%rQ)9ED!8Y~atgoy3`WVBG1eCp*hKi~x@$UCHbp0ufN@_0o z6%~aU8Fs&g!ES+&UirWFgfTnMc5z{0q1iu(K`!d?=2hU9tcwX7D>K=wFCIE7DTnTx z@j6pW^X~rs(#Zn$`0X^G{jAP}t#4BxpHv`fA93rLx z=CTZY8bQ^!)wa!7=YTCWpmu##x?E&qNlQ>|n_>LXW!=KULfm^Pn_y{llRICHtxAIk ztm7BBDsSGHbLa^o$N$%~=;*{ehuknS38~XzduuC2!NlDB)!fHBulxF1U9>c{dFJd^ z+0+*fToqEzn^plqS_Gg0H}^9}!mWgIO)E*sr43(hZf=&i7*bNUot-V}JMsf&~CLz3RA$pUwn zZtjSaiwiDYkxrv>WuBp&o12-OoJ-Y_>NOm{Kb5AT)=rw4m>M=@$QRUVuc&Ba2-VZO zt)HPRoAjK(aMaWDS+R&Pd6{(|$dLqR`ouQSDGl~*r4e|lEIsebCM};Oy=ELawbH7z z@=|hpnLFYpLR~jYvf7kYmuu2xU?ndv|J4ZKPT5NB2K#sCE!I`VU|qa@n_yVA?db0R ze9yVAqBhdPR9cX|Y;xu3{1LA9F#>;Pz`O^LHp>smseVnv@QJ_>B!nTY z1VnyxA$|Q6{%KJw=KLp7VLsN9@F+{$JqlI^y`kxA?4n*_~_(h&-3ngMl~zvNA@QeQW8-C z1TtB6@1N@$s2l-sB>8zj3$Cm>I+cf1-1a=RJ`Y-;>K*#j9NS~G6rX5VYwI7%2sFvm^vlur`qa+@STSa z4X4>=JmjF{%G2r@`JPY%n3Xsq2Jg0TxK_|7k^aa?;ep%Z_3q31_t&*th=mjP zc4792iKMu1m3if77hytl((al+CoNNdKL_^u-P^Z+My5ShyDJV4OYfuPW@j_QHsy96 zBB!j2(E%6eCErPF(@y$;m#<%U_4RRi*SCS%KQ@w{sKd6_q%z6RN&Ge%L_~lqSN@t7 zADMc(L0>0!TVvw9`$uRhP3eE~z9Q7xpLe>l8IdCntu->cBL7t$Oi}K zuywJn;H4cHqSU#$sHIGB3*6abEUphcAvQMl`1ttZyM+BK5TwnRwe~s7fSZ}!&K*(R zJeL(L0)vw%{|RKj0?E6Ft)cX#hPm*aNM=i>0nttKmL*pvq^$N(6} zd)pJ@x(oXO8lLgns~G5yqTHT?Ls6l$~3dr`&o4~ zajX0APdP60UV0icS*M4wpr4|M9a47ff}1L@OIeYsjEtHOT}$0#`2hs|sdFxK!g=y_ zVzvvgAZK{qRA~*EOFC&iz4=J`4tMYqKz5@k`5Blxf6NGZ&e4s%`lXo~T#dv;0Q_)C zNnBxb7t>XwB&?wgigHmh=rdDO7yZI}h~s1JY9*N4$R|;~vjPI(Dmpm{TdC$B7A(>n zG(!SPRh0{+!2Xyt_?7-sej$ z-QA3WMx___*J|Dfiy{;w4UE3*Q#xF_9l2AQtNrPoc=>0c786_IRqGL1cRODyj%<|! zhbW7tTkBUkEX$zxlm1`6z|y>yJJ^W{C^g+V&ql>s4K;qDgn|Orv;pyp4D6@OomCoz zRN%(h{>AAq83SikRTT$^n6IGF;t^t!;(nBet?jWC@Q*jme$4i#j*nN$1(2_%L`bjN z{z*#G+BK^(kTK#R55Xb*>w-{U`-PvScL*0T?+ss94^-Jb+B4h%tnJn1{Po&O>UR9c z#Qn2%RG#?r`#6~8nFFGnJIX<30viaZK1aSN&KFh#u zmn$p+38JkDSfXt$EQ&)(-m4oXTha?QfA zZ>F4NS)tg0AFr>`M#zXEkft38H1eioC6ICsPRBjw5_el{+r+_a3RU@oRVPM&Qr+jw z3T$~F(Lv!A%F3fmo#LeNDAWGrr`wS|s9v&zU%aj`Kv|kB=pl5j^J=Z-Wh^^r3H&C^ zR%jlCrZ1C)a!+4D!0~J&qe~3Y#YCO2{$}?8BuVYn&m=EpwtR!eBVd(2^#^IUGu*2A zCz#?_2iaLLMW6)-M6M0(OS1|KXD#_`<}2A47*0TfswxY$zN#sJu?agy1ZC_{vat36 z@3qbH(U`cn@$AQ!Ow_X}z_f4dD_1O`7_%0tTJR-_Qb%+w3)&x_MP_v{Ri$afGd%hd zf?Fk0{e-T0$-V|4nxQ^$)QhEZ7bqi*j%LES2MG5m-2OLhQlVEK&V zAE&=lrfxPhp5MpTmih4a269m~<@PD{8H41qZ9kqjrPX(%#LkX688p~YXH|xaF zpsW>ez-JxONL%~cSxa*4oy=by0@nwW*1qQf5f0d5I^++N}# z!UOHB_ecI5 zM^jUXXGPHSIN%Uy+MoFx(^hiMNqwd~V%MWYfOc&KSzYiU)U zW?11?Iih`H#Q%nrz4jskUUl3Mj+_% zt!6J4B76?H=>imTZOne$?jpQt<%avIwA2cGFA7q@ua6&&`(m^Y4*og5!sQUFav8Wz<_97+GzQ<maE|#N{T_9+uQ+JYvpE0&Uqx z33(NwqVi_TdRF1}Yq{62H#ask)s?qb7_RDfClcA-1A2kHC;>Za`- zV*(%pr~+0twkIH~Ok15c0PtV@Hgj*x8)~(x;@JwBpK7}ve0Z%phnhC;1D^^TTGU|0 z1`q@27(WS4Vw|~UVa(nK2C4ivWBfPM3I2O0zwJMnU>iA2^d(W7T5Y=`VE%}+eiVm~ zK#RESe(W>W(JcABebR7xk>n1`$orLNfAVF>KSflu7psN=kkl=$bd^a~cjtq&&qvJVHAEDX|ale)1G+RN%Ky z0I?UcyTEhmCgmWn9Lk>9mdaT8+L2|6jgGeXi#33gEDS}?+{#L&vToKI__<{ovOAR- z86~hRdST(ZbXuRAE4LJ?6oa{AsYHIDF48=gN`Ry9>?~+`3@g;jW=4PQ`w?TI9lX3a~~MX2YSd`k;{?i{(Lv@$-G@#N9ZMp}ut zMcqAGwx=`aK-2T2`_+9b1BaT)69BDwumkl#fX7n_dGgph6nek}ojhbamP&_#AILtY zt6B+wL#2674mVA5#iXU&Y4&{ml?}-4XJhX4+3M<$6`5E+l6#Y0d3rd#SI_TxDFrg3 z?z#uj%bn)}QQ0h)#2WYtSW~x~dhPG^zz5Dy>V#8MdM&wZkHazf*VzGs!$Y=ZJr?2W z*!IN;5W*&60`nsy^m1=pTo5fEMUtFCLjqBl)n4%M@!iwQTTdl{Cx&TA)}#yp^=~M6 zwU&hWsK*XMrjS2oY-D6PbtYl0uzQY63YfH_f*xg;eD7YG{DaOKsT-ti)eQeg>mMNF-iQu7DThB;*BLoD&Ksm=_ErMFBy7_24X5@3J+PC2l^i zjzP}vHNIsYASS2BF@a5bs%U9xUYgKnF`)|b^MFkP`noQq|6=-HR@Totr|IpZ2P7ob z+Pi@2xgRlAFb+bVZ>=VQYF!`b(NR|d)s=NA2EAjbYtW5515$1fx!J)_HfU|4) zzy~VFX65F&us?ekm(`SKKjx+v9rj911~PC8tGwNwKeJeERMVYZKX8qp6qP|dB(v%t z2d8x@CV&&#tbq(To;le@j|>i;wI|uw%+{_B&EkvKUcT3en-&(rqjW9KpLSc_stClz zZP>3d`Pd8?hg0|KZj~b4x)OuSxZ;}|HHDN5Kx@%Qh?H*Qrul#*VT+1ypbkJ6P#RI$ zF7v|23;s#Kaa}`PZf{eNu(J|KdfJ|Py1P$xKVa!5jW?^9D%#xz(dn>FLNQzK zdVnh=t0&-d(L1@avSI}7iC1O4FIhe7FB?t`q8#;U2$avzdtt8;=lnl4zA-#~+C4Hn z>?kywI^d%^x#V1@=WRq2j7rwOe2{#;pe<`M;Z^jWm!b^a7yIuzm>~k8h9!;c%Yp)Q z(dK4)?K0o)*+Iz2ac1LUgc%3*r^XCUrT?2E}c*P|woqH%b*1~A==IAagsp#h8Ykm?U$ zWiGoZZ1!6XsGHNY*`ZgL;e1&q=IYbFL72R}t#(mw;@y;?pwR zT}(iIlRhnY`jHPHs=I1BDm^Q*v|nm8pwd1hkkG$)G@Z5MzE|%=)L8(PONwGQ8-RYCbRZ=pA_Asx&ACo%dWxPSTN|7n1y~fdB5h^OH=|SI zx@x3Wf|bF)F(d%hfS8#R9qN#7bhx(cC4?|C(>0fRTdi)5v1Ems?QNVLD0-6^K{QZ5 z+aQn4q6VY77Vzm(H^cyEwjf`4zuyC(-ztZWaV2KY-0!O!L(8I~L^@e+%^%Ot-EcKE zHRnBUl|t$7ti{#oiVItr1+b#@@{_FE^bR-k?_eVnhZ?x<0=l}f60sn*$A^OgP=DhB(=U8+Bta2z7 ztsqvEa0fY1QaFc40R&*2B|ifK;U^WIZ(<&;xMCM!SlDZ@a{i)!a4TbU*SCa(uU`}5 zQW*oVFtUr-bM+1{J-s73vYdS(#so-D#SdUn!3>}$0VgACsXR64n2Ex?{sjOAmfVom zNCt>$#S{RzZ6Q5R<6?k*(BE$j9%xoF)z@D*g|`Dcl7)E>1i&HfQfTB7$sxoayU_#M z+jBY}Z@g6d_Jtr}`O##0Ny(Eaf=^613RHfA(0^<8#g>nAa}6P5V+y%|wWFgesrR%4 zu}@G~4CwQl8hHEW%UIlcwxwYN_&fz|dtYzg`K30s2q6}6HA zX^}kpP>=f- zReRf4m56z-_cf4k0xG2av^*A~=zcaB*{wKPbe!J7g2@jorZs#kARwUO=4QD=aZLN? z14&Cy{Z=%J@nigIkm^8#PqSmeDFpL6MX? zU6%_6`IFtvn-_7ArPw~>>3TB*1?PTHjaK6fuPr4j?=#lp6tB8*&gxhOUK%i*V2^+} zHm%wm`&EGR+v~aMz*;mw=pp?s#U1aw>T31ek;?K)DiPN+1?V>5G+c&9-q0I7mUG{3 zs;j6_3m~|2=R896;`6|sS}7)^*Hg0s5LxQV=FRsV(vFUfkZsccGi=$N)h)d_q*|oj z0PJF6A>5|nBz&I9YF_o7(%0KwKr-4Mp=BujF&$(v;Ina0FDtVE5xWzCl<6v~!aU}* zI4N}7#&+!>S-}^fS7jL`n}ds4Ks4`UsX9G|LhR)8#{{CHNMcEZQxv{mvIY!p-+S=_ z83HWxwEI!owtN8Sq~)Dmjao-DP0gu|>#q#HXU?}3zX2f&at}bvWxu};GkWI~BxhsO z;ZX_I-iB4h+=67fqA~N;Uj?D_zr3y9MCo)yGvjdTy37b#BI{{#bgzIWk-7Zwj%zh}C3>*+KQIIEXZEXb- zJa_<&;ll72qr?Lklr8`nD*%B#`4c-xg1f=Zq?yR_HE#$j%5N5b-L%xyr*eLkmEjxo z3{M8fR!6t*fhrxRsx4WOS3nm3#EcR)o~=S7ivec#)YY@F&@$}lj%DdJHt72f$asK8 z0BWhMthk4VH)%C~8A1ig!RJm#`ORj;R>?*4hTSJ*H00I1o8x&xmA+q>;ZwFJT;J|i z#206qWQ(2#&pzCwFD|lb82M1axI0zDCMb9w9kHh%w-|aqfhtpvNqPT3`u;<4N~Ca; z7q**nzKj}$JBGWy%pU{0nE}^ur+^gzP%OGTsQt>VorDrIb+?)ys^QZ=*9MYYN@_KM zX9@-305dZ?s6}1r#StiS2WSDf0J#?e5ZcPWSm=d@C%rv*F)RC0TRL$olzeiJ7kt zO&k9D9b1ND8ldFCUP~=MMoj1_fK`6a_mE>umqhaITM+bmfZYEBtYk3uITuP0+E4#@ zZ!GmdpDwy!nNgbTmSqAyb^A!p&-WST^QfyuTlHKDH~34CFrhM%0&qy=<0rhlCr4=> zITeMX7_w-zj4~XJ+)HATU${7a(t_1!*|}U}55LI495*pB;^*b}Dc5kW(SF7K66-z| zI(gErX@zDGsEq{S!ims7*czw_xVyP=N^e1wqsDy|knnSEi0jVw`y**;?0Uu(n*3tF zZv5_TgMf-|@%0wX)wTbg^m34nt$eT*&rFsERedoAq;km35MYzZhdq^!;agbIMl&Dvwn8#J$Y zxM>FbaGQB+@*~+K(8a3DVutYo4Wkluq#>}Jd_x!TSPq#S1a!#Ru?d}Y>#s)W>gsA> zYexQK97q`w@Eq)%lj?c`LI%)RN71CZlnxTly;I-dhO2RajRZ-34p{0y3Neyt{v>{k zM7N%Fa>E?n=TSqZz5U%wI0E|4f`BvBIg$YJ8KB3PuM@w3rj*bP47P1;Q3+QTYF4zY zI@itmQ%5iz=Beg$CCWeCe8>{VvAwY&N24Nv(jW|D~P(~})b%DVxL#dNCFu-5varN7@U$T*RKXU-Uua&FfO=ZJuK3;~`J~JOCz+Q;iZppc+A^=ibx|w7x?z zM>34eC}h#YpTz8stA|WqLZP@XQ7-x+GU?zBF0c|g*9W}-DvoAEngQpEEP#U(c&oAL z{sG4jT1L>u|N8s^psoMF%g5#*wmkAYx9XdGqELz)Tmtg0>k)zDc|DtX2bWYL+tFS3 zy1_gu%yeo&%42B1?`Xa=EqA0$*82-Q+JLWt1okiC%*M=N?RjHS%$&JhlAVjb@^MWa zNG-KqP+3}j{IrZ=V$TXU&a@^a8(djVBw6xa>w zYhZ!1w6A$NxqnykeH^!BouJFhfge=;^6z=RC-n)s!`O%^V^-6r79m^1rWK4Sb2|tp z_j;EWx}O%{2>QFEKN#FS6i!Z)L2_d+F;df%6(lne5|KK)G_G$ID+`n8=L~KaKKVfr z0==y-T>XC2P&21*|G2n65fNIpeO*g2kAs0ZhKHGOpO6T5WH{ea?g8AY7#$7GJSeMF zdis$+`_Qsg+|{gk2Wl@ddEwB9uGb2>+#3y>2$wvn@a{YYATydRspaLX{Tx3SfR8C5 z(vxzlp@BCs;iUza@J(bOqukl@oQBs{(%x#&{np-nE*zz1Vk|nWbgNUGD+gEieQ0Q! z=WUuNCTehbb;siyxerggiNMs(>U+V_c^_TmGhX09Q!_BS<_#1zSpyP!L`}gV_wtdN zj~W+xsbr7rX>t*efAB6iY=Z1Yvk){=cW{L(}eH09{ z^aS|ww3n#xx{5g_>IrhDgLufjWX5;H!zV`Z&=ZF0QyEPrF3mRInPX;#0|@}X=yCvs zQ!O-&(6ah&3=N<1%agQ_>!cw6sV00^Uj`RLTX!!7y~ncxO&PNS-Bv9Hen~`lL`aAW zp7#`lTWIkncS0~{C)D%rSLe^AF5`8WS7a##wU*RYtyfPeL%4N(_AvRT3Bg6bIelDo zcPYAJWb0EVrp=$3{GLV$4m?*(Q_Wgvf`ua`jRryqHj@%pYnFxx6&l0~BbAgxy;*?9$#9bqwg}3-i zFQ4}Z_zuu#jHZBMA`3^lWFTW{6b~hV*N`qm@Qf(ye(BdSJk$h+HT^FTTbn#^ct zpVKYTYgUniZjm9Ar6x=O;U?BVl>l2M_3PW(qT=d{Aj6sMiohnD3F%16O-@) zPxFHB#K_F}MXAL?RQ09RJ05p`9jyCzt26Oa)2jHnw)vq7 zZ6!__pb+31Vnc?^D%@oc-Lsy&!=f`3q&&s+-)(MAifZ)upvaFy*Yf_!1!t0%oa6^T zi}ZHx(S?^qJY>-xDY8;@^P`k#zUn{`gGB?OMfF3OkO*T1V&yMtCTBLuUnewgX?+#U zikT$>%`GF2zo{WuTB~Tp2^3M5adv8Wh=X@>l9G7X>9Fp@=rU(gtapwZzkL|9M=9~U zpr26k^SE$h>Y*qa89U`Ew82_~XdEkLDB)XFY4f%j8Cf-}v_N-Rxh9O>t&kwIaqq1F zC0m;7C+nU?-+>9S)krO?kb=q=Uj577U4pB^m;_)A^co?gvUVsTF1a!i`6?h2+A?4U_PG{+-6|a6s%puZ zPx*Vnn2ZDsIdg~~+y?jQ7HRWL%)6{PUyE;*ua&ml&YHd=l?2C?dC!L3HWnic?GL9u zW)^Rqs2VAzz-@T=VYEHXy*rAA>z;@0W4AW8`)m6X#;t) zB@s2%pXx1Q%}8dkpTm-8(!i^kRSW%O7-EzAuRMkX5LDz~i=L!C$C%ningglI$ z;RGdx{W(@-TnVgk4=t^#&#>QFK-IKd2Ao*f3bbVW_7{Tp&<~NkCBLfH4QU7YuPS6h zX&m)vB4rpetJYm#ZOOO~HkD_@LDtBDO7M;Rh!Q_BVqRjneKHP~$<0R-Hf-FjqT7g@ znD6B-vn!m4~+;ahqnv7WE7>@L@C523S+22)q{92fO$Ra*^IU)>$ny%>cN zT{kx&XxHl6Vc8ZY#XGmGd=XsvsIjqUZ;$fmUAg8+(6WbOkA0^(OWEU2y%^AfS)bhSj)dI*QNsma7!3(YJo^E$@FE1JacSR;aRkF}ieSL|V!FM>vfvr(` z_PRfByy$qk%_FX_*PoTSFg+#-Rl_sqaW5QSxmO<4`bJ>K#u{ulzIk5PZd}FDm3TXO zK>Z!_o_s`NGK2lPPrGq3*(F^+h2Q3*o>JDJ0GZq&({iDtu4FDA*O5I7Qb};&owr_G zS4_rO;>s^Qyr4jW#b1hXQgoBkvnLG%lgtsD6(ku$ z389;F@AHM8hPKCmB^*u3653AeKSURxnl%)LAdecI9y_t#tsf{VxC$H?nHh1YuiJ*{ z4?b9yLgQpGwvMyK*QVafzTf0H%ugp45ubeYMQo7A~9{hwhrNIYy&kbqF^#FfBnyEgx#g zDMScLzZ*`KY+p_eFN-|$rjPAN$O6*<@7#Z$0*qv~A%~diF*wwJt62VohCr|@hU#y7p>C=j>#N^V^OynnydDbAQjEwsO&&Z;pRQNmXJGag7US3Pm zQ-;4A(lhP!YF)1};4?{N6Xf&I_~`UrZyY}Yu{$WpfdslXP`&w@Fs#+h*3*S9Ss` zpw|R==O3GIJnp6La&z7@wuxH+ybrZdVV7n9y&gLM=J$Li+m6_}Hf8p3Pv(u&OCi=^ zw~SvC>sDhR(NV7FBMLYe`JqOf(f#4=LJSx^fn(R=S5Rq?So*PIdKtgu^NMk7uKt)i55+A_rIltD5M%};Ei>4gR!Hr*$T zZOX3v=n+1=dvo@6MeZ0BgoLDw>LDw?Rt|W=6Rrd#IX9f|jS5h*3=db~(1FY3d68G5 z2;!Qq1P~2O!1$M)Tq{@VbbufF)bu3$syaADB$0dP@&9R|^I={I7Fi*$c08CV6G~wq zKE$Ep=e@}THm^cRg>xZpRUbMs5cA%OjiUnKb59*TgiB;D;v{8L`0@^{nH|Iww7bo= zM8Rqu@xu6EUTK1@KFIg}?tqfD8?uoMgakQGWL?u(=@}!fAE;rlBk{_tFcVLIv+8?(CZN9^?=N6Up_0 z4aFCDr}~nHf@EJW+C2?j{m5|KKHWMz62`;8*k$6Z9ca4CWdK5f59ulK&fDE+Id`_x z37WZr!W!qh%2VmVBH%`^Kqn~9oE=6M-XMQ`_RdFk7@ZuP z*;k_}T@f5SHx@2==l%UrbNRmjTeI*9Tn^tH$4{YuyaG2yxDjwk91K>OmN0P3wxs#^MuWrONOb8}OM)_9w>!u7Fiu~6x zRS}-iJZEC1hkzfl>x9=@R>UTTngO?{*AXbazs_r*(8cAz_iXF8!Z`Xl4%r2XNg9vH zY$@(O5h{Fvbm#g%be&uZfo4+yp^_GOGhU5h4qEn)*VAQRoxdE`o7^#m^s89o>dQl| z`gf&(UxjCa$N;~@1&CCjp%@qS?#KqsOrX61UQgbm9c1@#$MDb+hK}9q+MdlX!?K)d zw}36&ead~Qyr-09lJ^`g@sAgz5^(H z@ehmj_sOI*+rt9_uEN9l$MB?ifofr00ZuXU{migtYeh|wjfRJK=cC~-KvyIj%^nH^ zFk)p@oJWN6 z2vk>ij7lltHKuPMQgrqZr<7^_+iIu=ujEQ;#uo7AUm1yX(4qewqYlU}*B8ujGI86-B%4xAogI>xMyIwUQyRb<~nR z^EJRI05`YoyAPdQKLAN2hmJ2Wdj&MZnhpE00!8|ZT3vK51o7VdmNpLt3oz@+tYv?R zCRD2VxdxtsnrTyS_K^8&A=u>J_RjX@LXkt-GOe-_6oPpC26}v&3}D`UFI&oNtiKs3 zW$JcAvmDM8j(XtF$Yvpn@t^A#x!Y@GFR&4xOr)KdoBde)^nTlnv^jRyJllC4FDUG@ z7~gOlAtdEg>3T$o7a*A$9Gc=^5zv*KF~W#*uMK_em+ecO(>rKI!J%Oh{~Ezccc(UV z*-sz+so6iH?Y8B-jx`VBG+2bY?CWIM1J@z(%n@llKdn9v0a$P^nwZA#!@Kyw>r23hS?s(euX8c(Aho{$* zY2I#g^{jy0Tk242xJq=gSYH380Z5l_5MTey-fxaQ^8hUWvbku*ohzT4eL>_mf7iQd z%%5N0eoIaU^oz<9a4M0o&#j)I4SLS+GLO`=2)*-yDP?&s@EDxGk72jKmIejB5+Y|y zsfym0dpDlC><{Q{^*|2DaoPH9Wi_)RU>tPql;;LgZ?%fj?(7B)>7TVv+%81i*n(C6 z8>nAS20#u--=D8Q&m7DLk$d^D!gt%1s)d&m^Yv~EDF&dD@trWGKA&8v7QfX`&mE%a zCF8<&E(Rv1>%QBwXhqSQ?TU$cap#>KUkfGpXJ3u1Y5||i%6lGSx7BSQRE6WnfP>B$ zrU_^ShwQi}S0v%VlIDF8sVIK^`SBf1EnzRQMnKMSr^-AQ-qFz51QepzQ#Cc_^>!+% zS+8q$x_l}E&a%yu+MON8d|qYHA$-9007?U}GkI(JY<@$3ITV?!jCB1}pyv~Yz;uK{O<$ct)pf-O*Q5JWhEhDb&|j8&SJAR$Tz zO!dJRFn+`;>QH@hfP~X?!cY6dcd3EQaJESk@$iiDd418ny851mN@FH zBtflQk^e)_|`)@iAUYB|1H7Z?SSXP|BiNS2CUt+)Uut zU-mC%&_xh@i%{6z&856Tutp{%{BoEWpN-gkS-( zSf!PqpSEgTc?`A#QI@GOF)Q`;^}%;{cXlYr$UqUhgihqPk@%G!2$+w#Lge3Y5|fjM z&O9;2VWJQ1B@7;yhJ`;2Z`uI~2&jIYCwpAI$Z7&sfV*gG6UGRu`J+uGwhd?=K%}#V zm{kaQUcC_DTzDh=2!eR>23KKdS1gs`Q_45ggzq1ckZWZU=t&?0$qWP*$f<+U2NYaQ zeO>Le!7oa_W1JOH1YY5w80SX} zJWpt$F$A$ZrcOdgCOuN48Ec@Hya0w#J{>$%_F4#qlcH^@BLT#9h>*`ges8(MH7)~W z!LKc-Vf}Ljd1p8)3gqeFe{#;y4TlGUipE5h+Wjio<>FF+35=`mtBz zQ$MU;`91Qgzh1~>4uQDSFLvoFBJ?aGJWX&f(FKWrT|WZz@XwDg)1QB5QT;EMTWXmg zkabgQYr;2(#}MuM4<#|F3dK#NpwJg9NQz}Y5HhODnDT`93;4Lf;4Ack10}um!8U`E zgQWx-XG<#7dCp^=g}u%);!Wjl4a8OoJ2JK36P{t?y-X2dIGp%R+^3Z8yfl9H;%D8S zrKx;r8T#mtxw+`ui?(91n?H*6uJ-QO>2pI+hBuMzF9?N1A^QVzs8l7|r+0 z81-1{i)kFhJg}>2Ub1S|}JzO=q6W#*A+FM z4!0ZjMkTAGZmBaHR#fp8!Z#~pT~8;yD%>@}JNf^mZX=Y&X+%+nM}bYE3$ zWE~?YZc{MBQPXuZd##EM+7*v%mujmnDvK`=5Fsb$LXEPYItW(CsCs89IXTh2 zuzO?T@1zW*qzpcK@S=(l1qZmm=TxI}Gvgti!MdmtM!Y)=zfjdbqL^k zXap9hQ zC4NSX^Umw>^FT?uC+ZB4#z;x&NB8NZ@BMvaF7k~^b>NMD|A-_xvo0q%g!1VibQG5l zFxvn8q=F9p*T)5HaCxIe%gEQ)_PVwIDGEAzKDuu=c=FqJ{JPEmNtz!Oc%VXT?JTwa zoMtwX8^1$C9ng40q6LT+b!{I^RQVs1x9shu0WmCKYxK2EUGXDd_M&!7WMxCQZ$Eh#rd z&EcB;`THSek3orFy?PAY%Yn%*$^sE9PV@wnuYx})$Gnp4X6P4~u4Imt{_*(HeRphH zb>#i@tZ|SniJDd|do4jqlJl#b<*cCxNwkpb?qalf&nFx8^^S9#D73UO-)6n=f?hC} z|MpK|$b9<&jU0;v%=tbR+XG*rg?jA%nyU7wWUuwrdK*07Th?_aeK)T68IX^yHSkYH zY_Ln#-#Z5Ck9_sPboqWW0N9Somb`8?O)`@T{o~q)d5j(~nqM3cChKbyJ-@-{doXl} zYtTOvBM{^ez0pmhh6ViS)&Ffe{tvVC|8sd%vChCBet-B@(rf3aqazOa-Sfr4j_;vl66JO*Q{GGYn8M=8B}`6OGrW)o#F{a`D&x0{juyWA9m5`%+KuobX62g>NZ+^+l? zJXNs~^rrc^npgXb*t7}R#F3plaNeggfvuYi)#n%l^2dabg*!mhM<3#mL-Io3p-S9I zw!rxH7|eGbTiiQ{Sj+&aLK=0au|q8rDw*P!@wgnY%~tJt#&e(B!9Qo&d1o4ikd{Ry zwTYkY?HIE}8fM3YP4+`j(2NInfR6A4YI;A`=lp7-;buQe{JcwSmI!4_&Ov2)4mL68 zfPfam*51rI9Ly{$iXc{tJuio3Y0?ss$3;ogtu3c34~#fq2Vsc$q?f;)2HG5s34L)v zi=X1Y*A{NO1|yX zNT&97#<^RQw2SuEh^sbptU(?tEexHc z)#?c4ta<*nHGb}(@g_hmR3f(FU_Z;o{m6z!$Wt33ZN4|SxQzVu=*#^)88N-H>)Xpn ze6KSbC&k}H$Al8E!Q=9p=3(ehfhzSacg ztow(`_1`X{l2A3irj5otrBA>V+~F$dBlVI;QA@ar*hva1HJ z;G~XUB3Bz==yN?tDh|$w1`ez>($}c3Hs&`|CHp|zb<^V^N{MOi*sQ@|eLArw z^<7`aHx_!3_=S3) zz8^SE5)on-)w@qdKiM?gZ{mp%T?=yQABIBa4*K+(8_s1QBWGFhP4>S)|H7$Gm)9-O zJ|!e1@9xnIi-wq=An;$yD{QCUSy05pKix`|ya!r02YRNIC=ObONihi7`g3*`v-uBZuryoDa@SnTcq3#30o{;kgdgc@Qj$ICzKybiB5$(VmPp(_~Ovz^+OX+JrG zEADpMMI)Bu@dzs~Y3~n(;$z1F$+A8zewUNuKd&}ZJ2Tz!X}m5v6!Gra3TqbdxMO3& z(3MbN=rHtOQPp=aAqlI8`5Y6Xcj(pQ%2|JSkc50`Gf1C#@cKUfT$J#kdij*891 zbUnw7*+QztwMS#cUzq&8UC~)ATjRoNbMZiA|69 zB{?QES}P_zCfpAaI+H{5UHB~hsL(3;W1`XFkME^9acdMd>uB=7GF1zA2Sx9wyfiyL zXfK6{J85wfU|7o!VfYB(OoVPGm~QolK+F0*&pgQ6eL^PvMQGzrAc2;%C0u*@ zy9Wu@S5wyNG}3a2gUz&SIJCGy5uxSOSF{#@_d#^QXh%Q+_5(#Ig~jz7#8sVc1?3yQ?;UkVQD6&P%NN8$>7;gf_ype z_e%I5=Z!Y0T9W_?^~Q$WT!*k-4SkJl;sbRa>JaC09zC~{2TbAA6QcBIG%#tejK2f# z1XkNk6Po~}iCD*?ZtgI@@i$AmJJ|Ho8_w^2{sk#1_s`~G;vNW4LgqMtYCYpV-G_j! zQO}n74h%s@Ioz=e$lQZ3UU2wbw1M@SuoTv~fALl&YgeNQ#xJ_xZY|bAty{Z#3ags4 z3qfAgvYz*#xW#XQ9uuAbMXZ|@pXYK+n5Tm5+Wp;&&3G55BloP`*^{4jKq)nhjn4c| zB&DfdH`%i`GaDDhJtKkzhz~-WgpUbtBsl!se|`g z(j1FSK#H+o0XBos^xXg_MF5T-4Sgnf6yLKB;tEe@NBk(_%9nyoA5#X)(ATb`(%=M2 zz3Gm!8t65IevjJSY`XWvh=(w|W4XUnuaneq0INZgV-XEJlNc6&51#3b)D0KB6_sLD zdu`h6z{=;T8c4lSudlZ~kqi0V=1{fZYHixmIeE^6d6 zgenTn8?E>5^%WLQS}Gv4mC#g1HkDYNuM7D_PqI3Wc2Lu0*kN0T(4u-v&kt`9(n@H7 z9~R|r7k~mCi=eq~4mRj;QpEI@;8^4ak4A+BqzS-&>mXoTz(9}U7ZsrT{txcnI;^U$ zdmG(|N{N&RlF}g|-Jpab-Jo=L2-2y7NC?sm0s?}BbcfQpMY_AY+0;IBZ+xEj{hjao z&UOAg*IC=k#e%ihnsbbM-s2u~&b215?Ut=;-To45L4gy7zz$K+2LE)K^MQQj3_hk) z3=xk5AVfXKCDRXsysr!99caA<$Sdte>y#lw>2bT(a_nzOGU9ek$`WHXps_C#OXW5%E$ASgDymcu_6yq#w#j!jS`cSo(+pM?IH?cd}0Py$fI_Q`a* z&ean<2Sp|VtM~}@8y_;_(0kCUp0neH;yos3_=56;fXV-J>C~?=t;iEYifX3zUu$)G*a9U5O zd+vVy75P5BLcLXby~WEYv^>LCB2g#QI8~-b|Fx&biT{MKXXhlE$|EY;Ov>j!gKnz5 zV4{mYmNC-_D!<|I{I7wRL7CgoLrtoS(8(;nO3sp59UvDo5~+jPEz0BAh1Ly#WzV-5pB#97ZG`5$vA zVFO2w))IgFfB`_m`S0PzB#-YpHsgh#H z%O`$Jj4&n6OA7XjC&or%t$y0spe!dGvta_@&bD`|Ol3eBDN#Qx+yuCtBYW<^_KNGw z?WRsrt$ik5Oiu?h3Mzo1$xR(_(T=}$4LL|?4HcziZ+PriD)-IsnFa=N&$Y8VuMhnY z7729Ro@9J*DSAU)3Dh6>PA&_;n)8PGmpJqmbYi5{!cFcpp(EgoK+4}Q$M+x)pUl2S zG}HK6TN(&UZ~#aTS@0mSE#fFmH?Lh^sMRf1XcBdzc#Y)g5aHRdgd;hySHd0u9w%~d zazLJ$T#7Eka$G!!a5;cnjCDuyH8#u(<8Yr{V_s4V}cqz^86Z`c8gnckcP z=;->Vo)~dm4+KIXQ3*=Tq51fa6EJuXru}<}E{t$FeHScEP5cE_&?U)6A=e;BRVK@W-}lot-^yg0+Y!<+T56`^PC%}YT@2zaJ&EV*lb^&9+F0$Qv3z?%3vgZAE7ma z#(~kkXeVkRle!**T(0>(#S)6^@-TYodV*K)0mU%x#rCA$uaBT;$`seM@f}8#A9P8K zI`laGLy#u*HA#9t`1km4ae}beGzrdyZnI5~y|+i$&y`~qvtDx6Xm%cyn(l9@r8sY! z-9*qXSBXrM++PYZM;<=>jYL3?k7K>kL7@)8Ip^)kByGl?Tyvvvqb6*Rpr#f-&qMsT zK`5EmKz1#E^)HEgQlM_ft2Vb#v_IhiO~%Lr<0g`zah5KgV?Ij@_tTcaNRPg{CeT&7 zcbtDQ6^aZ7&oPy+R*j4r+x)auFlhiqY+O?Wf=NKDk0!pRS)8mcz9Us}X(M=>pR5d1 z7UD)lz)Q%Y0YwOkHh?G^cVs9E@ms6-|1C6;Y(x*-tlQwj3a$5%pQdzg;>qf&wB^o9 z?evU5n@n;o>HmCb&C@fJ-Fn%fp9OPHL^_&b%U04aNV%3TM|WS zAYN#dQC~;G&3NhF=||Jo{1OBV$$i6)5tsP$O@MF;-F(Bc4 zd=uFFzdKCJUiZ;FKJ&b(qbmMCNzoYi{I8I*pvf{hyhN{}cSdT6p6iy^q;-go@&M)F zH4fmF_aQ?N=7ok&5N6{bh|&Ylp(}xqch}o229l)6o*QPD&EW6#Zun6laqO^;{lrwJ7+?|92HB-_=O=>qO{TYMiM>VtZLjnMd2vAQ zEpuI)*9MV^(yvT6$m%*gV&A{&D6&!isTu9G@hl1fdKh8hqtjp{UtD0u5ng+&Fu`UQ)@ZiPaCbUu-y4&L9Cp{0Jm-r4qZL86pAvtCrgXh)P%Vo9K4}h1>CzL=ckO^}kY!kfU$e zLjth%eLtkU^58$QRTJ;~Al}m&S=R{4-A8Sx1ujgBQ+*ij?B02xUfh8==f(?huE20tAWvKMHMRN<)w(SEZ$Z2(EuqG(;2?@dz?#@w5I< zvwss2$pKktCA$4sw(tJuYw1k$Kp83b08pN^g|K5AWFe)1(h`*I{*v`@OG79~TU4B| z0t7(DpnRw5=|5?JG=~8<0xTMi({$EGzHNW;XpE$T;>y2L@0|ECDKd&J>EvsyeEoPy zhD!7zh6qyvnKd{B=utaxI79$&-9t4)>U%2l=Px#apnRUnm8b%3(QEM&T1GO`Y?!b) zi046TbhuBD_=-*x37_?P$5E_r+*DqD&P$?(IK2i7+c{K^`XR?G38<0LRKRT(WUACV zNoV~`EZomiCGmfV2q$1}ffb~=h(H^xN6kosywtNMH^gndX^p{? zo(RhO58jca2@Y={6NW&Q$w8barvK&x;_N6*=*SYwRlOvp;WK?dcAam6)^fxNM4Qdo zcLd)c8oR{;*|YeQxz^AIauioJnArbFJTtrC{kjNeq4OgQPanzgm}WLO8IJQ`$>$yV z75Mx985#p#WLN>xT6KPt(Ar2JK+Nh2TMzqM`w=1uK^s6L7^M{9@HYvy2CPBeNA9QEHa|;#S!AKX5)^t9MeDYuNtTpj&(#r;1T2(3Ot~NP%a?8 z8tsEJz+HDZ+7~Z^WGp#{^|e0TknwZCn!V+W(^3|DzGJ z%yuTe)gmPzGq884AF%h+2Pg~w*t>Ui2M>`qBhoCVwL+w@gZ_77>2Q}u`t`Bg4Uo9t zSfitS0cx9G?=7)IAi#HVAdf#t>4CH(M%E(`5t5O;E_w;XRa*3etRN&K+vI#q5Q_12 zqwe!vX4A&vAd-DLtq3GC-SYN?g&g2CMv(8Y-~ob$C9a^1n0aC#A{&GIHR5&6c1C%G zqK)^jx{4gsf9fxez2nRTj2DTfW9+@_J>3b}PEZ3J-HqCYY{49^Kl-a}iHZ?Ae#K#- zE|@btHAo}~h40>m1g?<=hMK7!f}#lqWFLM**!6nbMToB_;nj+T`llaR5WOWM(aeqN z^JKS&1z;r0Z5V@Haus4%M6GU z+4qR>8$p%=xj?oj{;mvF+=h^c&IyZ>$k8+$baz8uNIq3Nxvh949~!!zdaLe_>)|P4 zyyN~ib8ww!pc@u+s`G(9Vl1Tc7$AshKW?nD+lW=-U#ttt^TJ}EuLL4~)h((1S|#cTa<8|0&sR^mj!sC#B(E zR4SZg*#&lv^;(>XhzkSm*2c$T}A2HRY7lh8fXxrjB5VeIg7W0d z{y5UpV7h}r*N0%(>f;n~Dd~JRyr95FK$yIb$TZ!g$MN<}Fpvq+LClqU`-Mb>dFZR> zeJqTC&0!a?04inFSm^c`1jQ^sO*JIA-5I*z#XR;U5?dVI`i<72Q%w%)O--kg!EvQQ zk&vax*jGbpxZY%L7vz;JOBHL&}vYiw5HD{Pya(9Bn_Vl2v^ec(@mSm4Tz z7TDG>6yK~ZkjNfzv;y-T{F;hchWfSS+Sd0|Hn(y!aE%P8Iip6rA3>UC04NMzzoCM7 zv65A2x+XN9>zGv*;YWM}gM>dbR9KfAjoy6waNE;4uD>$%mKOuQ%ErWjbIrL=njT5K>`UTm8Ff5Tfb49%NX1G?%z6pCqG(CoQHcgwWak3%g|tkC;k(^eA|Og zp(qVLqItaIFDPJ~2-2i7x&WEg52~@cxuQ&-Qj-I@DM9;+eI;gDHR$WdpAqW&Z>?dtVv;7sArWDK1tcN>F0L{F7;1DCURu zM8R7wahR3$oyYRr`GP9oWq+FX$uB2fxtZuMsM$#=9!!>r3`{E}!<|`~>?U}~F>>LP zXyJDIE;sw-+ufE zUpf7ji}|`~j8f3;goOS11QdQF!*YYGY})}%+a6J0W)7aR4AS2zy#XUSLZUI)A|<}Z zB6>-hOEYfIN;N2@z)Fj%6KUEwUESglA%XUqfmD#^b zM&q#DsvBzfy|>b(!r^(4C%*npkws2&@WZhXk6*_USYj(%&ym+my$o(sSt?TvaoRVW`q~P-szn)U+Y;yd9Km!OD;G4gXbW2;#neo z1@8Qz)}n;|4nMEgRom~qxsJWL)i!ll-?BJdvL$jp_=rnFHNsq>B>;B^Hd0FYFrrhN z&a>Zkd0EoZBr)#o6U4loCeGI|Qa?&{;R%|U$ab8GUfbhiS%2K)wk>M>2=De4pO^Qy z&jey@LNBKR7j`_&S9crcdtJw^`NpjIVhS6l*2M_VcRh{LE~{SEA5*W;8dG}PFQ!As zrZ%?7<61>w4XZ1nOe`m4KE50NSq+uh*^kYuks==Q~0T!s{ag6G2^ptHK@pi zzLdBG?^8J*vg&=cF&dJgrAD4I+)pIMZ&Wm4QZ(^3qxiR~*yn+${WnGBa0VhCnvLIB zjvjvmomB2)mB9VU$RjUvqx&>!EyKa?L9YJg zL@FhP)#z_!X@A+d&#!n~(ZUI6`q|-Mt9_|UUOS88v5H)H4QL6zad>$4UgE_Hil>KJ z2HyFeai_X`mZYSJFZ1+(#;OgI@DJC`dNHoqi<7tY#^N8%72Dbe(!cZdp;HxV@fioS zsMhbn2C5vJdkTbd5~H#@dotpR35X^yQT<2}L~K)cg6W6D3ghJz5M@>*SJ&MbJQi^| z&)bcfAqu$IEDE5eHir!xt>b+v~#P_V$Htou8Vtad1NMGPIR{J@8 z_0e~tM3!@T75TZGQa)6^WRsDsWqK{=*ia=hbJY&2x^`b-(Mb$hp=c zseUs2bpFWon?uXC76A!Aoxjpv3$>yR#)^VfgjV_U_=D;^A0a=?*w?kqf?&F_o7tMe zyiQTAp|DA=t5?N&i^bydRzl^~;BG*8C!r~K25(UxIe9QTl?Go-vR7y9Sccc`oVwz1 zYN_2tZzk5H-f=A&3ENgewWYR)uJ)WZJGa6T3zeiqPlNHuVUx*XaVD6e^p>mmZP4!e za)220ag^y2iq%^XiDN$j#o?p&>X2Zud$BWf`0(p^o$fJ3+!v9uTLE-`I%^vPTD*({w()m_ZT5;onAhB@1=fS zsEcP06#BCJ(T%xe>5hM>@@Rkbp$mQ%E@lDyWz1^dXuXPha>7KHDi9%UPIS8Ey$})Z zRl3ky89M2^Fe*uZxX_GUxt)4noQyIEc-pqnZKETH0^o@ls^xn*b$rV;EdWVp1{7uZmVfv+b+mM_v2C;+s<6CLzTJv?ZN~9ptnQ($~ zL3Hj_JDrf%tUw;dN8`@Nh+XcVG@NXG3i?)?bJ`RrdVmApk;M}8l#t0v%u6(=d&c8gwg>kTYzTbf(y(&a~_msUpJd{Z@d_DJ-& z|D@);zS?V#5)S+Bd)9!qBDw*+WS-My?~i0D=VrM~&Eu2}E{y$ULeCwe{U(s_fx1jk z!n=Fob;ooBCptWP=|ySv2W^RJ%IF-Am##i5QD*>1p%TntR^qOa2Uq*}%o_E}vVbP= zQ^T2kFGkFJ=6T)*-Rv_b=7Haz>%PtW0-4VhE!UbA-Oe_=9%$5fw{FbtPG9i9$p2bt{Q4yjJ^W%l^MI+|<)4fI^^GkcFN-!*`JM}_9 z$XGsfBlRXOZ9p9lXIW@_!Y>li2v|Ny1yDE>?_w*$3}=oPrOSSON=K>Ew6FL78VC6? zk4!|k9$4E*p3ufhW#{DYDW}_j%;-k;=gJRgUv<&MJcc_yckBh@X;}`u{9b6EBAkMq zLL3%rBbtJ-E2n#e9|@Av;04gPapPfJ`EBSo3!U<^_0%qa1ezQMNs+^RKQY1($KBA- zw$0(YTw+hO738~m%9P0TZyv^XYBPMu?EJQFk(a|)VD6aSzoryXU~X^=K?{hY;ohlW zEqySSh8OV-JwT1NB6Mbfg9$ueQTo8}k%9>7GtkiA4p5URYe=^m{qc_r&&ufOL$Cen zNdfUMSbU?PfYWMZD0B}$=p+8G4sS9hwHH123Ur>1clkNrLB9v4+iRhN{&G-NqFYq3 zXfa3#)BUfE4)&6ekWNBY<$DRq+wPFZ_dz0<90EGb|7PC8KY?_(-kJzNN6r5qe%*wg zn?03OdGXAtTOB-efUJ_$2M~(<@cs-ur|z#vJ+i+OnDhn;M!vu{cpI1vLNn^JecIos z;zBi4rhTG={L2$t$9sJCjm+|IW+#b=}KM)!!yCHwa)@6MFvjn zWeA<29k&v!#>qcbKI$5|Ar( zAMFvoW$d4lEuCWi`roJ~{C`Y3e-s3_{#tyuks3YcKuZ^(&fFUeom-3T9^O z!R(tceT{ECF+hlgw2c1askk~Z5^eQ9#w^FNfp$+Z5ss^}jj$i}3&Vwlo=yek+4TC1 z_uBH3znV%l&#A>|^H%5*Z^FZeD>ejcw<#z+S)v5C=URyKYWZ!A61uUKj@8G@df7tu<44QyGZnY__+j3OcSr^L#5T%4{z`=zna} zFy(A-f99(cf{~h;3;VMrG-Ld-AJ&N}mNe&JH85ORUREb5vsTwUd)VnKIB>EfKDyM- zU8z%T**%fb?_wU1OzgWq+TX~s_`Dm(LT+oaZmV*>SYbuKwE8MDP?TT9*~hY5G&JU`KXc z#?Un3y_4qm;rzZ^!xc+apGTlLkfH0If~?KcQ`L$T0&!YWUIzS)%B|BWx-Xal% zO-_}~?H`d@TG=&#$8J)S-Jaz};)0(XukO_Uo_^h(&1%0PbQ$pTDiB=jWY~5`xC)MA zR+1xf=IHl)AJ#v>02heeOilJ`3t7PlP>Ch%H3>8QQ@^xmB$gCQI8m}i-pi_~AiqsY zapA(!U+vNR$YU7pY8h~@;63dwXKb|+YrFF!|MYiL^IA{wkoC5eWxd%(g)4>EUbswa z87}qM56g)#*Ff>k^tXXI*~jH&dIQ5g3&$z&l~(T^`5YVp#Xr-1t6Pp=YnNWZ_>xN-V|aq@>Pm|vL4 zUb*$FWmGj_UXo=xL1t^T3}zc73GH0)g(_P>K<}0xlrThd_-}1ikWOr z^59Aj#&dB+G`)2chbo-;;X}jHR4GH`hCi-%P6NN-{%RzSot&*A&sIXR+wtsMu{SQg z^lhn=4I3ilS)|p?Acn{fQ|qjw{F;!7H$(JlhN2U+NQx zmlf5B;9H8mzTmp_*2fpWgLAnuo;p&Xds3rrtrsim0p3;|R8gpV;*o`kb^@Qt&Ase1 zcG-e8R~#oj|8V7GG;g_c#qAe!?=u)_f8@9|KElhRFDl|ZyPMwFv2r`bhPm8&<9J4I z!2M*fcc&Y1MIYd7CU`>%ZX9^{6``_&!pXk#$7p zog+5my6z<2k-gmQG2F*+U^`;~UnQ|RKG5x1KROqa7w^V@7P9e($i>jt(Tep092~?GY{~!j7f&5c}UgZ@w zD=Rxj0Kr&7L&HECCB<3lfnCFLELc3(edA(=IH=5SW={zAYqYA|s zz^|4ka0zpTk+p(C!$6KTN&y zO_8^)aKA2dUud|P%YKV_H@kew(aLB9TGA^vfX9)N`Gms=b>hUgjpAhS|H$AOiJioiut2a7E`;-AYjU^^m?Sn*TLQiLIkoiigy1d-Q*V6M;rEfoBCv6|LinT^gM+pW7&{E{mAM^5`_8yT= zPmcT0kpAAy^;oA%E_|4}iYIO}eqp`AcbQSDmolPj!pWeRcCk6S8s5G2)Lk?}+8TV* zZQ0tq@1i!^F`)npm#o;$T)UmMbzW_!zmXYE$nGDXIPQBkC}ux-F&ta5v26bYG?e>0 zmQdJ>v}Cts$sO~Ov4;H}5&QJj9r(BbeB{1+RL17^Rf4*1QF5yAZ_h*aYQwt_0+8c8 zd}33p#GFmj&nxQ>qM?H-_i%&H0y}*aDJJaoL?0Gat*72V={9zSZdYG&NxrmG_mXGg zRo#VxHdAxImM7!nqOhUxaJBcyPV2n2(-;>BET3{yNckGeIm)fKw^p!3C( z!*3cK0fCil{TXa=s_5e5(XX&=uk{SSTKYZ9$9{za#eAM<9JDR3?Zb6{r)Q--nwh^- zx=dc?`$ZK9&>=2>5k6CL(7B0riMT#`@K+p*M1*W#wbESyRtJUJp*HNM|H6to% zJVY+Dl#_$=oQBnQtCFWu$7#2TQt(8{WjL*TWBRkzxGtl@3qzi47rTkQZPfGWC@8ir zf4#-msS0zO7!cFC+S<0pHrM8U?y$I+ANNO4hK3~{=$%W0*Z1j1LBj=$)QtOi<{TCP zs1C&39;a-x-fLUfD^#lb*%wYOwBLV_%9}8Wi%EA7Fvgx}G0K>goGLmy`MsS(#QBR_ z7cIU>x>B85m&O4c-5|SWgN|+S4N-(NGq{XGcvd3YSk0wxn&^?Dcg~d*I^kVD+nFOz zZ0rd$GX=R&v8mB2+pV*6U|xdyw8Aw?+F7*DmNV(EwqBb-2?+-~@ArlDPS!a;m&r6nYeA9{*l20GoW~F4HaDBh}0)NYpF{D zZN~SfHiwBT6k4$5et9_9Fl|g}eDc7L3L&u{21zOkR~M=!v-x&uFh;Wwnx}eP$OB#A z1RdZ>aU}{_bF3WsuEsRGSL@@96oeI}UPTsT2 z;{Nt1Y*MIa1<*^CHkSp3+voK3se*^|X=N2tRRB_b$*_}K_FpYt7N@3;1UAbrt%SE} z*v`N_x3>7OalEaq9QBv%c}?i%gSK^CW;^C^1oZ23VI^BaK9$BpTbVTBH50^`fvO9} ziVeGyLdhcet)gW=Y)nqYgaqwuEvr3#z{Qeh{tP;r^8XR$KP(XUvFQ|hvhrfS^Js}^ zYm2pRRW*OCdCJk#9 zqM6IaiWR~OcXn}ZtWk<5e&Es4NsGS`fIF7pluDaM$rNKo9bwiT4799%UZ!4#60zqT zY-W2K21|9e=XW_==o9&pvQ2$YhC<-*>B`QqTfS5K_6*=K?AG(7|&zV(K4v&2loiIjywQR?C1))_x05;r@X!=kSBKuQF+7puOazYBJb|zOC-9jQ-L*TS1bEfgc(c z>e>jzH}*fJ2F9{c@6AWDFD6#n_(0yg=3?){GE@meL&fBO5CahnMX?V?9LiazBR zL!fF#Oyr-OwbEN!FR1!F`&7(+z|)s}9~#n6CH0Y6TTCX(**WMPR+Q=3#+3k7!Low$ zJ3@gHWC6c|7#Py}Rsw0}1}76#zwpN9x3vx0J-U|$Ul8U!TUg7L^2OI4FD%WMp2=nB zXQv5JqG_J#1${F7Jq4ggSmV74hY0U+6)rWtwf^i{bYh~HkH=Zl-n60^?35Hd>1iE) z;v<7@-JD$sG&bu|Z)ah-*u?bfiN%%y2~-?SpKq)-mQrjNFw6iz?U$b{@=JFPSGd-U zV^YP(#K&R@owkoqPM?aL;1fC4gyiNDC6fY@FR8wI`?d%KW3_|SQUWZV58@c+1Y4^S zXyIg6PuPU2PD^i~Ea?zdu#bA{DFvhs!(Qy{z}Iyq9#5FjMv>0%DVV1-F1DX3z(bt6 z!y-kT4m;jMMJ|Wu(&5Q)x^banyYc;vfQ#Lqm%d6q%#g<@Mc9zjm)zq%omrIeaX-+| z8eX3*u5`Hylx-z=*;QS1fBIDGk2?^B*7YDuCZVUe;+S+k$azJ?opu;6tV~P825L&F z=A>xR`2#oBDSYr&8f%JZO;2b0ymfQLa!}C99SyaNf93)#Qyz)z{FqZQDS7SWdEN`q zB9&A<9QPrRU8;I1p05`THlK`{t zU?m(Fv+j&0M)tTTmjG_>V>a6(QEc(t{N($D;IYOe9$O=hD?CEN zw|H@gMpny(Ns}ez;P}Rhu$i%yD-e9x$?o6wxzH^!ED13Qx*Jt)5rdR82&>g71;_>F z@{K=_#Pk$Cn5d!8d9`-tuH@t#XC)r%IB(6Eo1f7$q>?|lnjRbs>042R#6ty6ZF=hk za!W8pY$cj`sanR%#b(AX*Y_7_=Au>Tx`SJdtU+QA#2A&B-qnz}PnpB^0f_p4{&>Vh z4|fvyLbtgf1Bk9!XmD#TNU%BuqScs9vvY6=u?WgN9A*8#mdRxG3@&1=)Nirz4Vb^| zf8|Z(x;*u+BEI`rQBGJSN}zwtdj?a{*lV-6u<-nqwm#=?_)zRISch@3S8QTk*Xo~`C^*U_$x>ss*Urxu?WOCod|2E}$wmpiC(cjlOdReC^#weO8{|C7 ztk2xrqi8pARoFJTJ(s?7m~wS-LC$FIDU!;+@&aV|N{kWR#|JOccd;9f@HuI-dRFMO zv-S9QG|d{@jm}yx;c4~fVRkgN2a>*c82E1=;t@Z=hdh1Ez`+>uLZEE0ddlUbYHR8N zw6wjn^tdkNpf91+++!x0OAk6uAiVY9{L_}5Yo!E3x%l@ijSR;xEf1H`&EBCr#PEBl zgno3z=!}7l|FHGT6CbhXzUTpY+LgiIDD5sCb_)0iyS84xMw3!zT0cbv|DvKQJp|zo zqB?KfeBBpsG0qTc=1?sT*QC7HvxEur%1t}=5UIG;ZTJCO!2Eng6zv`TmDDjg9{OUm zXXv9)X$2TTP9~aw1;j1mA(*aXoiMYKST?QWm7`l}{V{>u`Old_y3)6Y{%(^$1C&x< zq}dNIBy4kC8coAKt~~nGyuj+BrxxD6ejpHlhe^R6T)(uiFX=-`7>_!?NBQRdGS<@O zA&Jpzt9+x7f&TvKV>oAJw0Jr-+tn~Kbf4kKDUO_bvt^aYJq$IC zl?>+Q;K-tYeqHEh!S9xMNq!vmjnQ`2zm=m{TXo>7RxS1*=Fd$I{n*%e{nMT5TX1Gv z$U4y8Jvi_Q^`c2*H`G|( z%hIv)Pb&GrS7!8r*;D7yyX<$aOG@I#lLwJ=vc55~{Q zv6?D85BhOS@nI89X-D_Vth`8RE(|Jv2P31(;vPqXG-eoFj(9$*Dx4JJK*DcI7K!6wV zMP-M|zxf_<+AbN@tu1y&u^*}D z7v_&)-i5jBE3vn<0#mzASKx@!XE(7mpbF>Z- zepI$HyU<$b88pnJKvHk6g7&%V*F0@lKCP6;?BwVxY;_gd9-@|evU_Vk{pSp{@9xb4 zxdG9Gj+~NJo%%U=WLL>%1${1yW^Uf@d2Vq(v{B{Nv>0a=le)Us)1K8;rf~B_-1#E~ zm^WLDhoYop-H@ZL40Y)@fTP~&@3mF8qA%F3_QCmUier}}qtvgvm^Om2BJyBZTt z)J;El`6g^a1P^a7MgWB@jIGjBEo)kSpdq(Yd-H3;b$kD*m^n2pD0~q_zc#cv>AS0> z>fcP~pPHH%9>khb+0@yo&Fm@r=8d7oc6i$}#plngqVt%4&0*vCtRArm-{bq3lt@f^ zE*^FGDRh(1b^u#+Ctod=HB@QLMn38w%Of)r>+r+Q>*^b#`mw18jiXCGJ2r|Visoh> z7d|JyXDM4E%f2oay~uj07jA3!wsV{>IuA23J98<(os{Bm+EK8^qvon}#mQYbO5(lm zAnBEg{VAA083=t2xC`dhc{=JISbu34j%U#8mNAasLlA12s33DyBb@Cv=;hef-&)2N zn&2zMdsc1jB2A%+|9y1by#Jt-3y`twI!d138+~t(>jY_+D0IsX!r%>|w zXe6FXQGZfVPl$s1>XbGsm^VsB(&OgwlX*DIx`wzry3NL<#vI@nXXao~tyg&~D~|{5 z0qiAV-+MJxne|6*;!wn0E=V}LWrxkHcP_cVK_{K4&TwyM%C)$>6jb;_jwa?_H#0E$kDAOF`0Y(Ks+@4mH z_VO`>j>f|dKBAWk+WD4wy@#%lk(`QzQ_@8cqmJw;MQLn&YH1-#=Aut3Fx_LoomGCd zIv|Y$pyBeVg@J4iYpF1y;i{q1*oZGc=E->-SIQRri|nOdzEP9{oLu~4JJ*o;ndW!X zAl>(YXkyun){b3i9mc%);uk*9(bcuL)0N&=W7UtG+?90-{no@iQe_V$u{SfYCN zT*@xJt;T)NOVToZy$(aJ8fJbNdnTk4lHGm&@H5(d1&p?_w31QcBh!M(_o$6rIKCuS zI$}*8yI;%c=o#!g3;2u(lcXYoqCIWe`b`t6=1;22&&1>h>mLEZZY4yI85_B*!D~-eA9}~HFit?AszRgTQ(|# zPOS7Fu9BJL#Qd%8i}t1?_c}%j_CGtWP@%WR-~KeTEMa}s3l}*&SQ7Ah8`?eRS%3Vc zJ?V$1`L^`RL~Qq+e(d6nn35(cTKf9P=!>JDZ)dP^u3k?Q{z`k|rsH$6tyo%eCq(Nt z#gY8f46KxLJUanA_C$&zLm+O_U!s4p&k#^8oBzz(`UI@c_fx{Qf4mZD(na>85nmWxv;aj~~ zwj0@XJMg*1aNonC{KlO-U8*Njk_&|Rww{9-8_nkbE-x1>`Pq{P} z_mrj)5d;#Bf)BJt$gc&dEb~jnT<-3j6D>OqoDJuN5}!k>;J3?5Vibg`@xJT-9MY3`djdb$-i4ZCheDhp2h_CRYxf2 zf4A>9{+(bAey2q!{qOKD1k#lE1QhY#P2<-8yya#B}%(<^6SY-FUdY}w#cm*rVa zzcjkxHg&9f-BV1g{k!CoGoyo!o2Q*iaTR@3GXC!vi+glgZfCTpq9{|}lMFK5HsZjg zOU3+%pAM?-L=^It5k-**xXhq8!_qh0vdOL#j5^{M>*Yj=&|Eg7rD?ImO2r!RhELTw z%QDB5m%FkQ+yx81yH}4fh@ICpq`$VL%dcu{GZW{(yhNST?C$O!D{&wAlvLTLUnPlN z?Y!Y)WF#&tyRrZ1_uwRTlnl#oXO=CZI-Q*)cLT}9-17A_MqN~qPkBN>!)E2E_jmoBzCr1eR(+pCBF`4fg)4Kgu{olyjD9sM!03MCU% z()t`1lkmEBSs{_id3Y&>Lne3k+_H46=L*-Bf;=s?qSO>K;1{<< zo)V*jpzhPmMH9{hjijCh#~fRisNA?UqldvCXC3$*tA(d5l3mqO^ol}aUodrn7yrJS zPSk$*Xv!iq7+*O$=X))KgFlICB6P>x^U31?t%4}=bS379_}*p9ByX_vkfT-bOEDE% z5;78nKeU(uH(Z{R$Q!At-3x3E3J&h->)Kr3evtO#^ui}D3Db!pKA@CsB(xcil2Vbt zV>*nOE$+Lofy3|;W=af+ zPEb|}fUNd*@J`g__bp^M;<}B`?gAUMwKI$^n4agfw6{u01ub8hjzJ|fUBeZ=AGwJ< zee@$f{E;@LS)*PN`>t`U9rr%0?h6jaP4Va_$PYS>@(tvNT38a}`lEFRftz{xV%*$bi@R^%U3gK1E28hg>ab6?$%TA^aaHsxbhFgF z4m&xbaz`w=P=zFqb95>xQcTyKJlqgE?yVJvs`u|D(kO(K z^(sWvi)j4S)MLZL!_j!q0>tNJ*+t{*xF55##=f|_^7Fl6!i~&~7SXhD=*r2_Q5wIy zm5mqmm%9|AX=1jeDg5qvrKLh&xbFrwzpkAcv7fBb@)l4p5_#hQKRhf`0r*(^K2oU7 zqG2XE^!vAi`Y=u*98wqo;^G}w-kw`7=g-r~LL$0Xu5{bl7?y!wD-5@b!Ar!sR)$v& z4%~z*C%j=@N1&ht;_=~Np|HJkOVP9mhoaoVtLdMpo>?kPREw~cu*rgg#*xt$3bhxn zm3{R3PFp0!y~wCQ=4P%rf<{S^#mKyR@R*mkZvo4OccQNMX}Jt+i|@+6dui9LF5yA@ znA1?X^O1IiO{nVku(Z><-0A?_$mFjAZ!FTRhlhryO5ct21Lk}SJ}7fkG7rJ$iQ7kf z#0PSKh&RI_-x!N$6iZXETIRn!(k#-@uaQB|&1dX}c2g1)U!1PK7Vp49R9f zR{Z84Ku>uNWxR^oj=4DQ3u(h(l}0t(g@J{te@CvqMTJ}KsbkWeko=1dg0nvIo!&%9dl zE9cYQpR7r;3=L#w4ERzMVz1ZjY()-e+zohIjEaW@-46#A26)eb`9E2H2;ScU>m< z=s(1D6HW!;MK&(UV=chEoCz#!@Y2~C`)wMUvj1*^1e%Jgj>dPej<|;Rn#^lu zLv_>E|EsvKj*7B-+Z{y^45S35yQMpo5b5sj?(P~|K)M+L0g>(wLApV@q@_!`&K}?Q z_kHV}@2vCh8CbI%Tr=}L``OQZU-xxg_uglFn%7s4d3YPy!%#e$qs&oFjEz71ke8Mo z{Qa@)-^-6inEeR;0}c6Sb}%vi%`gUCY|O>5A3vZsP3bAG#avxq=n@k{pS_4?vVJG@ zA(doeJ+-*SE8+4CJfC)MMt^y&fRGm0Ri#v~rK9Rwx~xM+veq?-8%UxY_qBI`X}fCn z>(?I3DchPFXEdP}E>9mTD=RlQa<9`W8XB4Wldj@9jW;C+9?z2d{Hlkf1)C8pQS{qGo~9o;Q8eRMMpCBA6IcHsnF=?;Q=NV zIwSo*_w7LqSVJVSq2u!^-QXJ!sqi zJIThmK98Ps40ZcUrl-lhKX)AJ!5FoT{aB$Efaxk|sa0k9skblNna?s}gprDnw!&)E zigx=V+#w%EWb*U!W|kt!z#BqCwR!1WR1#Pv!DJlYitqh0_@)?Fdgac$vERjtHEj^Q zblsoqHB#{R6J)>r{3ws0*8o@fB%2znyP0}<-}dWMNH!@cDb^Fwucw_W)Tw!UXOAm? z&g{9Q=7E3_Y84yisGpvF&}<3J#*Ah8>pB55PDDKd#gHtff_=F zhD<7wowtz~a5E25LF-ljfsBkys>ikMQi=K@^CX+}^=(Uif1tn%mk`5!a&P~~?RQIC z>C1MZBKYiVY zp;5g0uMkNO8^+-ppFAF|YW39%b?;&C*f~+7S1DF$RA_XQtC*TwSXgxteAUOclUhBq zOQ~oZUBD>FIHfm2MNaO2|0%gvf$!NA%Y7ON>f z01tj>$9D&UOt{Zy)YWNvQ&+Ov!3pNTGTr{XVM?VWER9ARn^=gmk&?mSm&wshohsif z6?~_0(vPmLF*fVx7eP1rM{eh^APf>LCRs<5Ob_Ps4@BS8LOKX9TuGqR3FS7mp0g$( zIpC;=4w|?s5|&PRu2c@EjAyIRkdftFU0tWJa`3YcvMGR6p{byi{B4S%nA^;CfSmHj z=H@y}Rhg06S0t+#Mar^VoK zKS--!gAzQ+2wk78OQ44v2MLXij~smRG4!#_cWD7S@>|u4vsOq00udT^p*Y1ufw1y8Vs=H+tKMMc!tvviCte^x4? zpG-5k567Mk+s-wlpv7inP+&)7R90e%o+e)ztc`lQsun2s6%`Ha&DE@JuD|ck!Qpce z&@C&knoc(PATt)9WE~wEsz<2L$GS=mrN%19l_ov;Z2I2Ov9QxZnln#XCBE0FqA$F{ z$uPCk!rI10yFG;nRyHs&@C7e&uEu6)fXQaAA&4M^>mVk$U|Q>)ZxUI^3vxW5uxUz@4Qc^C8r8W5g#*PEEdr ze<9hVS|cTqNK~GmpE5-W0~6Db}N<0_|bRkMADn{)F zgK{-`XnLz%!MBRtk?*%5sQdZmzN$%E12~%~Bmko!1^Vnv4!XN@4+O>{xZ>i`G4>4K zkKbRt5&EF(>nj2cbhp&Aqb_?Z)YB7s*&ZYbc2rR<0rSE2AXD4(e3umZF)EU|e>k%d z?KKUkN5Ej~`DC=HdDjE1{2S$`BR783>--b2&ZqJFW%l{TZa(DPni3MSh2*q2Ln%pK z=c@>&O?{&uUf|es`7hke%<48|7NYhv&-Q0T$DM3#m)4TTJA!z|K8H_CutRD2ezT2L zwRZn>J=?uRw0v0=@!4_5rSV{La-pQYpRFHkVSm5k={v-?lT%ZYsjjm$Qs=4K+0V$o zWVqezbh&LHBMK6=Ppj?8Mx?s>Yr^Q-;%2f1Gvw-u-k-3fw7~%mF8y*J`~8P=$2%M; z$0sKjUJM%sn(FYo%pVOb>;*Dj*xOJHCY*mSl$tG9%8YV!BPyg!U=;cZ;qiIX<;Dy0 zm}MVj)Ybg^n>5#@Yo}aVa;zug&k6>rRIFAvB5hmp6lfo6I#?vI2na0h+YQ_{Ozb!- zg#EDMc+8JODxkA>e!1zb29=^5w}>N%N^x&(Vow!GP+%6&M@dDMDxDJT|Kga$np>}} zBxbs4fSSV3BLo&q-rvE~%j_FeD2&%4oU$U+^jg3MbefLWUC#w{eb05#5GU^oxwQ05 zz!~AjhYlsHMgE~{R}@AwoD(0uX~+GOtAIpSVM?)qjZV(^nWK+cLkgeeVCie*gOZH= zg8clqg}V1HN00IP4i<0CRaAOZ%-#N*Gi){QX?dwX3Pn?|+Qn(T5!c_xC>))gy*-`s zEvr((Ku-FP7r=TGUKJu&MmWEs05`|YWovVNmGwgW`K@63%~AASf}RsljkEwzl~)2#Zk0RO;gPydeN$%y#iQHF>t2umq2*7hQ{1Wyhw>x%UwBc*5K*J4*lO_K3g zy$&Xe=OP$MsHk?@TKI*s${OdKPE-ahRIvAjzF5a&j8P3i5QFV?5 zzpeoAUbTt`a`@w2Jj4$GLkKab`rYX3{*rM2;poaZvcQULZE>XB;)+U2Ozg(3PM3YF zB~KxICS7d8E-D*`q4lMuwjhCY@;I+<6nAUW{C%rmNH8Iw6J^8O+XK>f>GQ`g>*yXr zqIFGGIbp+ejB_q)hgkyyA5orC&i?KG@XN=5bAhtZ3pZy82?a|{Q*ir7H!?sDMYxV; zw(joUF+{sAuNX_!KK}dpvNTd)8ILk8K=^P;%#Y60rwa{il*5U%gu@4c7d+`iC{-9&UlCSr@uC(-Vry69JxLb(R-G|2+>)vc07jl*Y zWXxerzqiHQe6oL#sDp6%cLC%_U$TkX&?(D7LWP@Tgq}yUO)rVr(c;C1C2j6X zj%-wlRC8f1jvv+cdFt}da=O*Lg?+WQbAa$dCSj9qTmZGuTj$dR|L<8$x%{aSsb~sH zRV0Ff2L|jF!;lxIDDtFD7jEpHruL=fG`|-RHE~M4R}-9a%A1>4Zb3DNzgS(P~()oCb8ACJ6%P|QHF*AHFCzEdqlqM$^vqs4oia}G$*Kx|m1%`S) z9zjM|8%IY`HVzKV_N@aVwWC;PjlH(EU+Z*J(-fZPN{E!75p+4&YkR(6L^wNi7CtD$ z2b5{T%a>T|0`|vBrlz%)lhqPa{RVs$$Vd=6x&hTU($}6+2rg+EXrwWrr#u#NB+zY?&b{^ypnm8tp)&(KDv!oOi7Iy268VNg`b|DYCwyPhsVmrm5xRv zhOE!=tU5>T@la+}W3{tDD?rHdSe?76{p-x#?CjPN;UA53qyEx_SC5fQwM*nCkZ)BH z)!u;J++MEp@(~WtIO3$tB+l%J=7=l(=t9zIA4o7L*GTC%Vos|6%Z<*^MYwOBTwh-y zZDdqaNKOW@g4Z#qv{eutx63h-f_a=!(a&Hf--j z!>Ic(w~wVbaYeI{&!$sOHwiVq9zHz$qj6Zs5&93qyFd=(cKTdK%t*(&x?R1KCGix) zNxpJv$RCHja>OD7lmLGdaN|5yB@``Nfp)r|n<@Ubo6)D!X2)*evm$vLMwxEGk-fdV ze0JN@xbI$~JQ*d6EiG)q+f{=cpoptw#&}8!K^-8IFtDM`nRVZlsqAE{nTrlUCz5KmN40ESfyl^BvFvqDLrtLN7{c(~C7g5tFS;q9_L(8T`Jyqay# z*4$FDFoA}K=1EY%-iuD`mGf~gfuv#!W6_z(H))_ozVQKQ6#=2+=*Yr^JY&>sy4ALn zlw)$|^!V~7EbJ%_mcem)mb+aI;H9mV#cNz#1{#LG;eLBA69a=am&RKVAl5gHhZ}R4 z9uwM8a^s_R@44u<+85TA-v9D%Rw#%^JHBxg17yU@a^~Is#_H2^+%y2Sc?I;DQ#>|R z5ICC;f4`0lUTCC6eE1#ACEWc5qVYZ*Mu5Bl2;JUdF3(Ztw4SZYVk*5Fo5;%2-*~cq zbOA+!4bRyfES9h42lO$%p;>G$bZ9rY1#H`i4m%(XLke`{9*vt}%+Q6ZlbE$V5T?cw zINxOzPyMmOX;WQQqC`v7abS$k{*pwN;&5I(taLmBFgTpqllm zGMDCM`Co<_6MJVffB2EM%{v_S>%9Rh7A~$oTjiKQo03Az%g;}c2wIZWZFX5OC@18p z^L28fCn1UISOy;-(dn`M=e1BzOLOC%3oq}vs{T72(aW=jtM^_w2=oueiwI!JdJ4Tz zJD$b{fr~@x6VKsFu}pD^v5Q*))Q~wrCNw4O-UL zdmh^1GWpNF=ze$U&$PS09({kNxXcU4@LMCa*y0 zl$NTAOk!ZKbl=wIdvmO6Z!u9RhMJ4_+@pEOq|$b&B_WR+aH36`n!55W-gA?0md`cS zDdy`!t7F~5U0QE}Ebqobl0>NRny^4`ZK#}}ofR#exz;wqfF*K-3Vkn({w z8!pQj>-+ZuzBh-MN&TnWQ#uk8I~6SB%>ugS;^iI8C*MP0PA<+wd}XC|U-eujJNaJN z4VQdF&N__C>Bik>XK|cOOgdmXJwx16B}SVjIExk#;9=szvJf*|O=NoPqj#UlCTwA- z*nfnXzw+~2N5~7CnI?OW*|TWD%cKL}177GSSo7&qlfkwmk7foX_QWGsBsEe{g_xcX z0Y0m8lYwbwjQI3%)M-u}6mzW4!#ZP0V#=j6n&W^+Bd6?3x8_-yUIPB?3 zVckSR3eoXeo+%pm7@12U)!Huy6u=zgvC7RMFwb(TzPOnxUk10|w0)c|$pC$pw%Z2> zru!weRTdUKQZyizXj0d<|rU;TBLZro-|@ zvwK#lWB@ES9qWUl)oc0eUK9j-MqZ!o&Q=w$QSt7K8&ZXc1uMqJ&D6Jkd>_~^T3uaR z+RlxjhV$s5fA^~U&StAqeL<3rn@U=2Y+RhO>Xe*L3mFN?-O$49xap8N1||?YsbW4n ztbJnjEGfy_G!cjgolAae8%Bjn;dlPu0hJdUo6S|t!`d-Dx!9{UyBjI2d*8Om&&!F0 zJuo!H;HF8AAzD@AjL+)>?s{o(b&vw@es1dioUgxLc{&VAiH-Gj;{Iolh!DVa6&VX< z*#TJ=B>1s)%iXtS5fe!WONHpUswbuND+r>uEG(xm39;ntw$A)ecYbq(wE* zF~YgEfe^-1W-FUY!mdPXt>Zrdar?oAFC*hpqs4H3?Ok48eo`VVucUkb)?VIUrxfoM zKFgPFBL#6q$B0e?an>&lT9p$?r7RsXg^ar1N0(&g!AczMUnjoBt~?*-z#EtRtzVkz zPBz{CShT0Gv?)0@-Rrii_yp%03JK5~!0+x8aJnh4x4;}`fG&(Yd4(o}uLH2|NzxM{ds63FHf<2`HfO=S)TFY!DC8>S$JXEK2 z_2{Cx83Fn!lTcBjqRXra=Ew2-6krU~7Ov9qyik#B(Rpm{6y5xRoE*Xz?CgMKL~3Yg zU}YVnz}VVO7X`J(UzG8Ypn))+hlXZR?h`Cuj+&Gd3}4&k$&s7Z#+%fXw>(eBrTkD+}Y8}Z1k`Gv0p1hW6vuR@P74eTfi`Q&B~tGaq@+H43=N&Gu8h_GeSTe0!IJEQc5r`(kTd!zBOxKSh=zey zN>-NlYAfvUI@jFyzU|Y(+2`u*Q+ImoLLp|~$Ff}*E{_hYa?E|TZ=1IzRZUFNfkVZ5 zro!IN&d$cBs=#vOP^GY*&Bq9PG`l!C-RKye{QC7Pxcy(F3FOB-Xs7CxQ@0wg>P9k*W}* z;q%nNw5c&fv9Q;eUwlGdk6FNe0QqY@iIbzAZ*h)zOI+u@Wh2KUUMOwfs4XVQKe}LO zKqx%COh1A-V&iJZg)dqZpq;H0EV+RplwMi+Fze7|kbp9pKCV|uLi9X6O4K8RgOqgT z>NG9Cm8+W`sGEe`H&PA`7$;+9Y=FUG6^9{QpC@ABZKX7o3H{^u%VR-Mfpo84d%fVHcpm*RlgIfg zHz{)%XhUykO6nasxw*r-S2F}0gSVEnYYg#{u8DsGU5Fv6`$o47$FBaoU!^d9^!PWh zHvkx;U98}Ndv+%mZqKPqLrUp3;%iKC;Vi`CNA(dep2vrMtd>FM*Ejg0f@Ug2r& z0X&^ge!=-uv8@)H#u@3^<~(-TpQoqQQuB)A&dECFBW9P&9RI3NHrYyD4Ga6`Y5W>z zc7ZFN9v+pIETG&oG|1*{^q4j!Mrf1JZ@D!zG)#UF1^u+PX5|02?pJU`>w{4XMP!nE z0l^Nbm2Rn=T2Ivkl{AOOjs4xCxQ^wn?oRZvo+^AJme-BT9gEn5FTasIfS~=(3VaG_ zQ_KQY;o91l{e8md5L)^k!@KqM^&X>&l$6&o)B)ySt?AzYfrDXM=9{eC){eUJs*8jq9WFOLm`1LY%$OMlrdjIrUKDU_0lG+7|88f=?X+iEIOGKpmRQ)# zH;tl6AkO!J#ee1CZ(UEyyq}%Y0U|khl^pLA$6xC=aV3^ zp8*d3bNbxK*kpgY#d*IGz+cqvk1A;_I}X(~i@rjtuCCD^$my5Lg-ge`oo9~;ctuF{ zU0r2=1q1YIWo|xdu9(SP$9SWRNiFq=HO0f)MNA>qWGPd7Ha@<&vG9w6_{at*tw7?I zmES+EuzsJT?=soDj8@E{PK^bkKK9z?@#T3VG1!aRj>~AgD|X=7YT{t-%uEWKw;-Xw z$$&qAmOgWngV0aAyY%I1yXhIv=ljEkWzNq|O-)S?X4QdFY$2YClA|lx|j#pDe3KCZ5+bXG1kP4kV4Wdn0@MYa@W9FT2t@y6*@EFB%`8f8XA z7yfq@j)2>Xn3=@h?MD-I$$6ihBQjc3K_T|Wr=hvo5#{u;-ywClh4l`aSeUNYa{Xo| z|4p^3&cI+VDY;u$Ydy9*Li+$SzjdXn3%{Aalgp{p+-~X*5g_%=&I+)u_Vo9^VW0*2 znWu|tXO{?T;hW_e>JQ1mk05V}f$-!9EFR(=nEKW?{Vzw!>uRyO`V-(2+CEn| zzD3Z$2t><^G3sz0-z<;&mS*LIm*AISs;Kv8=>%oS%o-4?Fv9B0gqLd<-7a?g|!rpG`^@C;?>e7O(Z$eQjmnMryLl;^C$- z2kb1!H>qdmXJ=w!ORXnG^@?d6D+};T4*$#TI6p; zCdn~0#A)GihKS0;e0??&l60rlG+6kp3yX^x=gQ$*>=~QX;^V*PSOL+h8>vDj)A;dC0i^Lhxn{=mN?K#(>Qcbg~nKQ=Q(X!Zm7AWA|8Um_lJm1SFL7=D+>Y0B^70;wP zxYF5Ocq?$fLYDkK?yCYV@c0S~cf7Mj32KL4T(sQX)oX5@HkhS2Ef#M)aindB;<$NO z&uCqo_Ele0<$~arjMJNN4(od>o5whiD2{%(&xtJktxK+yfq168_>p$ zAskai`g$}!xsgP@vPxTKMGhjKy4Lc7ppY67nRC#tXRbgZW0B`64e?RF_|3P+?`TQ zgrV7A6DLDFtyGf>O^$%Z5~AU2X2zwY5|RB?E@@L3v6(5~Kos@$FY!uf=`2&b)|V`L z)*}K;OtK`g&GmIIQ`4E=Ac$UP^Wl69aHQaI+A8Zd(8l$0U}1y3Sb=Lp)TTv2RvOt^ zwc_TugN+;lc?DO&_`CrTHa9y5rs>_5?=5yEJWzl-?zbv(87?aRbkese?u?;S-s-wO zh~6MI-+e-+aH4cfFo#?vlE%3WTfF|LWKW3Ugq*d=B zTqwO^Uk|)|5~m*_e)TdLJOpo|QBw;EAivCk&a_@rb4I90gUL*%jZp*ca)y&)Gm1|O+4_Uiqgq1E~0+gI@Gz{4@N~y znG89sW0`NCmhYWes?WT#8Y5^e@H>R}7a$|TM?1(EBx&rm&aN)tmj-NEaj|uD?J2vzf{P@y~p{)$)5zA9%(^&xGLF{&md7IAsHSQ zi!nDlt2xI*=&B9*g%SkkYn}pfSXXPiW?0abi;=T?%ZbO-G>$C{NRxnm2XQl4;~r1f zSClm7W+kar!@)XH(w>8}`+JINmC0EZ{rJxsfs0ke_18rN6u2>#-kV+KAGgjt0 z>5ZjyxPKDy_EPo?e`K6)zOlL?v;;rUNSU3hmHt%#MQO|mzDJ<`nFxs>?f9WA zR^ZbL>tBzGmi78`G`i5}YM~fguQhak!YSC~vpNYFOF#@78fM@6v`*~+C*&lUD9}$C z$}cr*txWpx@$e$U!T@6u0ct#8=)qds9A{fTsmH`j{7097i<(vCKi6IQb8>+Hl=N($ z5_+>)x|BsNL5=0JDcid4qG)@6<{h4${Lps3Xlrk0uH3s{B3;O@S_&Xca6ZjPSGJ2j zuD$1xp%`=l9m{0}roi=wfkM7Q9i~K&E(SU)0>oiBD<>Wql?)*r=C#9hS~jh)UiPJ7 zUPmseVKY>R5lO$AM-XVa%^b!@P+kKLs^Q8r2=TIC0IcD(e|{`ByJUYqT96w%UxnXu4G1G-P%BU|4ECDa*j!%x zJ}Mgc6ZrT{Svlc;d#aTJdgylZ{rkSJ=MD~*=-!OBvQ`yv9u$_8WPw7LHlfD#CsGY! z%Jze{0I6p0R`=@#_z;0hj!uynws#>l4vgSGx@i;@Fn(Hy8Z@y8kT7si@{kIJ-kbz9 z=`8)J8nnuM_4+klTJkQ@tJj3Mr*6$`(v=G^ZhTzrEF$b#3<%m{gS8}@P;49<7^7Q+ zK$FT8c+sr?cc5nGue-n)%Du?HgZZAHzfiu&XmkcvPv+HyFA6kC{b3(JKG7m!?f4oR z2{=x9YJ->IYL)Kv%B8YWAJD=`k(YrGtcb-9EV45*+Db|vkeTydn`oD$)gGV;0Wum? za*^gBW%HB#SUqxba$>e_87j#PxM>31zP5ItO4^D;qoyWkrO$*+mbxF{-A^su?lsW~ z?nY8%{|I=6|J_E{m{+w1`fHl-k68Bg^W3sz(92OaeqLaBomW(>X}C%Z z4xaRkB-j{5fem+m$r^p>Vg5JNO;iLMGAw$|>VJRZ@+g+-K(I zrmmT+1xlx=ehm}R0-xGqb0fyeYLgDQi#Cn|R58Ou9{LkAa?(-pvg+wSf(@TvHnGZ3 zRsL8#Wire~6v_(84h{}ZSqEHG_o{eq>}Lb%yhZd%ZW5ArrBlG*3mS`#%!vKgN4Bb@ z?2w;fMJ(aV8}v@^vL^LQvzl?*(oVOQ(lf}=#Drdw$k0HkVnQh}?5&FU1azvcEl2Ae zr%H56tSTxoR^6U3IZ-Ya-=6jt-s~A zYlkP}%;3~G?|KY_P=?=t!_?FmSOFI;tqc;aW||5r47!Ww*cA%cG_Y@%#b7|P|9#p3 z+dRN7m4Ae2Z}ikzuLUH0fS&0F(0W2G}7YL92P6Pio%9Ux*()9)Gze@VNtb-})?xLa$Zc7uN?WGp$ z{;I()zE86U=k+w4B;=q%qHhtzjXJw_=W7wlGP69WlF?v=PgSJ6mlwYGhpjKIsjUun zv#E!ptTiPi!(CMpOpQ&L@XpRoMZ-nXI1)g^61dBOU=6xCT%*lxig_A6OtcvS-`Q5q z0Qoq{%L%fRu9KhP*?j?gONqo~2afjgXTFz{5yr-8E33*q0;R+ZNpwkKI4{?IcG4J? z5^XWWL^0Ygj|Y}uu6W~V^vIwE5!rU3h9ZhU@KW%8{~*N|hR?s@G^Equg*amhavK~> z4#FE}?C|HuK-K~s2-?cZ_P>AK2|qp`X9HIp#_ech<&|BZ%g(M02n5|Dk6V{UZxnpKwlSRF~TOYB$&I|m5TP}@_ zjnV}L9zs2Psg1M=6=og5z%;~=#LFSzvo)6BZfRVuCY84syV5>1wEsE8AFOPf;&Gjr zqAC=xMkoU=YC;m~#-^#LsHnhxUy(Fu8PpqTIX?F9E!fhm#nrMIP9lIE+#^Ajv)(-T z=cx>iGTSt|7MWQpIT;+*i9xps_+?3<7mwrOVza88NnX#$SP;C;hvni$zIzc-TJKo9 zF{FLAt|@q*`#$a!9^UvAXPXT#3(GO6M41^~Rh0Acwv)wY1bCe{`X=x|GN0h-l^Jxo zYtKEwVHhkG{WxAJe1)fqlF89mth-Oz7S1BZ+En z2he5@cc8uw&4VVEmle!7)MX^E`bI{W=4uQx^>24$gi%9sHe`y`@Rb#`^lIlqg2ko@ zm~-}o#AU{?URw8jkj29#+}i!|B@#jh7#p9R$f=G}%)8#xP>cw4rc0#!Y_C-iC<~Or z!-x}2EG#5w6OP@U4r>Aq`{bDAY=7}?@gPce4qxhFfH*(d<7PKANyuCH69gLY7p&zO zN5iz=0n#4`Ahp&z8~lxhUIM`0|7*Qp^$m7EDW@zjdz&i)vS28qwXTmHQB4;cU+}u8 zy@w|hBmKf{q9j8T6LU4$lr-p_e0-+?NFM+;X)$E#I)Hd;VPi8iG?duC9?|=&-)O9_ zZ*a~Q>JUtslNPByFK7Am6F`*6ade-Pw zO`T3v0uWE687ndwlKL&GL3_v9=_$I<*w`33hPaZF(gkbBy2H!x)$@wXeANoXEWg%A@oYUzKLbKd{Va_4gP8EqMwH!Z<)tG)sLUp>fH^V zcq&)D*D^{50qSGc>q?n?N1lw^zYi@2R|ki&&6AWtlX@-iR8}PWf6} zQIQNA81XOH!P%ZK`3lm}Nirnqw)%LV?=K)CB5n@DN(&1mrKOEANA7(+&(FrY61pGU zd_1@aw=R4B%Ibso!z~W9(LG~|#5{!`$J6H$d%|nx5XY@Bv z#6a9EP|U|QT~R6I9vSE6JrAKy!&?cXaW-XutX@+(EEufnQYLz;5@>dJ!)pCd&|cJ5V!jsUFH`?{uoy<*0y2(Ln?6h~A( zmORl$GFAkc88@;>HCQG;jy#M#*#x-YNn<|bkK=b6SI&3|z$9}2cr?@Z7b#ZG?VVkE zO?cm*85kOpVT7d%c&FwL$B%glERBt2kD7T2=-S%aQe$mzZQ0jrJ->Sr*ZXr~ePT;3 zKT2AgYXs?U{f*iK^OnShPXaDBwP$-)&PuE!)->zGMb-9_l9I$|deXEW9v)Fdg8NQ9 zV1lZJ{PvEr(AR&51~u%CDnHgQR^er110B!yt6ji9-`4h4Q&ZE@atBOya*WHXol?bu zpTB;6p0QH7M*~zE2gl^xoF+9EKyXNpA4ha%lZzAleE>69{`elZchvhFa6@+*l;`9G zP6$w8fQ2ek-1vqZ>|nz{y5HE?0HYCz2~IA(7&Sws-(KYPfWWFJ{P6v{(Ehg7zg0A6 zOYO=sB8f+5xba|7LmCu7Kn#U6k2 zJt;ax>|&HkMBQunQKmitJ12q1 zXLqhBVBCoPNlmVNMrgD?y#1k}v@}|D3{bK;IfmxuVVmxiGxKho?MUFH3HjXGNH-D^ z5A zt;Jxgg6<3tuLSp4ikxJo&MYTtB z<|{~hLDcYnVGF4 zH-M9GZkmXZw@cSf+|?6z5X_=hU0~&@gB#1s`bqtOY+mv@83Y{T<>jSAz1P|9%;KU> z;CDOl4?5KndIp9Dt&-X$pSg7hcK7QRJ*J+M8<5}Wu|W`R++04t4!@!PEJnN8;*RxdI5jbT|r8xu9riI_OF(% zuw2v|tt)4AK#Bnm5fB#1$;B~5N0;rI{)|cbv@V&kaojafhx>vyjFNnEaY|@Tl{}u! z-&tUa_~38MW}6#4ux-7YHBTG-Ha=leYEuj5ob7pM7i@C+WC$wVrJ;R*WO<7p`JOdp zAcNNxgg(M&NFb`Y4$RQxrbxM1Y$ti?{6dbQ3mT3`i&B`Km-zbyTpBtbMY-W$)ik2E z$J(uoYcRlnu{x!jKQ{|{l82UQe(HH*T-^et$v-hMaluOzExdIpqnY>ivl_iZz~nIe zts{JD`*8FBTSa+^h|aNf#@3WHPc_=GVNWhb^0Yyht3O)=b2dyB^nxB$9+$_bMh<}r z3f5OzVOiW!WjwzT2$87rt0ze?x`DdLE9BI~^ovZO< zMh=D++ne`;42cq?B=KVsvmZzP2~m)L2MQq~Q@v3iJ3t03f^oX-N=GLzFM{MvY^1KE zyOf-IwY6P+a8mzJj4Sa@HBBJr@b8;Z@jd>H!sR|A&`(m7=j*wB}lyJz7WK8!sn;A_+q&SR3LR zhYv>?kpQgpZqSX7K|J;t&t%IV(o*$hg$DI;OckI z=&1ZD@A<)!pzoa*ZGyt$J8KbRNk$rA|AR48=ac7d7HR;^N0kA_nQXm1=;@3VScN2@xykqbF6b%F&n?!6 zW)LpgMO-{@ORK640++4OLNSQmRJd(qWJSLy`vAt{cfFryFmtgu<9cr|#%*hDmK+;3 zd3pH+Y||EOKo3BVge$OZpSY7?%a#-!m#bC4gAlFq2GlU6lE+)cb=hsv&{tm%RFskW z;7Lp|OYUN~a=1uk=l5?jKEl!hZxfKD+eq^1AE`eOqQ+8rk`zxTUWEK0ip!V-IjFr4 z`Z<%@ZtG&8AnjctiFMb3+WxO4}DvAX9yMu>MlZ!swOg-uXmh#0WtQBP)!G zNfomKt8)%1<1aY1Op_>u<;MsdJeb6QjJyI*5a_49F;k(?yn3<+5VLPro`#-*{yG!Z z_PaU1HaI61-EJqQbUjbM->g*cETsa2yKlN<|&eQ#SV=o13~e0O$C} zQKhnYLCk{R9Ax<3H@i+Gg-T}G1v;Tr{t!^s#GngmnBRES(1MK{Ju7xAUL2j7phmQH zqWB$*xC^xU5twiAOPZCt%ip{jQ$(KS!)?a&YL`PZep50Rg9N&{y6!NuXTx7cg7CHy zG0;D?(YW?U3GL3)Bqm8d%!y|W3Qvl|vtU2I${s5Pi0v8DeWCO)2^#(YgJFXqEhGEq zd_d!rUC&;NzXsE*uiSNoh2v&yA7Te|f|HUWI!S$;AKRH(xwhUU)<}H@pGrsn(inv; z-@;(PL%4%bNtUMI{qQ5O&^mmk%)yUakMr*#cY2gtU&@y?C>W`R?G7*M={cO}Z#lik z>hJ3>DUoUZZui*`$Yi_#HJzGwe;K=~Su!{CG>3D4XIpcgW7vc83F{5=aB^a^C zBF=vgJ_3j^_!`e`l9l(p6F$GE~wea#5{%AR|i8O;9FR z6Zi%1hkeUwvhT9dD}TI`8&goOld2s~i8ia6WpXR^%Gh+uRUkpdSZI TQs5TDgPXXhj7W))UcmnXu5xJ4 diff --git a/e2e/gui/__screenshots__/should-display-the-pricing-page.png b/e2e/gui/__screenshots__/should-display-the-pricing-page.png deleted file mode 100644 index 041f1979294fe271e359fa3f8b93968abe96383b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84344 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

k@)QI2M^qw&O9q-*qx!1 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 { - it('should display the create project page', { timeout: 0 }, async ({ task }) => { - await $page.goto('http://localhost:3000/projects/create') - - // Make sure button reset form project is enable - const resetButtonEnable = await $page.$eval('button[data-test="button-reset-form-create-project"]', button => !button.disabled) - expect(resetButtonEnable).toBe(true) - - const createButtonEnable = await $page.$eval('button[data-test="button-confirm-form-create-project"]', button => !button.disabled) - expect(createButtonEnable).toBe(true) - - const selectFileButtonEnable = await $page.$eval('button[data-test="button-select-project-file"]', button => !button.disabled) - expect(selectFileButtonEnable).toBe(true) - - const inputeSourceProjectURL = await $page.$eval('[data-test="input-project-source-url"] input[type="text"]', input => !input.disabled) - expect(inputeSourceProjectURL).toBe(true) - - const inputProjectTitle = await $page.$eval('[data-test="input-enter-project-title"] input[type="text"]', input => !input.disabled) - expect(inputProjectTitle).toBe(true) - - const textareProjectDescription = await $page.$eval('[data-test="input-enter-project-description"] textarea', textarea => !textarea.disabled) - expect(textareProjectDescription).toBe(true) - - const inputVoiceRecognition = await $page.$eval('[data-test="input-confirm-voice-recognition"] input[type="checkbox"]', input => !input.disabled) - expect(inputVoiceRecognition).toBe(true) - - await $page.locator('[data-test="dropdown-enter-project-category"]').click() - const listOptions = await $page.$('.v-overlay__content.v-select__content') - expect(listOptions).not.toBeNull() - - await $page.locator('[data-test="dropdown-enter-project-origin-language"]').click() - const listOriginLanguages = await $page.$('.v-overlay__content.v-select__content') - expect(listOriginLanguages).not.toBeNull() - - await $page.locator('[data-test="dropdown-enter-project-language"]').click() - const listLanguages = await $page.$('.v-overlay__content.v-select__content') - expect(listLanguages).not.toBeNull() - - await $page.locator('[data-test="dropdown-enter-project-model-AI"]').click() - const listModalAIs = await $page.$('.v-overlay__content.v-select__content') - expect(listModalAIs).not.toBeNull() - - await $page.goto('http://localhost:3000/projects/create') - const [fileChooser] = await Promise.all([ - $page.waitForFileChooser(), - $page.locator('[data-test="button-select-project-file"]').click(), - ]) - await fileChooser.accept(['Random-file-names-for-automation-testing.mp4']) - const buttonRemoveFile = await $page.$eval('button[data-test="button-remove-project-file"]', button => !button.disabled) - expect(buttonRemoveFile).toBe(true) - - await $page.screenshot({ - path: path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '__screenshots__', - `${kebabCase(task.name)}.png`, - ), - }) - }) -}) diff --git a/e2e/gui/dashboard.test.ts b/e2e/gui/dashboard.test.ts deleted file mode 100644 index 1453e562..00000000 --- a/e2e/gui/dashboard.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { kebabCase } from 'lodash-es' - -describe('/dashboard', () => { - it('should display the dashboard', { timeout: 0 }, async ({ task }) => { - await $page.goto('http://localhost:3000/dashboard') - - await $page.screenshot({ - path: path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '__screenshots__', - `${kebabCase(task.name)}.png`, - ), - }) - }) -}) diff --git a/e2e/gui/list-project-dark-theme.test.ts b/e2e/gui/list-project-dark-theme.test.ts deleted file mode 100644 index e85ee041..00000000 --- a/e2e/gui/list-project-dark-theme.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { setTimeout } from 'node:timers/promises' -import { kebabCase } from 'lodash-es' - -describe('/projects', () => { - it('should display the list project page dark theme', { timeout: 0 }, async ({ task }) => { - await $page.goto('http://localhost:3000/projects') - - await setTimeout(1000) - await $page.locator('[data-test="button-active-popup-theme-switcher"]').click() - - const popup = await $page.waitForSelector('[data-test="popup-theme-switcher"]') - - expect(popup).not.toBeNull() - - await $page.locator('[data-test="button-active-dark-theme"]').click() - - await $page.screenshot({ - path: path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '__screenshots__', - `${kebabCase(task.name)}.png`, - ), - }) - }) -}) diff --git a/e2e/gui/list-project.test.ts b/e2e/gui/list-project.test.ts deleted file mode 100644 index dd5ee940..00000000 --- a/e2e/gui/list-project.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { kebabCase } from 'lodash-es' - -describe('/projects', () => { - it('shoud display the list project page', { timeout: 0 }, async ({ task }) => { - await $page.goto('http://localhost:3000/projects') - - const searchInputNotDisabled = await $page.$eval('[data-test="container-input-search-projects"] input[type="text"]', el => !el.disabled) - expect(searchInputNotDisabled).toBe(true) - - await $page.locator('[data-test="container-select-category-projects"]').click() - const listCategories = await $page.$$('.v-overlay__content.v-select__content div > .v-list-item') - expect(listCategories.length).greaterThanOrEqual(1) - - const buttonCreateProject = await $page.$('[data-test="button-create-project"]:not([disabled])') - expect(buttonCreateProject).not.toBeNull() - - const gridProjects = await $page.$('[data-test="grid-list-projects"]') - if (gridProjects) { - await $page.locator('[data-test="grid-list-projects"] div:first-child input[type="checkbox"]').click() - const deleteButton = await $page.$('[data-test="button-delete-project"]') - expect(deleteButton).not.toBeNull() - - const buttonDetail = await $page.$('[data-test="project-item-button-detail"]') - expect(buttonDetail).not.toBeNull() - - const paginationContainer = await $page.$('[data-test="v-pagination-root"]') - expect(paginationContainer).not.toBeNull() - } - - await $page.screenshot({ - path: path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '__screenshots__', - `${kebabCase(task.name)}.png`, - ), - }) - }) -}) diff --git a/e2e/gui/setting-account.test.ts b/e2e/gui/setting-account.test.ts deleted file mode 100644 index 08d6156e..00000000 --- a/e2e/gui/setting-account.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { kebabCase } from 'lodash-es' - -describe('/settings/account', () => { - it('should display the account setting page', { timeout: 0 }, async ({ task }) => { - await $page.goto('http://localhost:3000/settings/account') - - await $page.waitForSelector('[data-test="account-form"]') - - const uploadButton = await $page.$('[data-test="upload-photo-button"]') - expect(uploadButton).not.toBeNull() - const isDisabled = await uploadButton!.evaluate((button: any) => button.disabled) - expect(isDisabled).toBe(false) - - const resetButton = await $page.$('[data-test="reset-photo-button"]') - expect(resetButton).not.toBeNull() - const isResetDisabled = await resetButton?.evaluate((button: any) => button.disabled) - expect(isResetDisabled).toBe(false) - - const fullnameInputWrapper = await $page.$('[data-test="full-name-input"]') - expect(fullnameInputWrapper).not.toBeNull() - const fullnameInput = await fullnameInputWrapper?.$('input') - expect(fullnameInput).not.toBeNull() - const fullnameInputValue = await fullnameInput!.evaluate((input: any) => input.disabled) - expect(fullnameInputValue).toBe(false) - - const emailInputWrapper = await $page.$('[data-test="email-input"]') - expect(emailInputWrapper).not.toBeNull() - const emailInput = await emailInputWrapper?.$('input') - expect(emailInput).not.toBeNull() - const isEmailDisabled = await emailInput!.evaluate((input: any) => input.disabled) - expect(isEmailDisabled).toBe(true) - - const organizationInputWrapper = await $page.$('[data-test="organization-input"]') - expect(organizationInputWrapper).not.toBeNull() - const organizationInput = await organizationInputWrapper?.$('input') - expect(organizationInput).not.toBeNull() - const isOrganizationDisabled = await organizationInput!.evaluate((input: any) => input.disabled) - expect(isOrganizationDisabled).toBe(false) - - const phoneInputWrapper = await $page.$('[data-test="phone-input"]') - expect(phoneInputWrapper).not.toBeNull() - const phoneInput = await phoneInputWrapper?.$('input') - expect(phoneInput).not.toBeNull() - const isPhoneDisabled = await phoneInput!.evaluate((input: any) => input.disabled) - expect(isPhoneDisabled).toBe(false) - - const addressInputWrapper = await $page.$('[data-test="address-input"]') - expect(addressInputWrapper).not.toBeNull() - const addressInput = await addressInputWrapper?.$('input') - expect(addressInput).not.toBeNull() - const isAddressDisabled = await addressInput!.evaluate((input: any) => input.disabled) - expect(isAddressDisabled).toBe(false) - - const zipCodeInputWrapper = await $page.$('[data-test="zip-code-input"]') - expect(zipCodeInputWrapper).not.toBeNull() - const zipCodeInput = await zipCodeInputWrapper?.$('input') - expect(zipCodeInput).not.toBeNull() - const isZipCodeDisabled = await zipCodeInput!.evaluate((input: any) => input.disabled) - expect(isZipCodeDisabled).toBe(false) - - const saveButton = await $page.$('[data-test="save-button"]') - expect(saveButton).not.toBeNull() - const isSaveDisabled = await saveButton?.evaluate((button: any) => button.disabled) - expect(isSaveDisabled).toBe(false) - - const resetButton2 = await $page.$('[data-test="reset-button"]') - expect(resetButton2).not.toBeNull() - const isResetDisabled2 = await resetButton2?.evaluate((button: any) => button.disabled) - expect(isResetDisabled2).toBe(false) - - await $page.screenshot({ - path: path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '__screenshots__', - `${kebabCase(task.name)}.png`, - ), - }) - }) -}) diff --git a/e2e/gui/setting-billingplans.test.ts b/e2e/gui/setting-billingplans.test.ts deleted file mode 100644 index c33e6b72..00000000 --- a/e2e/gui/setting-billingplans.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { kebabCase } from 'lodash-es' - -describe('/settings/billing-plans', () => { - it('should display the billing plan page', { timeout: 0 }, async ({ task }) => { - await $page.goto('http://localhost:3000/settings/billing-plans') - - await $page.waitForSelector('[data-test="current-plan-component"]') - - const title = await $page.$('[data-test="plan-name"]') - expect(title).not.toBeNull() - - const expiredDate = await $page.$('[data-test="plan-expired-date"]') - expect(expiredDate).not.toBeNull() - - const planPrice = await $page.$('[data-test="plan-price"]') - expect(planPrice).not.toBeNull() - - await $page.screenshot({ - path: path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '__screenshots__', - `${kebabCase(task.name)}.png`, - ), - }) - }) -}) diff --git a/e2e/gui/setting-pricing.test.ts b/e2e/gui/setting-pricing.test.ts deleted file mode 100644 index 3040e592..00000000 --- a/e2e/gui/setting-pricing.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { kebabCase } from 'lodash-es' - -describe('/settings/pricing', () => { - it('should display the pricing page', { timeout: 0 }, async ({ task }) => { - await $page.goto('http://localhost:3000/settings/pricing') - - await $page.waitForSelector('[data-test="pricing-list"]') - - const price = await $page.$('[data-test="pricing-price"]') - expect(price).not.toBeNull() - - // Check if the current plan button is disabled - const currentPlanButton = await $page.$('[data-test="current-plan-button"]') - expect(currentPlanButton).not.toBeNull() - const isDisabled = await currentPlanButton!.evaluate((button: any) => button.disabled) - expect(isDisabled).toBe(true) - - // Check if the upgrade plan button is enabled - const upgradePlanButton = await $page.$('[data-test="upgrade-plan-button"]') - expect(upgradePlanButton).not.toBeNull() - const isUpgradeEnabled = await upgradePlanButton!.evaluate((button: any) => button.disabled) - expect(isUpgradeEnabled).toBe(false) - - await $page.screenshot({ - path: path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '__screenshots__', - `${kebabCase(task.name)}.png`, - ), - }) - }) -}) diff --git a/e2e/setup/1.init.ts b/e2e/setup/1.init.ts deleted file mode 100644 index 68e4d30f..00000000 --- a/e2e/setup/1.init.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { CookieParam } from 'puppeteer' -import puppeteer from 'puppeteer' -import cookies from './cookies.json' - -function createCookie(name: string, value: string): CookieParam { - return { - domain: 'localhost', - url: 'http://localhost:3000', - name, - value, - } -} - -beforeAll(async () => { - const browser = await puppeteer.launch({ slowMo: 50, args: ['--disable-notifications'] }) - const page = await browser.newPage() - - await page.setViewport({ width: 1920, height: 1080 }) - - await page.setCookie(...cookies.map(({ name, value }) => createCookie(name, value))) - - globalThis.$page = page - - return async () => { - await browser.close() - } -}) diff --git a/e2e/setup/cookies.json b/e2e/setup/cookies.json deleted file mode 100644 index f1896d43..00000000 --- a/e2e/setup/cookies.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "name": "nuxt-csrf-token", - "value": "c78f852528dea97ae1b5ae73c91acddbbbaa7a5f483add8c58973cc238fcd008%7Ccb7f002cca456aa275f73f5082d7d86b8b5ecfd071a965640c95159293386193" - }, - { - "name": "nuxt-callback-url", - "value": "http://localhost:3000/dashboard" - }, - { - "name": "nuxt-session-token", - "value": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..xX1f-QdMLdEjHLMF.51UJaBnioxjEYgr5bzjGnRam3VbQzJxMyI5zXNxGkt-7R6XatLJZDMLtOMA6KM5dKNwUM56WFJvtmia-SNDys-OxujyLamVetpFswHqoqYDa41QOI3RhSasTKuuUpDuXIncddFvde5dp2njUihHZBpFimfuTIqE5s-6-cRheFK5O9cafKJGU_rr7nNzbUp1Omio50hLNaswUiGOdcy1_eZfy_wAaV3aivjFuFvX_omuqmnVGfi3SqkJtTLI2PGay99pgYEGmhnmbEgaHnT60n3gNaDJZW_FcKWDw_qpbzThVk6Niv4Wt_RwOjNg85JSlY3Y8wG5wDNQXjpJ-o6qfMpEz2aZF1ij8alTYUwQM6y6wGUpK4cYhSA8m--9tHTT3pPx-BakkVQub.T3X0pRe9aKe-yKgpN6fBCA" - } -] diff --git a/env.d.ts b/env.d.ts index 9f3ca283..cb757cc0 100644 --- a/env.d.ts +++ b/env.d.ts @@ -1,6 +1,5 @@ import type { RouteLocationRaw } from 'vue-router' import type { Arrayable } from '@vueuse/core' -import type { Page } from 'puppeteer' import type { NavGroupType, NavItem } from '@base/@layouts/types' import type { z } from 'zod' import type { HookResult } from '@nuxt/schema' @@ -19,11 +18,6 @@ declare module 'vue-router' { } } -declare global { - // eslint-disable-next-line vars-on-top - var $page: Page -} - declare module '#app' { interface RuntimeNuxtHooks { 'session:refresh': () => HookResult diff --git a/nuxt.config.ts b/nuxt.config.ts index 317bffad..0f5f6aa3 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -98,10 +98,6 @@ export default defineNuxtConfig({ authorization: Boolean(process.env.FEATURE_AUTHORIZATION), }, - hotjar: { - projectId: process.env.HOTJAR_ID, - }, - theme: { appLogo: process.env.NUXT_PUBLIC_APP_LOGO || '/images/logo.svg', appName: process.env.NUXT_PUBLIC_APP_NAME || 'nuxt-template', @@ -284,7 +280,6 @@ export default defineNuxtConfig({ 'nuxt-security', 'nuxt-vuefire', 'nuxt-gtag', - 'nuxt-module-hotjar', 'nuxt-nodemailer', ], @@ -310,12 +305,6 @@ export default defineNuxtConfig({ ], }, - hotjar: { - hotjarId: process.env.HOTJAR_ID, - scriptVersion: 6, - debug: process.env.NODE_ENV === 'development', - }, - nodemailer: process.env.NODE_ENV === 'development' ? { from: process.env.SMTP_FROM, diff --git a/package.json b/package.json index 416c2b6a..67b65f82 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,6 @@ "@pinia/nuxt": "^0.5.1", "@sentry/nuxt": "^8.36.0", "@sindresorhus/is": "6.3.0", - "@stylistic/stylelint-config": "1.0.1", - "@stylistic/stylelint-plugin": "2.1.1", "@thecodeorigin/eslint-config": "workspace:*", "@tiptap/extension-character-count": "2.3.0", "@tiptap/extension-highlight": "2.3.0", @@ -134,7 +132,6 @@ "nodemailer": "^6.9.15", "nuxt": "^3.13.2", "nuxt-gtag": "^3.0.2", - "nuxt-module-hotjar": "^1.3.2", "nuxt-nodemailer": "^1.1.2", "nuxt-security": "^2.1.4", "nuxt-vuefire": "^1.0.3", @@ -146,7 +143,6 @@ "postcss-scss": "4.0.9", "postgres": "^3.4.3", "prismjs": "1.29.0", - "puppeteer": "^23.4.1", "rimraf": "^6.0.1", "roboto-fontface": "0.10.0", "sass": "1.75.0", @@ -182,6 +178,8 @@ "vuefire": "^3.1.24", "vuetify": "3.5.15", "vuetify-nuxt-module": "^0.18.3", + "winston": "^3.17.0", + "winston-daily-rotate-file": "^5.0.0", "zod": "^3.23.8" }, "resolutions": { diff --git a/packages/config/eslint/index.mjs b/packages/config/eslint/index.mjs index 90e3fe83..ff4ee84a 100644 --- a/packages/config/eslint/index.mjs +++ b/packages/config/eslint/index.mjs @@ -12,10 +12,6 @@ const defaultOptions = { }, vue: true, jsonc: true, - stylistic: { - indent: 2, - quotes: 'single', - }, rules: { 'no-console': 'off', 'no-debugger': 'warn', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0d61c52b..d054960d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,12 +111,6 @@ importers: '@sindresorhus/is': specifier: 6.3.0 version: 6.3.0 - '@stylistic/stylelint-config': - specifier: 1.0.1 - version: 1.0.1(stylelint@16.2.1(typescript@5.4.5)) - '@stylistic/stylelint-plugin': - specifier: 2.1.1 - version: 2.1.1(stylelint@16.2.1(typescript@5.4.5)) '@thecodeorigin/eslint-config': specifier: workspace:* version: link:packages/config/eslint @@ -261,9 +255,6 @@ importers: nuxt-gtag: specifier: ^3.0.2 version: 3.0.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) - nuxt-module-hotjar: - specifier: ^1.3.2 - version: 1.3.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) nuxt-nodemailer: specifier: ^1.1.2 version: 1.1.2(magicast@0.3.5)(nodemailer@6.9.15)(rollup@3.29.5)(webpack-sources@3.2.3) @@ -297,9 +288,6 @@ importers: prismjs: specifier: 1.29.0 version: 1.29.0 - puppeteer: - specifier: ^23.4.1 - version: 23.4.1(typescript@5.4.5) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -405,6 +393,12 @@ importers: vuetify-nuxt-module: specifier: ^0.18.3 version: 0.18.3(magicast@0.3.5)(rollup@3.29.5)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) + winston: + specifier: ^3.17.0 + version: 3.17.0 + winston-daily-rotate-file: + specifier: ^5.0.0 + version: 5.0.0(winston@3.17.0) zod: specifier: ^3.23.8 version: 3.23.8 @@ -947,6 +941,10 @@ packages: resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + '@csstools/css-parser-algorithms@2.6.1': resolution: {integrity: sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==} engines: {node: ^14 || ^16 || >=18} @@ -970,6 +968,9 @@ packages: peerDependencies: postcss-selector-parser: ^6.0.13 + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@drizzle-team/brocli@0.8.2': resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} @@ -2154,9 +2155,6 @@ packages: engines: {node: '>=6'} hasBin: true - '@hotjar/browser@1.0.9': - resolution: {integrity: sha512-n9akDMod8BLGpYEQCrHwlYWWd63c1HlhUSXNIDfClZtKYXbUjIUOFlNZNNcUxgHTCsi4l2i+SWKsGsO0t93S8w==} - '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -2828,11 +2826,6 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@puppeteer/browsers@2.4.0': - resolution: {integrity: sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==} - engines: {node: '>=18'} - hasBin: true - '@remirror/core-constants@2.0.2': resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} @@ -3373,18 +3366,6 @@ packages: peerDependencies: eslint: '>=8.40.0' - '@stylistic/stylelint-config@1.0.1': - resolution: {integrity: sha512-JgFP88HZEyo34k9RpWVdcQJtLPrMxYE58IO3qypXhmvE/NmZohj+xjDtQ8UfaarnYsLecnldw57/GHum07Ctdw==} - engines: {node: ^18.12 || >=20.9} - peerDependencies: - stylelint: ^16.0.2 - - '@stylistic/stylelint-plugin@2.1.1': - resolution: {integrity: sha512-xqHTmQZN7EbnFDW7jw0rAsdFNO4IRqvXhrh3qhUlIwF/x09Zm7kgs/ADktHxsTJYcw346PpGihsB0t4pZhpeHw==} - engines: {node: ^18.12 || >=20.9} - peerDependencies: - stylelint: ^16.0.2 - '@swc/helpers@0.5.13': resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} @@ -3565,9 +3546,6 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3695,6 +3673,9 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -4329,10 +4310,6 @@ packages: resolution: {integrity: sha512-7TnogTQQZEagrHcOcddY0PqXPxVqFoNPPsKoa42Peyc83iinzT+QPKoRLDmzpaUVWZbgqSoHtezsTIoJyyBE+Q==} engines: {node: '>=16.14.0'} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - ast-walker-scope@0.6.2: resolution: {integrity: sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==} engines: {node: '>=16.14.0'} @@ -4375,18 +4352,6 @@ packages: bare-events@2.2.2: resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} - - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} - - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} - - bare-stream@2.3.0: - resolution: {integrity: sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==} - base64-js@1.3.1: resolution: {integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==} @@ -4397,10 +4362,6 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - bcrypt@5.1.1: resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} @@ -4467,9 +4428,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -4601,11 +4559,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chromium-bidi@0.6.5: - resolution: {integrity: sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA==} - peerDependencies: - devtools-protocol: '*' - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -4660,13 +4613,22 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -4884,10 +4846,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -4972,10 +4930,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -5010,9 +4964,6 @@ packages: devalue@5.0.0: resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} - devtools-protocol@0.0.1342118: - resolution: {integrity: sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==} - dfa@1.2.0: resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} @@ -5193,6 +5144,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -5750,6 +5704,9 @@ packages: picomatch: optional: true + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -5762,6 +5719,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-stream-rotator@0.6.1: + resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -5817,6 +5777,9 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -5933,10 +5896,6 @@ packages: get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} - giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true @@ -6122,10 +6081,6 @@ packages: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http-shutdown@1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -6234,10 +6189,6 @@ packages: resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} engines: {node: '>=12.22.0'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -6258,6 +6209,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -6440,9 +6394,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsdoc-type-pratt-parser@4.0.0: resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} engines: {node: '>=12.0.0'} @@ -6554,6 +6505,9 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + launch-editor@2.9.1: resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} @@ -6671,6 +6625,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} @@ -6695,10 +6653,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - lru-memoizer@2.3.0: resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} @@ -6982,10 +6936,6 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - nitropack@2.9.7: resolution: {integrity: sha512-aKXvtNrWkOCMsQbsk4A0qQdBjrJ1ZcvwlTQevI/LAgLWLYc5L7Q/YiYxGLal4ITyNSlzir1Cm1D2ZxnYhmpMEw==} engines: {node: ^16.11.0 || >=17.0.0} @@ -7072,9 +7022,6 @@ packages: nuxt-gtag@3.0.2: resolution: {integrity: sha512-0Spu/rffPxW7REebkjE22qQOuVZIQuyIuvd61InDdJU+d+gRIqWhrUuKBWdk43N/J1elj+cTK2kEdk5FQX7vdQ==} - nuxt-module-hotjar@1.3.2: - resolution: {integrity: sha512-4jRp5LIb8aS5jh+Mk6ihHfQ92bLWWtKuFmWUVeczM93gjRSObSkyi8w9XGRaceYH5+vVxAI02tVQ3/gT0M2XFA==} - nuxt-nodemailer@1.1.2: resolution: {integrity: sha512-oYi0AnEZu56euRxJ/G7NAQLmRct9ORgKvxF3AcAbVlxfKJJQ7kNPZnlymQbzg9F/SLBlQgSE+mSQR/3Wz6JOIg==} peerDependencies: @@ -7153,6 +7100,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -7208,14 +7158,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} @@ -7802,10 +7744,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} - engines: {node: '>= 14'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -7820,15 +7758,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@23.4.1: - resolution: {integrity: sha512-uCxGtn8VE9PlKhdFJX/zZySi9K3Ufr3qUZe28jxJoZUqiMJOi+SFh2zhiFDSjWqZIDkc0FtnaCC+rewW3MYXmg==} - engines: {node: '>=18'} - - puppeteer@23.4.1: - resolution: {integrity: sha512-+wWfWTkQ8L9IB/3OVGSUp37c0eQ5za/85KdX+LAq2wTZkMdocgYGMCs+/91e2f/RXIYzve4x/uGxN8zG2sj8+w==} - engines: {node: '>=18'} - hasBin: true - qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -8044,6 +7973,10 @@ packages: safe-json-parse@4.0.0: resolution: {integrity: sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -8151,6 +8084,9 @@ packages: simple-git@3.27.0: resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -8177,21 +8113,9 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} - engines: {node: '>= 14'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -8230,12 +8154,12 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stable-hash@0.0.4: resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -8327,9 +8251,6 @@ packages: stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - style-search@0.1.0: - resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} - stylehacks@7.0.4: resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} @@ -8491,9 +8412,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} - tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -8513,6 +8431,9 @@ packages: text-decoder@1.2.0: resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -8523,9 +8444,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -8595,6 +8513,10 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -8671,9 +8593,6 @@ packages: type-level-regexp@0.1.17: resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -8700,9 +8619,6 @@ packages: typescript: optional: true - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - unconfig@0.5.5: resolution: {integrity: sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==} @@ -8889,9 +8805,6 @@ packages: url-toolkit@2.2.5: resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==} - urlpattern-polyfill@10.0.0: - resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} - urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} @@ -9315,6 +9228,20 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + winston-daily-rotate-file@5.0.0: + resolution: {integrity: sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==} + engines: {node: '>=8'} + peerDependencies: + winston: ^3 + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -10432,6 +10359,8 @@ snapshots: dependencies: mime: 3.0.0 + '@colors/colors@1.6.0': {} + '@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4)': dependencies: '@csstools/css-tokenizer': 2.2.4 @@ -10447,6 +10376,12 @@ snapshots: dependencies: postcss-selector-parser: 6.1.2 + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + '@drizzle-team/brocli@0.8.2': {} '@es-joy/jsdoccomment@0.41.0': @@ -11423,8 +11358,6 @@ snapshots: protobufjs: 7.3.2 yargs: 17.7.2 - '@hotjar/browser@1.0.9': {} - '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -12543,19 +12476,6 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@puppeteer/browsers@2.4.0': - dependencies: - debug: 4.3.7 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.4.0 - semver: 7.6.3 - tar-fs: 3.0.6 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - '@remirror/core-constants@2.0.2': {} '@rollup/plugin-alias@5.1.0(rollup@3.29.5)': @@ -13323,22 +13243,6 @@ snapshots: - supports-color - typescript - '@stylistic/stylelint-config@1.0.1(stylelint@16.2.1(typescript@5.4.5))': - dependencies: - '@stylistic/stylelint-plugin': 2.1.1(stylelint@16.2.1(typescript@5.4.5)) - stylelint: 16.2.1(typescript@5.4.5) - - '@stylistic/stylelint-plugin@2.1.1(stylelint@16.2.1(typescript@5.4.5))': - dependencies: - '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) - '@csstools/css-tokenizer': 2.2.4 - '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4))(@csstools/css-tokenizer@2.2.4) - is-plain-object: 5.0.0 - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - style-search: 0.1.0 - stylelint: 16.2.1(typescript@5.4.5) - '@swc/helpers@0.5.13': dependencies: tslib: 2.7.0 @@ -13532,8 +13436,6 @@ snapshots: '@tootallnate/once@2.0.0': optional: true - '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trysound/sax@0.2.0': {} '@types/bcrypt@5.0.2': @@ -13696,6 +13598,8 @@ snapshots: '@types/tough-cookie@4.0.5': optional: true + '@types/triple-beam@1.3.5': {} + '@types/unist@2.0.10': {} '@types/uuid@8.3.4': {} @@ -14382,13 +14286,13 @@ snapshots: '@vue/shared@3.5.8': {} - '@vuetify/loader-shared@2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.5.15(typescript@5.4.5)(vite-plugin-vuetify@2.0.3)(vue-i18n@9.13.1(vue@3.5.8(typescript@5.4.5)))(vue@3.5.8(typescript@5.4.5)))': + '@vuetify/loader-shared@2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.5.15)': dependencies: upath: 2.0.1 vue: 3.5.8(typescript@5.4.5) vuetify: 3.5.15(typescript@5.4.5)(vite-plugin-vuetify@2.0.3)(vue-i18n@9.13.1(vue@3.5.8(typescript@5.4.5)))(vue@3.5.8(typescript@5.4.5)) - '@vuetify/loader-shared@2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.7.2(typescript@5.4.5)(vite-plugin-vuetify@2.0.4)(vue@3.5.8(typescript@5.4.5)))': + '@vuetify/loader-shared@2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.7.2)': dependencies: upath: 2.0.1 vue: 3.5.8(typescript@5.4.5) @@ -14501,6 +14405,7 @@ snapshots: debug: 4.3.7 transitivePeerDependencies: - supports-color + optional: true ajv@6.12.6: dependencies: @@ -14603,10 +14508,6 @@ snapshots: '@babel/parser': 7.25.6 pathe: 1.1.2 - ast-types@0.13.4: - dependencies: - tslib: 2.7.0 - ast-walker-scope@0.6.2: dependencies: '@babel/parser': 7.25.6 @@ -14652,27 +14553,6 @@ snapshots: bare-events@2.2.2: optional: true - bare-fs@2.3.5: - dependencies: - bare-events: 2.2.2 - bare-path: 2.1.3 - bare-stream: 2.3.0 - optional: true - - bare-os@2.4.4: - optional: true - - bare-path@2.1.3: - dependencies: - bare-os: 2.4.4 - optional: true - - bare-stream@2.3.0: - dependencies: - b4a: 1.6.6 - streamx: 2.20.1 - optional: true - base64-js@1.3.1: {} base64-js@1.5.1: {} @@ -14681,8 +14561,6 @@ snapshots: dependencies: safe-buffer: 5.1.2 - basic-ftp@5.0.5: {} - bcrypt@5.1.1(encoding@0.1.13): dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) @@ -14764,11 +14642,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -14938,13 +14811,6 @@ snapshots: chownr@2.0.0: {} - chromium-bidi@0.6.5(devtools-protocol@0.0.1342118): - dependencies: - devtools-protocol: 0.0.1342118 - mitt: 3.0.1 - urlpattern-polyfill: 10.0.0 - zod: 3.23.8 - ci-info@3.9.0: {} ci-info@4.0.0: {} @@ -14991,10 +14857,25 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + color-support@1.1.3: {} + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + colord@2.9.3: {} + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -15197,8 +15078,6 @@ snapshots: csstype@3.1.3: {} - data-uri-to-buffer@6.0.2: {} - date-fns@4.1.0: {} db0@0.1.4(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0)): @@ -15257,12 +15136,6 @@ snapshots: defu@6.1.4: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - delayed-stream@1.0.0: {} delegates@1.0.0: {} @@ -15281,8 +15154,6 @@ snapshots: devalue@5.0.0: {} - devtools-protocol@0.0.1342118: {} - dfa@1.2.0: {} diff@7.0.0: {} @@ -15389,6 +15260,8 @@ snapshots: emoji-regex@9.2.2: {} + enabled@2.0.0: {} + encodeurl@1.0.2: {} encoding@0.1.13: @@ -16286,6 +16159,8 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fecha@4.2.3: {} + figures@6.1.0: dependencies: is-unicode-supported: 2.0.0 @@ -16298,6 +16173,10 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-stream-rotator@0.6.1: + dependencies: + moment: 2.30.1 + file-uri-to-path@1.0.0: {} fill-range@7.0.1: @@ -16411,6 +16290,8 @@ snapshots: flatted@3.3.1: {} + fn.name@1.1.0: {} + follow-redirects@1.15.6: {} fontaine@0.5.0(encoding@0.1.13)(webpack-sources@3.2.3): @@ -16552,15 +16433,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.3: - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.3.7 - fs-extra: 11.2.0 - transitivePeerDependencies: - - supports-color - giget@1.2.3: dependencies: citty: 0.1.6 @@ -16820,13 +16692,6 @@ snapshots: - supports-color optional: true - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - http-shutdown@1.2.2: {} https-proxy-agent@5.0.1: @@ -16842,6 +16707,7 @@ snapshots: debug: 4.3.7 transitivePeerDependencies: - supports-color + optional: true httpxy@0.1.5: {} @@ -16943,11 +16809,6 @@ snapshots: transitivePeerDependencies: - supports-color - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - ipaddr.js@1.9.1: {} iron-webcrypto@1.2.1: {} @@ -16966,6 +16827,8 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -17102,8 +16965,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - jsdoc-type-pratt-parser@4.0.0: {} jsdoc-type-pratt-parser@4.1.0: {} @@ -17226,6 +17087,8 @@ snapshots: kolorist@1.8.0: {} + kuler@2.0.0: {} + launch-editor@2.9.1: dependencies: picocolors: 1.0.1 @@ -17345,6 +17208,15 @@ snapshots: lodash@4.17.21: {} + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + long@5.2.3: {} loose-envify@1.4.0: @@ -17368,8 +17240,6 @@ snapshots: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} - lru-memoizer@2.3.0: dependencies: lodash.clonedeep: 4.5.0 @@ -17679,8 +17549,6 @@ snapshots: negotiator@0.6.3: {} - netmask@2.0.2: {} - nitropack@2.9.7(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 @@ -17852,17 +17720,6 @@ snapshots: - supports-color - webpack-sources - nuxt-module-hotjar@1.3.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3): - dependencies: - '@hotjar/browser': 1.0.9 - '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) - defu: 6.1.4 - transitivePeerDependencies: - - magicast - - rollup - - supports-color - - webpack-sources - nuxt-nodemailer@1.1.2(magicast@0.3.5)(nodemailer@6.9.15)(rollup@3.29.5)(webpack-sources@3.2.3): dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) @@ -18030,8 +17887,7 @@ snapshots: object-assign@4.1.1: {} - object-hash@3.0.0: - optional: true + object-hash@3.0.0: {} object-inspect@1.13.1: {} @@ -18060,6 +17916,10 @@ snapshots: dependencies: wrappy: 1.0.2 + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -18127,24 +17987,6 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.0.2: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.1 - debug: 4.3.7 - get-uri: 6.0.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.4 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - package-json-from-dist@1.0.0: {} package-manager-detector@0.2.0: {} @@ -18735,19 +18577,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.4.0: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.2 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.4 - transitivePeerDependencies: - - supports-color - proxy-from-env@1.1.0: {} pump@3.0.0: @@ -18759,33 +18588,6 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@23.4.1: - dependencies: - '@puppeteer/browsers': 2.4.0 - chromium-bidi: 0.6.5(devtools-protocol@0.0.1342118) - debug: 4.3.7 - devtools-protocol: 0.0.1342118 - typed-query-selector: 2.12.0 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - puppeteer@23.4.1(typescript@5.4.5): - dependencies: - '@puppeteer/browsers': 2.4.0 - chromium-bidi: 0.6.5(devtools-protocol@0.0.1342118) - cosmiconfig: 9.0.0(typescript@5.4.5) - devtools-protocol: 0.0.1342118 - puppeteer-core: 23.4.1 - typed-query-selector: 2.12.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - qs@6.11.0: dependencies: side-channel: 1.0.6 @@ -19034,6 +18836,8 @@ snapshots: dependencies: rust-result: 1.0.0 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} safevalues@0.6.0: {} @@ -19157,6 +18961,10 @@ snapshots: transitivePeerDependencies: - supports-color + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.25 @@ -19179,23 +18987,8 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - smart-buffer@4.2.0: {} - smob@1.5.0: {} - socks-proxy-agent@8.0.4: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - - socks@2.8.3: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - source-map-js@1.2.0: {} source-map-support@0.5.21: @@ -19231,10 +19024,10 @@ snapshots: split2@4.2.0: optional: true - sprintf-js@1.1.3: {} - stable-hash@0.0.4: {} + stack-trace@0.0.10: {} + stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -19323,8 +19116,6 @@ snapshots: stubs@3.0.0: optional: true - style-search@0.1.0: {} - stylehacks@7.0.4(postcss@8.4.38): dependencies: browserslist: 4.23.3 @@ -19526,14 +19317,6 @@ snapshots: tapable@2.2.1: {} - tar-fs@3.0.6: - dependencies: - pump: 3.0.0 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 - tar-stream@3.1.7: dependencies: b4a: 1.6.6 @@ -19572,6 +19355,8 @@ snapshots: dependencies: b4a: 1.6.6 + text-hex@1.0.0: {} + text-table@0.2.0: {} thenify-all@1.6.0: @@ -19582,8 +19367,6 @@ snapshots: dependencies: any-promise: 1.3.0 - through@2.3.8: {} - tiny-inflate@1.0.3: {} tiny-invariant@1.3.3: {} @@ -19637,6 +19420,8 @@ snapshots: tr46@0.0.3: {} + triple-beam@1.4.1: {} + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: typescript: 5.4.5 @@ -19695,8 +19480,6 @@ snapshots: type-level-regexp@0.1.17: {} - typed-query-selector@2.12.0: {} - typescript@5.4.5: {} uc.micro@2.1.0: {} @@ -19740,11 +19523,6 @@ snapshots: - supports-color - vue-tsc - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 - unconfig@0.5.5: dependencies: '@antfu/utils': 0.7.10 @@ -20053,8 +19831,6 @@ snapshots: url-toolkit@2.2.5: {} - urlpattern-polyfill@10.0.0: {} - urlpattern-polyfill@8.0.2: {} util-deprecate@1.0.2: {} @@ -20180,7 +19956,7 @@ snapshots: vite-plugin-vuetify@2.0.3(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(vue@3.5.8(typescript@5.4.5))(vuetify@3.5.15): dependencies: - '@vuetify/loader-shared': 2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.5.15(typescript@5.4.5)(vite-plugin-vuetify@2.0.3)(vue-i18n@9.13.1(vue@3.5.8(typescript@5.4.5)))(vue@3.5.8(typescript@5.4.5))) + '@vuetify/loader-shared': 2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.5.15) debug: 4.3.7 upath: 2.0.1 vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4) @@ -20191,7 +19967,7 @@ snapshots: vite-plugin-vuetify@2.0.4(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(vue@3.5.8(typescript@5.4.5))(vuetify@3.7.2): dependencies: - '@vuetify/loader-shared': 2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.7.2(typescript@5.4.5)(vite-plugin-vuetify@2.0.4)(vue@3.5.8(typescript@5.4.5))) + '@vuetify/loader-shared': 2.0.3(vue@3.5.8(typescript@5.4.5))(vuetify@3.7.2) debug: 4.3.7 upath: 2.0.1 vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4) @@ -20467,6 +20243,34 @@ snapshots: dependencies: string-width: 4.2.3 + winston-daily-rotate-file@5.0.0(winston@3.17.0): + dependencies: + file-stream-rotator: 0.6.1 + object-hash: 3.0.0 + triple-beam: 1.4.1 + winston: 3.17.0 + winston-transport: 4.9.0 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.17.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.5 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 diff --git a/puppeteer.config.mjs b/puppeteer.config.mjs deleted file mode 100644 index 60afe770..00000000 --- a/puppeteer.config.mjs +++ /dev/null @@ -1,9 +0,0 @@ -import path from 'node:path' - -/** - * @type {import("puppeteer").Configuration} - */ -export default { - // Changes the cache location for Puppeteer. - cacheDirectory: path.join(__dirname, './node_modules/.cache', 'puppeteer'), -} diff --git a/server/api/auth/me.get.ts b/server/api/auth/me.get.ts new file mode 100644 index 00000000..4ad5f372 --- /dev/null +++ b/server/api/auth/me.get.ts @@ -0,0 +1,25 @@ +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { getUserById } = useUser() + + // Get the user data from our database + const user = await getUserById(session.id) + + if (!user) { + throw createError({ + statusCode: 404, + message: 'User not found', + }) + } + + return { + data: user, + } + } + catch (error: any) { + logger.error('[User API] Error fetching user:', error) + throw parseError(error) + } +}) diff --git a/server/api/me.patch.ts b/server/api/auth/me.patch.ts similarity index 83% rename from server/api/me.patch.ts rename to server/api/auth/me.patch.ts index 06ac7611..82d82203 100644 --- a/server/api/me.patch.ts +++ b/server/api/auth/me.patch.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { cleanDoubleSlashes } from 'ufo' export default defineEventHandler(async (event) => { try { @@ -21,7 +22,7 @@ export default defineEventHandler(async (event) => { const accessToken = await client.getAccessToken() - await $fetch(`${process.env.LOGTO_ENDPOINT}/api/my-account`, { + await $fetch(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT}/api/my-account`), { method: 'PATCH', body: { name: body?.name || null, @@ -37,6 +38,8 @@ export default defineEventHandler(async (event) => { return { success: true } } catch (error: any) { + logger.error('[Me API] Error updating user info:', error) + throw parseError(error) } }) diff --git a/server/api/auth/notification.patch.ts b/server/api/auth/notification.patch.ts new file mode 100644 index 00000000..aa12bd2a --- /dev/null +++ b/server/api/auth/notification.patch.ts @@ -0,0 +1,34 @@ +import { z } from 'zod' + +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const body = await readValidatedBody( + event, + body => z.object({ + email: z.boolean().nullable(), + desktop: z.boolean().nullable(), + product_updates: z.boolean().nullable(), + weekly_digest: z.boolean().nullable(), + important_updates: z.boolean().nullable(), + }).partial().parse(body), + ) + + const { updateUser } = useUser() + + await updateUser(session.id, { + ...(body.email !== undefined && { email_notifications: body.email }), + ...(body.desktop !== undefined && { desktop_notifications: body.desktop }), + ...(body.product_updates !== undefined && { product_updates_notifications: body.product_updates }), + ...(body.weekly_digest !== undefined && { weekly_digest_notifications: body.weekly_digest }), + ...(body.important_updates !== undefined && { important_updates_notifications: body.important_updates }), + }) + + return { success: true } + } + catch (error: any) { + logger.error('[Notification API] Error updating user notification settings:', error) + throw parseError(error) + } +}) diff --git a/server/api/auth/password.post.ts b/server/api/auth/password.post.ts new file mode 100644 index 00000000..cd7899c8 --- /dev/null +++ b/server/api/auth/password.post.ts @@ -0,0 +1,44 @@ +import { z } from 'zod' +import { cleanDoubleSlashes } from 'ufo' + +export default defineEventHandler(async (event) => { + try { + await defineEventOptions(event, { auth: true }) + + const client = useLogtoClient() + + const body = await readValidatedBody( + event, + body => z.object({ + password: z.string(), + password_new: z.string(), + }).parse(body), + ) + + const accessToken = await client.getAccessToken() + + const verification = await $fetch<{ verificationRecordId: string }>(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT}/api/verifications/password`), { + method: 'POST', + body: { password: body.password }, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + + await $fetch(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT}/api/my-account/password`), { + method: 'POST', + body: { password: body.password_new }, + headers: { + 'Authorization': `Bearer ${accessToken}`, + 'logto-verification-id': verification.verificationRecordId, + }, + }) + + return { success: true } + } + catch (error: any) { + logger.error('[Password API] Error updating user password:', error) + + throw parseError(error) + } +}) diff --git a/server/api/devices/index.delete.ts b/server/api/devices/index.delete.ts new file mode 100644 index 00000000..642447b4 --- /dev/null +++ b/server/api/devices/index.delete.ts @@ -0,0 +1,18 @@ +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { token } = await readBody(event) + + const { deleteDeviceToken } = useDeviceToken() + + await deleteDeviceToken(session.id, token) + + return { message: 'Token unregistration successful' } + } + catch (error: any) { + logger.error('[Device API] Error unregistering device token:', error) + + throw parseError(error) + } +}) diff --git a/server/api/devices/index.post.ts b/server/api/devices/index.post.ts new file mode 100644 index 00000000..86fd7c96 --- /dev/null +++ b/server/api/devices/index.post.ts @@ -0,0 +1,26 @@ +import { z } from 'zod' + +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { token } = await readValidatedBody(event, z.object({ token: z.string() }).parse) + + const { getDeviceToken, createDeviceToken } = useDeviceToken() + + const existingDeviceToken = await getDeviceToken(session.id, token) + + if (!existingDeviceToken) { + const createdToken = await createDeviceToken(session.id, token) + + return { message: 'Token registration successful', token: createdToken.token_device } + } + + return { message: 'Token registration successful' } + } + catch (error: any) { + logger.error('[Device API] Error registering device token:', error) + + throw parseError(error) + } +}) diff --git a/server/api/faq.get.ts b/server/api/faq.get.ts deleted file mode 100644 index 75fe03e9..00000000 --- a/server/api/faq.get.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useFaqCrud } from '@base/server/composables/useFaqCrud' - -export default defineEventHandler(async (event) => { - const { getFaqQuestions } = useFaqCrud() - - const faqs = await getFaqQuestions(getFilter(event)) - setResponseStatus(event, 200) - - return faqs -}) diff --git a/server/api/firebase.post.ts b/server/api/firebase.post.ts index 6120e33d..6656d3e8 100644 --- a/server/api/firebase.post.ts +++ b/server/api/firebase.post.ts @@ -1,5 +1,4 @@ import admin from 'firebase-admin' -import { useUserDeviceCrud } from '@base/server/composables/useUserDeviceCrud' import { z } from 'zod' export default defineEventHandler(async (event) => { @@ -13,19 +12,20 @@ export default defineEventHandler(async (event) => { if (admin.apps.length === 0) { admin.initializeApp({ - credential: admin.credential.cert(service), + credential: admin.credential.cert(service as admin.ServiceAccount), }) } - const { getUserDeviceAllTokens } = useUserDeviceCrud({ user_id }) - const response = await getUserDeviceAllTokens({} as ParsedFilterQuery) + const { getDeviceTokens } = useDeviceToken() - if (response && response.total === 0) { + const response = await getDeviceTokens(user_id) + + if (response && response.length === 0) { setResponseStatus(event, 200) return { message: 'No device found' } } else { - const tokens = response.data!.map((item: any) => item.token_device) + const tokens = response.map((item: any) => item.token_device) const body = { tokens, notification: { @@ -47,6 +47,8 @@ export default defineEventHandler(async (event) => { } } catch (error: any) { + logger.error('[Firebase API] Error sending notification:', error) + throw parseError(error) } }) diff --git a/server/api/logto/webhook.post.ts b/server/api/logto/webhook.post.ts new file mode 100644 index 00000000..1a99ccf2 --- /dev/null +++ b/server/api/logto/webhook.post.ts @@ -0,0 +1,277 @@ +import { createHmac } from 'node:crypto' +import { eq } from 'drizzle-orm' +import { userTable } from '@base/server/db/schemas' + +// Define Logto event types +type LogtoEventType = + | 'PostRegister' + | 'PostSignIn' + | 'User.Created' + | 'User.Deleted' + | 'User.Data.Updated' + | 'User.SuspensionStatus.Updated' + +// Define Logto webhook payload interface +interface LogtoWebhookPayload { + hookId: string + event: LogtoEventType + createdAt: string + userAgent?: string + ip?: string + userId?: string + user?: LogtoUserEntity + data?: LogtoUserEntity | null + params?: { id?: string, userId?: string } + interactionEvent?: string + sessionId?: string + applicationId?: string +} + +// Define Logto user entity interface +interface LogtoUserEntity { + id: string + username?: string + primaryEmail?: string + primaryPhone?: string + name?: string + avatar?: string + customData?: Record + identities?: Record + lastSignInAt?: string + createdAt?: string + applicationId?: string + isSuspended?: boolean +} + +// Define Logto identity interface +interface LogtoIdentity { + userId: string + details?: { + id?: string + email?: string + name?: string + avatar?: string + phone?: string + } +} + +// Get signing key from environment variable or config +const LOGTO_SIGNING_KEY = process.env.LOGTO_WEBHOOK_SIGNING_KEY || '' + +// Verify the Logto webhook signature +// eslint-disable-next-line node/prefer-global/buffer +function verifySignature(signingKey: string, rawBody: Buffer, signature: string): boolean { + if (!signingKey) + return false + + const hmac = createHmac('sha256', signingKey) + hmac.update(rawBody) + const computedSignature = hmac.digest('hex') + + return computedSignature === signature +} + +// Map Logto user data to our user schema +function mapLogtoUserToUserInput(logtoUser: LogtoUserEntity) { + return { + logto_id: logtoUser.id, + username: logtoUser.username, + name: logtoUser.name, + primary_email: logtoUser.primaryEmail, + primary_phone: logtoUser.primaryPhone, + avatar: logtoUser.avatar, + custom_data: logtoUser.customData, + last_sign_in_at: logtoUser.lastSignInAt ? new Date(logtoUser.lastSignInAt) : undefined, + is_suspended: logtoUser.isSuspended, + } +} + +// Process identities from Logto user data +async function processIdentities(userId: string, identities?: Record) { + if (!identities) + return + + const { upsertIdentity } = useIdentity() + + // Process each identity provider + for (const [provider, identity] of Object.entries(identities)) { + const providerUserId = identity?.details?.id || '' + if (!providerUserId) + continue + + // If we've made it here, we know identity.details exists + // Map the provider data from the identity details + const providerData = { + email: identity.details!.email, + name: identity.details!.name, + avatar: identity.details!.avatar, + phone: identity.details!.phone, + } + + // Create or update the identity entry + await upsertIdentity(userId, provider, providerUserId, providerData) + } +} + +export default defineEventHandler(async (event) => { + try { + // Get the raw request body as buffer for signature verification + // Use false parameter to get the raw buffer instead of parsed string + const rawBody = await readRawBody(event, false) + if (!rawBody) { + return sendError(event, createError({ + statusCode: 400, + statusMessage: 'Invalid request body', + })) + } + + // Get the signature from headers + const signature = getRequestHeader(event, 'logto-signature-sha-256') + if (!signature) { + return sendError(event, createError({ + statusCode: 400, + statusMessage: 'Missing signature header', + })) + } + + // Verify the signature with the raw body buffer + if (!verifySignature(LOGTO_SIGNING_KEY, rawBody, signature)) { + return sendError(event, createError({ + statusCode: 401, + statusMessage: 'Invalid signature', + })) + } + + // Parse the request body JSON + const body = JSON.parse(rawBody.toString()) as LogtoWebhookPayload + const { event: eventType, user, data, userId, params } = body + + // Get user composables + const { upsertUser, updateLastSignIn, updateSuspensionStatus, deleteUser } = useUser() + const { deleteIdentitiesByUserId } = useIdentity() + + // Handle different event types + switch (eventType) { + case 'PostSignIn': { + if (!user || !userId) { + return sendError(event, createError({ + statusCode: 400, + statusMessage: 'Missing user data for PostSignIn event', + })) + } + + // Create or update user data and update last sign-in time + const updatedUser = await upsertUser(userId, mapLogtoUserToUserInput(user)) + + // Process any identity information + await processIdentities(updatedUser.id, user.identities) + + // Update last sign-in time + await updateLastSignIn(updatedUser.id) + break + } + + case 'User.Created': { + if (!data?.id) { + return sendError(event, createError({ + statusCode: 400, + statusMessage: 'Missing user data for User.Created event', + })) + } + + // Create or update user + const createdUser = await upsertUser(data.id, mapLogtoUserToUserInput(data)) + + // Process any identity information + await processIdentities(createdUser.id, data.identities) + break + } + + case 'User.Deleted': { + const userId = params?.userId || data?.id + + if (!userId) { + return sendError(event, createError({ + statusCode: 400, + statusMessage: 'Missing userId for User.Deleted event', + })) + } + + // Find user by Logto ID + const user = await db.query.userTable.findFirst({ + where: eq(userTable.logto_id, userId), + }) + + if (user) { + // Delete identities first to maintain referential integrity + await deleteIdentitiesByUserId(user.id) + + // Then delete the user + await deleteUser(user.id) + } + break + } + + case 'User.Data.Updated': { + const userId = params?.userId || data?.id + + if (!data || !userId) { + return sendError(event, createError({ + statusCode: 400, + statusMessage: 'Missing user data for User.Data.Updated event', + })) + } + + // Update user data + const updatedUser = await upsertUser(userId, mapLogtoUserToUserInput(data)) + + // Process any identity information + await processIdentities(updatedUser.id, data.identities) + break + } + + case 'User.SuspensionStatus.Updated': { + const userId = params?.userId || data?.id + + if (!data || !userId) { + return sendError(event, createError({ + statusCode: 400, + statusMessage: 'Missing user data for User.SuspensionStatus.Updated event', + })) + } + + // Find user by Logto ID to get internal UUID + const user = await db.query.userTable.findFirst({ + where: eq(userTable.logto_id, userId), + }) + + if (user && data.isSuspended !== undefined) { + await updateSuspensionStatus(user.id, data.isSuspended) + } + break + } + + default: { + // Ignore other event types + console.log(`Unhandled Logto webhook event: ${eventType}`) + } + } + + // Return a success response + return { success: true, event: eventType } + } + catch (error: any) { + console.error('Error processing Logto webhook:', error) + + // If it's already a Nuxt error, just rethrow it + if (error.statusCode) { + throw error + } + + // Otherwise create a generic error + return sendError(event, createError({ + statusCode: 500, + statusMessage: error.message || 'Internal server error', + })) + } +}) diff --git a/server/api/notifications.ts b/server/api/notifications.ts new file mode 100644 index 00000000..af85fb05 --- /dev/null +++ b/server/api/notifications.ts @@ -0,0 +1,256 @@ +import { sub } from 'date-fns' + +const notifications = [{ + id: 1, + unread: true, + sender: { + name: 'Jordan Brown', + email: 'jordan.brown@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=2', + }, + }, + body: 'sent you a message', + date: sub(new Date(), { minutes: 7 }).toISOString(), +}, { + id: 2, + sender: { + name: 'Lindsay Walton', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { hours: 1 }).toISOString(), +}, { + id: 3, + unread: true, + sender: { + name: 'Taylor Green', + email: 'taylor.green@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=3', + }, + }, + body: 'sent you a message', + date: sub(new Date(), { hours: 3 }).toISOString(), +}, { + id: 4, + sender: { + name: 'Courtney Henry', + avatar: { + src: 'https://i.pravatar.cc/128?u=4', + }, + }, + body: 'added you to a project', + date: sub(new Date(), { hours: 3 }).toISOString(), +}, { + id: 5, + sender: { + name: 'Tom Cook', + avatar: { + src: 'https://i.pravatar.cc/128?u=5', + }, + }, + body: 'abandonned cart', + date: sub(new Date(), { hours: 7 }).toISOString(), +}, { + id: 6, + sender: { + name: 'Casey Thomas', + avatar: { + src: 'https://i.pravatar.cc/128?u=6', + }, + }, + body: 'purchased your product', + date: sub(new Date(), { days: 1, hours: 3 }).toISOString(), +}, { + id: 7, + unread: true, + sender: { + name: 'Kelly Wilson', + email: 'kelly.wilson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=8', + }, + }, + body: 'sent you a message', + date: sub(new Date(), { days: 2 }).toISOString(), +}, { + id: 8, + sender: { + name: 'Jamie Johnson', + email: 'jamie.johnson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=9', + }, + }, + body: 'requested a refund', + date: sub(new Date(), { days: 5, hours: 4 }).toISOString(), +}, { + id: 9, + unread: true, + sender: { + name: 'Morgan Anderson', + email: 'morgan.anderson@example.com', + }, + body: 'sent you a message', + date: sub(new Date(), { days: 6 }).toISOString(), +}, { + id: 10, + sender: { + name: 'Drew Moore', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 6 }).toISOString(), +}, { + id: 11, + sender: { + name: 'Riley Davis', + }, + body: 'abandonned cart', + date: sub(new Date(), { days: 7 }).toISOString(), +}, { + id: 12, + sender: { + name: 'Jordan Taylor', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 9 }).toISOString(), +}, { + id: 13, + sender: { + name: 'Kelly Wilson', + email: 'kelly.wilson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=8', + }, + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 10 }).toISOString(), +}, { + id: 14, + sender: { + name: 'Jamie Johnson', + email: 'jamie.johnson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=9', + }, + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 11 }).toISOString(), +}, { + id: 15, + sender: { + name: 'Morgan Anderson', + }, + body: 'purchased your product', + date: sub(new Date(), { days: 12 }).toISOString(), +}, { + id: 16, + sender: { + name: 'Drew Moore', + avatar: { + src: 'https://i.pravatar.cc/128?u=16', + }, + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 13 }).toISOString(), +}, { + id: 17, + sender: { + name: 'Riley Davis', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 14 }).toISOString(), +}, { + id: 18, + sender: { + name: 'Jordan Taylor', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 15 }).toISOString(), +}, { + id: 19, + sender: { + name: 'Kelly Wilson', + email: 'kelly.wilson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=8', + }, + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 16 }).toISOString(), +}, { + id: 20, + sender: { + name: 'Jamie Johnson', + email: 'jamie.johnson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=9', + }, + }, + body: 'purchased your product', + date: sub(new Date(), { days: 17 }).toISOString(), +}, { + id: 21, + sender: { + name: 'Morgan Anderson', + }, + body: 'abandonned cart', + date: sub(new Date(), { days: 17 }).toISOString(), +}, { + id: 22, + sender: { + name: 'Drew Moore', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 18 }).toISOString(), +}, { + id: 23, + sender: { + name: 'Riley Davis', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 19 }).toISOString(), +}, { + id: 24, + sender: { + name: 'Jordan Taylor', + avatar: { + src: 'https://i.pravatar.cc/128?u=24', + }, + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 20 }).toISOString(), +}, { + id: 25, + sender: { + name: 'Kelly Wilson', + email: 'kelly.wilson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=8', + }, + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 20 }).toISOString(), +}, { + id: 26, + sender: { + name: 'Jamie Johnson', + email: 'jamie.johnson@example.com', + avatar: { + src: 'https://i.pravatar.cc/128?u=9', + }, + }, + body: 'abandonned cart', + date: sub(new Date(), { days: 21 }).toISOString(), +}, { + id: 27, + sender: { + name: 'Morgan Anderson', + }, + body: 'subscribed to your email list', + date: sub(new Date(), { days: 22 }).toISOString(), +}] + +export default eventHandler(async () => { + return notifications +}) diff --git a/server/api/notifications/[notificationUId]/index.delete.ts b/server/api/notifications/[notificationUId]/index.delete.ts new file mode 100644 index 00000000..19afb036 --- /dev/null +++ b/server/api/notifications/[notificationUId]/index.delete.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session, notificationUId } = await defineEventOptions(event, { auth: true, params: ['notificationUId'] }) + + const { deleteNotificationById } = useNotification() + + return deleteNotificationById(notificationUId, session.id) + } + catch (error: any) { + logger.error('[Notification API] Error deleting notification:', error) + + throw parseError(error) + } +}) diff --git a/server/api/notifications/[notificationUId]/read.patch.ts b/server/api/notifications/[notificationUId]/read.patch.ts new file mode 100644 index 00000000..932957fa --- /dev/null +++ b/server/api/notifications/[notificationUId]/read.patch.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session, notificationUId } = await defineEventOptions(event, { auth: true, params: ['notificationUId'] }) + + const { readNotificationById } = useNotification() + + return readNotificationById(notificationUId, session.id) + } + catch (error: any) { + logger.error('[Notification API] Error marking notification as read:', error) + + throw parseError(error) + } +}) diff --git a/server/api/notifications/[notificationUId]/unread.patch.ts b/server/api/notifications/[notificationUId]/unread.patch.ts new file mode 100644 index 00000000..1d7c8acc --- /dev/null +++ b/server/api/notifications/[notificationUId]/unread.patch.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session, notificationUId } = await defineEventOptions(event, { auth: true, params: ['notificationUId'] }) + + const { unreadNotificationById } = useNotification() + + return unreadNotificationById(notificationUId, session.id) + } + catch (error: any) { + logger.error('[Notification API] Error marking notification as unread:', error) + + throw parseError(error) + } +}) diff --git a/server/api/notifications/index.get.ts b/server/api/notifications/index.get.ts new file mode 100644 index 00000000..a3d38361 --- /dev/null +++ b/server/api/notifications/index.get.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { getNotificationsPaginated } = useNotification() + + return getNotificationsPaginated(session.id, getFilter(event)) + } + catch (error: any) { + logger.error('[Notification API] Error fetching notifications:', error) + + throw parseError(error) + } +}) diff --git a/server/api/notifications/read.patch.ts b/server/api/notifications/read.patch.ts new file mode 100644 index 00000000..b654822e --- /dev/null +++ b/server/api/notifications/read.patch.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { markAllRead } = useNotification() + + return markAllRead(session.id) + } + catch (error: any) { + logger.error('[Notification API] Error marking all notifications as read:', error) + + throw parseError(error) + } +}) diff --git a/server/api/notifications/unread.get.ts b/server/api/notifications/unread.get.ts new file mode 100644 index 00000000..7768a3c0 --- /dev/null +++ b/server/api/notifications/unread.get.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { getNotificationsPaginated } = useNotification() + + return getNotificationsPaginated(session.id, getFilter(event), true) + } + catch (error: any) { + logger.error('[Notification API] Error fetching unread notifications:', error) + + throw parseError(error) + } +}) diff --git a/server/api/notifications/unread.patch.ts b/server/api/notifications/unread.patch.ts new file mode 100644 index 00000000..0ec65252 --- /dev/null +++ b/server/api/notifications/unread.patch.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { markAllUnread } = useNotification() + + return markAllUnread(session.id) + } + catch (error: any) { + logger.error('[Notification API] Error marking all notifications as unread:', error) + + throw parseError(error) + } +}) diff --git a/server/api/payments/payos/callback.get.ts b/server/api/payments/payos/callback.get.ts deleted file mode 100644 index f8531026..00000000 --- a/server/api/payments/payos/callback.get.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { eq } from 'drizzle-orm' -import { PaymentStatus, paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' -import { joinURL, withQuery } from 'ufo' - -export default defineEventHandler(async (event) => { - const runtimeConfig = useRuntimeConfig() - - try { - const { id } = getQuery(event) - const { session } = await defineEventOptions(event, { - auth: true, - }) - - if (!id) - throw new Error('Invalid Params') - - const { status, transactions, orderCode } = await payOSAdmin.getPaymentLinkInformation(id as string) - - const { user_payments, payment_provider_transactions } = (await db.select() - .from(paymentProviderTransactionTable) - .where(eq(paymentProviderTransactionTable.provider_transaction_id, orderCode.toString())) - .innerJoin(userPaymentTable, eq(userPaymentTable.id, paymentProviderTransactionTable.payment_id)))[0] - - if (!user_payments) - throw new Error('Order Not Found') - - if (payment_provider_transactions.provider_transaction_status !== PaymentStatus.PENDING) - throw new Error('Order Already Confirmed') - - if (status === 'PENDING') - throw new Error('Invalid Status') - - const transactionStatus = status === 'PAID' ? PaymentStatus.RESOLVED : PaymentStatus.FAILED - - await db.transaction(async (db) => { - const date = new Date(transactions[0].transactionDateTime) - await db.update(paymentProviderTransactionTable).set({ - provider_transaction_status: transactionStatus, - provider_transaction_resolved_at: date, - }).where(eq(paymentProviderTransactionTable.id, payment_provider_transactions.id)) - - await db.update(userPaymentTable).set({ - status: transactionStatus, - }).where(eq(userPaymentTable.id, user_payments.id)) - }) - - if (transactions[0].description.includes('credit') && transactionStatus === PaymentStatus.RESOLVED) { - const [_, amount] = payment_provider_transactions.provider_transaction_info.split(':') - await addCreditToUser(session, Number.parseInt(amount)) - } - - // TODO: Do something with the success - - return sendRedirect( - event, - withQuery( - joinURL( - runtimeConfig.public.appBaseUrl, - runtimeConfig.public.appPaymentRedirect, - ), - { paymentStatus: transactionStatus === PaymentStatus.RESOLVED ? 'success' : 'fail' }, - ), - 200, - ) - } - catch { - return sendRedirect( - event, - withQuery( - joinURL( - runtimeConfig.public.appBaseUrl, - runtimeConfig.public.appPaymentRedirect, - ), - { paymentStatus: 'fail' }, - ), - 200, - ) - } -}) diff --git a/server/api/payments/payos/cancel.get.ts b/server/api/payments/payos/cancel.get.ts deleted file mode 100644 index 60d8d31a..00000000 --- a/server/api/payments/payos/cancel.get.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { eq } from 'drizzle-orm' -import { PaymentStatus, paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' -import { joinURL, withQuery } from 'ufo' - -export default defineEventHandler(async (event) => { - const runtimeConfig = useRuntimeConfig() - - try { - const { code, cancel, status, orderCode } = getQuery(event) - - if (code !== '00' || !orderCode) - throw new Error('Invalid Params') - - if (cancel === 'true' && status === 'CANCELLED') { - const { user_payments, payment_provider_transactions } = (await db.select() - .from(paymentProviderTransactionTable) - .where(eq(paymentProviderTransactionTable.provider_transaction_id, orderCode.toString())) - .innerJoin(userPaymentTable, eq(userPaymentTable.id, paymentProviderTransactionTable.payment_id)))[0] - - if (!user_payments) - throw new Error('Order Not Found') - - if (payment_provider_transactions.provider_transaction_status === PaymentStatus.CANCELLED) - throw new Error('Order Already Cancelled') - - await db.transaction(async (db) => { - const date = new Date() - await db.update(paymentProviderTransactionTable).set({ - provider_transaction_status: PaymentStatus.CANCELLED, - provider_transaction_resolved_at: date, - }).where(eq(paymentProviderTransactionTable.id, payment_provider_transactions.id)) - - await db.update(userPaymentTable).set({ - status: PaymentStatus.CANCELLED, - }).where(eq(userPaymentTable.id, user_payments.id)) - }) - } - const runtimeConfig = useRuntimeConfig() - // TODO: Do something with the cancel - - return sendRedirect( - event, - withQuery( - joinURL( - runtimeConfig.public.appBaseUrl, - runtimeConfig.public.appPaymentRedirect, - ), - { paymentStatus: 'cancelled' }, - ), - 200, - ) - } - catch { - return sendRedirect( - event, - withQuery( - joinURL( - runtimeConfig.public.appBaseUrl, - runtimeConfig.public.appPaymentRedirect, - ), - { paymentStatus: 'cancelled' }, - ), - 200, - ) - } -}) diff --git a/server/api/payments/payos/checkout.post.ts b/server/api/payments/payos/checkout.post.ts index 8318cfcf..ad3ddb6f 100644 --- a/server/api/payments/payos/checkout.post.ts +++ b/server/api/payments/payos/checkout.post.ts @@ -1,22 +1,22 @@ export default defineEventHandler(async (event) => { try { - const { productIdentifier } = await readBody(event) const { session } = await defineEventOptions(event, { auth: true }) + const { productIdentifier } = await readBody(event) const paymentUrl = await createPaymentCheckout('payos', { productIdentifier, user: session, }) - setResponseStatus(event, 200) return { data: { - message: 'Success', paymentUrl, }, } } catch (error: any) { + logger.error('[Payment API] Error creating Payos checkout URL:', error) + throw parseError(error) } }) diff --git a/server/api/payments/payos/query.post.ts b/server/api/payments/payos/query.post.ts deleted file mode 100644 index d985f7ac..00000000 --- a/server/api/payments/payos/query.post.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' -import { eq } from 'drizzle-orm' - -export default defineEventHandler(async (event) => { - try { - const { paymentId } = await readBody(event) - - const { user_payments, payment_provider_transactions } = (await db.select() - .from(userPaymentTable) - .where(eq(userPaymentTable.id, paymentId)) - .innerJoin(paymentProviderTransactionTable, eq(paymentProviderTransactionTable.payment_id, userPaymentTable.id)))[0] - - if (!user_payments || !payment_provider_transactions) { - throw new Error('Payment not found') - } - - const data = await payOSAdmin.getPaymentLinkInformation(payment_provider_transactions.provider_transaction_id as string) - - setResponseStatus(event, 200) - return { - message: 'Success', - data, - } - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/payments/payos/webhook.post.ts b/server/api/payments/payos/webhook.post.ts index 47f8af81..b7118ed4 100644 --- a/server/api/payments/payos/webhook.post.ts +++ b/server/api/payments/payos/webhook.post.ts @@ -1,56 +1,81 @@ -import { eq } from 'drizzle-orm' -import { PaymentStatus, paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' +import { PaymentStatus } from '@base/server/db/schemas' export default defineEventHandler(async (event) => { try { - const data = await readBody(event) - const isValid = payOSAdmin.verifyPaymentWebhookData(data) + const body = await readBody(event) - if (!isValid) { - throw new Error(ErrorMessage.INVALID_BODY) + logger.log('[PayOS Webhook] Received webhook data:', body) + + const webhookData = getPayOSAdmin().verifyPaymentWebhookData(body) + + if (!webhookData) { + logger.error('[PayOS Webhook] Invalid webhook data received:', body) + throw createError({ + statusCode: 400, + message: ErrorMessage.INVALID_WEBHOOK_BODY, + data: body, + }) } - const { code, orderCode, transactionDateTime } = data + logger.log('[PayOS Webhook] Verified webhook data:', webhookData) + const transactionStatus = webhookData.code === '00' ? PaymentStatus.RESOLVED : PaymentStatus.FAILED - const { user_payments, payment_provider_transactions } = (await db.select() - .from(paymentProviderTransactionTable) - .where(eq(paymentProviderTransactionTable.provider_transaction_id, orderCode.toString())) - .innerJoin(userPaymentTable, eq(userPaymentTable.id, paymentProviderTransactionTable.payment_id)))[0] + const { updatePaymentStatus, updateProviderTransactionStatus, getProviderTransactionByOrderCode } = usePayment() - if (!user_payments) { - setResponseStatus(event, 200) - return { - success: true, - } + const paymentTransactionOfProvider = await getProviderTransactionByOrderCode(String(webhookData.orderCode)) + + if (!paymentTransactionOfProvider?.payment.order.package) { + logger.warn(`[PayOS Webhook] Transaction not found or invalid: orderCode=${webhookData.orderCode}`) + return { success: true } } - if (payment_provider_transactions.provider_transaction_status !== PaymentStatus.PENDING) { - setResponseStatus(event, 200) - return { - success: true, - } + logger.log(`[PayOS Webhook] Processing transaction: orderCode=${webhookData.orderCode}, status=${transactionStatus}`) + + const priceDiscount = Number(paymentTransactionOfProvider.payment.order.package.price_discount) + const price = Number(paymentTransactionOfProvider.payment.order.package.price) + + if (priceDiscount !== Number(webhookData.amount) && price !== Number(webhookData.amount)) { + logger.error(`[PayOS Webhook] Amount mismatch, transaction [${paymentTransactionOfProvider.id}]: expected=${price}, received=${webhookData.amount}`) + + throw createError({ + statusCode: 400, + message: 'Amount mismatch!', + }) } - const transactionStatus = code === '00' ? PaymentStatus.RESOLVED : PaymentStatus.FAILED + const creditAmount = Number(paymentTransactionOfProvider.payment.order.package.amount) + const userId = paymentTransactionOfProvider.payment.order.user_id + + // The userId is already the UUID from our database since we've updated + // our schemas to use UUID references between tables + logger.log(`[PayOS Webhook] Adding credits: userId=${userId}, amount=${creditAmount}`) - await db.transaction(async (db) => { - const date = new Date(transactionDateTime) - await db.update(paymentProviderTransactionTable).set({ - provider_transaction_status: transactionStatus, - provider_transaction_resolved_at: date, - }).where(eq(paymentProviderTransactionTable.id, payment_provider_transactions.id)) + await addCreditToUser(userId, creditAmount) - await db.update(userPaymentTable).set({ - status: transactionStatus, - }).where(eq(userPaymentTable.id, user_payments.id)) - }) + logger.log(`[PayOS Webhook] Credits added successfully: userId=${userId}, amount=${creditAmount}`) - setResponseStatus(event, 200) - return { - success: true, + if (!paymentTransactionOfProvider?.payment.order.package) { + logger.error(`[PayOS Webhook] No product found for transaction: ${webhookData.orderCode}`) + throw createError({ + statusCode: 400, + message: 'No product found for this transaction!', + }) } + + logger.log(`[PayOS Webhook] Updating transaction ${paymentTransactionOfProvider.id} to status: ${transactionStatus}`) + + await updateProviderTransactionStatus(paymentTransactionOfProvider.id, transactionStatus, webhookData.transactionDateTime) + + await updatePaymentStatus(paymentTransactionOfProvider.payment.id, transactionStatus) + + logger.log(`[PayOS Webhook] Transaction updated successfully: id=${paymentTransactionOfProvider.id}, status=${transactionStatus}`) + + logger.log('[PayOS Webhook] Webhook processing completed successfully') + return { success: true } } catch (error: any) { + logger.error('[PayOS Webhook] Error processing webhook:', error) + throw parseError(error) } }) diff --git a/server/api/payments/vnpay/checkout.post.ts b/server/api/payments/sepay/checkout.post.ts similarity index 67% rename from server/api/payments/vnpay/checkout.post.ts rename to server/api/payments/sepay/checkout.post.ts index 681a2078..65cab6a2 100644 --- a/server/api/payments/vnpay/checkout.post.ts +++ b/server/api/payments/sepay/checkout.post.ts @@ -1,24 +1,22 @@ export default defineEventHandler(async (event) => { try { - const clientIP = getRequestIP(event) const { session } = await defineEventOptions(event, { auth: true }) const { productIdentifier } = await readBody(event) - const paymentUrl = await createPaymentCheckout('vnpay', { - clientIP, + const paymentUrl = await createPaymentCheckout('sepay', { productIdentifier, user: session, }) - setResponseStatus(event, 200) return { data: { - message: 'Success', paymentUrl, }, } } catch (error: any) { + logger.error('[Payment API] Error creating SePay checkout URL:', error) + throw parseError(error) } }) diff --git a/server/api/payments/sepay/status.get.ts b/server/api/payments/sepay/status.get.ts new file mode 100644 index 00000000..147ed82b --- /dev/null +++ b/server/api/payments/sepay/status.get.ts @@ -0,0 +1,40 @@ +import { z } from 'zod' + +import { PaymentStatus } from '@base/server/db/schemas' + +export default defineEventHandler(async (event) => { + try { + await defineEventOptions(event, { auth: true }) + + const { description } = await getValidatedQuery( + event, + query => z.object({ + description: z.string().min(1, 'Payment description must be in the correct format!'), + }) + .refine((query) => { + const orderCode = query.description.slice(2) + + return orderCode.length === 16 + }, { message: 'Payment description must be in the correct format!' }) + .parse(query), + ) + + // remove the first 2 letters + const orderCode = description.slice(2) + + const { getProviderTransactionByOrderCode } = usePayment() + + const paymentTransactionOfProvider = await getProviderTransactionByOrderCode(String(orderCode)) + + return { + data: { + status: paymentTransactionOfProvider?.provider_transaction_status || PaymentStatus.PENDING, + }, + } + } + catch (error: any) { + logger.error('[Payment API] Error creating SePay checkout URL:', error) + + throw parseError(error) + } +}) diff --git a/server/api/payments/sepay/webhook.post.ts b/server/api/payments/sepay/webhook.post.ts new file mode 100644 index 00000000..a7866439 --- /dev/null +++ b/server/api/payments/sepay/webhook.post.ts @@ -0,0 +1,114 @@ +import { PaymentStatus } from '@base/server/db/schemas' +import { z } from 'zod' + +export default defineEventHandler(async (event) => { + try { + const body = await readValidatedBody( + event, + payload => z.object({ + accountNumber: z.string(), // e.g., "17228427" + accumulated: z.number(), // e.g., 0 + code: z.string(), // e.g., "SPN8NHOSTING123" + content: z.string(), // e.g., "MBVCB.9604208212.518683.SPN8NHOSTING123.CT tu 0041000331568 NGUYEN HUU NGUYEN Y toi 17228427 NGUYEN HUU NGUYEN Y tai ACB GD 518683-052325 23:34:40" + description: z.string(), // e.g., "BankAPINotify MBVCB.9604208212.518683.SPN8NHOSTING123.CT tu 0041000331568 NGUYEN HUU NGUYEN Y toi 17228427 NGUYEN HUU NGUYEN Y tai ACB GD 518683-052325 23:34:40" + gateway: z.string(), // e.g., "ACB" + id: z.number(), // e.g., 13425123 + referenceCode: z.string(), // e.g., "3165" + subAccount: z.string().optional().nullable(), // e.g., null + transactionDate: z.string(), // e.g., "2025-05-23 23:34:40" + transferAmount: z.number(), // e.g., 2000 + transferType: z.string(), // e.g., "in" + }).parse(payload), + ) + + if (process.env.SEPAY_WEBHOOK_SIGNING_KEY !== getHeader(event, 'Authorization')?.match(/Apikey (.*)/)?.[1]) { + logger.error('[SePay Webhook] Invalid webhook authentication') + throw createError({ + statusCode: 401, + message: 'Invalid webhook authentication', + }) + } + + logger.log('[SePay Webhook] Verified webhook data:', body) + + // SePay Webhook always success (if not, it will not call this endpoint anyway) + + const transactionStatus = PaymentStatus.RESOLVED + const orderCode = body.code.slice(2) || '' // Remove the first 2 characters (SP) + + const { updatePaymentStatus, updateProviderTransactionStatus, getProviderTransactionByOrderCode } = usePayment() + + const paymentTransactionOfProvider = await getProviderTransactionByOrderCode(String(orderCode)) + + if (!paymentTransactionOfProvider?.payment.order.package) { + logger.warn(`[SePay Webhook] Transaction not found or invalid: code=${orderCode}`) + return { success: true } + } + + logger.log(`[SePay Webhook] Processing transaction: code=${orderCode}, status=${transactionStatus}`) + + const userId = paymentTransactionOfProvider.payment.order.user_id + + const { getUserBestPrice, createReferenceUsage } = useReference() + + const reference = paymentTransactionOfProvider.payment.order.reference + + const price = await getUserBestPrice( + userId, + Number(paymentTransactionOfProvider.payment.order.package.price), + Number(paymentTransactionOfProvider.payment.order.package.price_discount), + reference?.code, + ) + + if (price !== Number(body.transferAmount)) { + logger.error(`[SePay Webhook] Amount mismatch, transaction [${paymentTransactionOfProvider.id}]: expected=${price}, received=${body.transferAmount}`) + + throw createError({ + statusCode: 400, + message: 'Amount mismatch!', + }) + } + + const creditAmount = Number(paymentTransactionOfProvider.payment.order.package.amount) + + // The userId is already the UUID from our database since we've updated + // our schemas to use UUID references between tables + logger.log(`[SePay Webhook] Adding credits: userId=${userId}, amount=${creditAmount}`) + + await addCreditToUser(userId, creditAmount) + + logger.log(`[SePay Webhook] Credits added successfully: userId=${userId}, amount=${creditAmount}`) + + if (!paymentTransactionOfProvider?.payment.order.package) { + logger.error(`[SePay Webhook] No product found for transaction: ${orderCode}`) + throw createError({ + statusCode: 400, + message: 'No product found for this transaction!', + }) + } + + logger.log(`[SePay Webhook] Updating transaction ${paymentTransactionOfProvider.id} to status: ${transactionStatus}`) + + await updateProviderTransactionStatus(paymentTransactionOfProvider.id, transactionStatus, body.transactionDate!) + + await updatePaymentStatus(paymentTransactionOfProvider.payment.id, transactionStatus) + + if (reference) { + await createReferenceUsage( + userId, + reference.id || '', + paymentTransactionOfProvider.id, + ) + } + + logger.log(`[SePay Webhook] Transaction updated successfully: id=${paymentTransactionOfProvider.id}, status=${transactionStatus}`) + + logger.log('[SePay Webhook] Webhook processing completed successfully') + return { success: true } + } + catch (error: any) { + logger.error('[SePay Webhook] Error processing webhook:', error) + + throw parseError(error) + } +}) diff --git a/server/api/payments/stripe/customers/[customerId]/subscriptions/index.post.ts b/server/api/payments/stripe/customers/[customerId]/subscriptions/index.post.ts index 81916752..6750dbf8 100644 --- a/server/api/payments/stripe/customers/[customerId]/subscriptions/index.post.ts +++ b/server/api/payments/stripe/customers/[customerId]/subscriptions/index.post.ts @@ -1,3 +1,5 @@ +import { useNitroApp } from 'nitropack/runtime' + export default defineEventHandler(async (event) => { const nitroApp = useNitroApp() const { customerId } = await defineEventOptions(event, { auth: true, params: ['customerId'] }) diff --git a/server/api/payments/stripe/customers/index.post.ts b/server/api/payments/stripe/customers/index.post.ts index c5ed8c32..ac77fb18 100644 --- a/server/api/payments/stripe/customers/index.post.ts +++ b/server/api/payments/stripe/customers/index.post.ts @@ -1,3 +1,5 @@ +import { useNitroApp } from 'nitropack/runtime' + export default defineEventHandler(async (event) => { const nitroApp = useNitroApp() await defineEventOptions(event, { auth: true }) diff --git a/server/api/payments/stripe/me.get.ts b/server/api/payments/stripe/me.get.ts index ac919cb1..339cfa7f 100644 --- a/server/api/payments/stripe/me.get.ts +++ b/server/api/payments/stripe/me.get.ts @@ -6,10 +6,10 @@ export default defineEventHandler(async (event) => { let subscriptions: Stripe.Subscription[] = [] - let customer = await getStripeCustomerByEmail(session.email!) + let customer = await getStripeCustomerByEmail(session.email as string) if (!customer) { - const { subscription, customer: newCustomer } = await createStripeCustomerOnSignup(session.email!) + const { subscription, customer: newCustomer } = await createStripeCustomerOnSignup(session.email as string) customer = newCustomer diff --git a/server/api/payments/stripe/products/[productId]/prices/index.get.ts b/server/api/payments/stripe/products/[productId]/prices/index.get.ts index 92506eb3..810d5b9b 100644 --- a/server/api/payments/stripe/products/[productId]/prices/index.get.ts +++ b/server/api/payments/stripe/products/[productId]/prices/index.get.ts @@ -1,7 +1,7 @@ export default defineEventHandler(async (event) => { - const { productId } = await defineEventOptions(event, { auth: true, params: ['productId'] }) + const { productId } = await defineEventOptions(event, { auth: false, params: ['productId'] }) const prices = await getStripeAllPrices(productId) - return prices + return { data: prices } }) diff --git a/server/api/payments/stripe/products/index.get.ts b/server/api/payments/stripe/products/index.get.ts index a50c3c62..27856f94 100644 --- a/server/api/payments/stripe/products/index.get.ts +++ b/server/api/payments/stripe/products/index.get.ts @@ -3,5 +3,5 @@ export default defineEventHandler(async (event) => { const products = await getStripeAllProducts() - return products + return { data: products } }) diff --git a/server/api/payments/vnpay/IPN.get.ts b/server/api/payments/vnpay/IPN.get.ts deleted file mode 100644 index 0a025287..00000000 --- a/server/api/payments/vnpay/IPN.get.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { eq } from 'drizzle-orm' -import type { VerifyIpnCall } from 'vnpay' -import { - InpOrderAlreadyConfirmed, - IpnFailChecksum, - IpnInvalidAmount, - IpnOrderNotFound, - IpnSuccess, - IpnUnknownError, -} from 'vnpay' -import { PaymentStatus, paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' - -function convertToSQLDateWithTimezone(input: string): Date { - // Extract date and time components from the input (assuming GMT+7) - const year = Number.parseInt(input.substring(0, 4)) - const month = Number.parseInt(input.substring(4, 6)) - 1 // JavaScript months are 0-indexed - const day = Number.parseInt(input.substring(6, 8)) - const hours = Number.parseInt(input.substring(8, 10)) - const minutes = Number.parseInt(input.substring(10, 12)) - const seconds = Number.parseInt(input.substring(12, 14)) - - // Create a Date object in UTC by adjusting for GMT+7 - const dateInGMT7 = new Date(Date.UTC(year, month, day, hours, minutes, seconds)) - const offsetInMilliseconds = -7 * 60 * 60 * 1000 // Convert from GMT+7 to UTC - const dateInUTC = new Date(dateInGMT7.getTime() - offsetInMilliseconds) - - return dateInUTC -} - -export default defineEventHandler(async (event) => { - try { - const { isSuccess, isVerified, vnp_TxnRef, vnp_TransactionNo, vnp_Amount, vnp_PayDate }: VerifyIpnCall = vnpayAdmin.verifyIpnCall(getQuery(event)) - setResponseStatus(event, 200) - - if (!isVerified) - return IpnFailChecksum - - const { user_payments, payment_provider_transactions } = (await db.select() - .from(userPaymentTable) - .where(eq(userPaymentTable.id, vnp_TxnRef)) - .innerJoin(paymentProviderTransactionTable, eq(paymentProviderTransactionTable.payment_id, userPaymentTable.id)))[0] - - if (!user_payments) - return IpnOrderNotFound - - if (user_payments.amount !== vnp_Amount.toString()) - return IpnInvalidAmount - - if (payment_provider_transactions.provider_transaction_status !== PaymentStatus.PENDING) - return InpOrderAlreadyConfirmed - - const transactionStatus = isSuccess ? PaymentStatus.RESOLVED : PaymentStatus.FAILED - const transactionDate = convertToSQLDateWithTimezone(vnp_PayDate?.toString() || '') - - await db.transaction(async (db) => { - await db.update(paymentProviderTransactionTable).set({ - provider_transaction_id: vnp_TransactionNo?.toString(), - provider_transaction_status: transactionStatus, - provider_transaction_resolved_at: transactionDate, - }).where(eq(paymentProviderTransactionTable.id, payment_provider_transactions.id)) - - await db.update(userPaymentTable).set({ - status: transactionStatus, - }).where(eq(userPaymentTable.id, user_payments.id)) - }) - - return IpnSuccess - } - catch { - return IpnUnknownError - } -}) diff --git a/server/api/payments/vnpay/callback.get.ts b/server/api/payments/vnpay/callback.get.ts deleted file mode 100644 index b096506f..00000000 --- a/server/api/payments/vnpay/callback.get.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { stringify } from 'node:querystring' -import { eq } from 'drizzle-orm' -import type { VerifyIpnCall } from 'vnpay' -import { - InpOrderAlreadyConfirmed, - IpnFailChecksum, - IpnInvalidAmount, - IpnOrderNotFound, - IpnUnknownError, -} from 'vnpay' -import { PaymentStatus, paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' -import { joinURL, withQuery } from 'ufo' - -function convertToSQLDateWithTimezone(input: string): Date { - // Extract date and time components from the input (assuming GMT+7) - const year = Number.parseInt(input.substring(0, 4)) - const month = Number.parseInt(input.substring(4, 6)) - 1 // JavaScript months are 0-indexed - const day = Number.parseInt(input.substring(6, 8)) - const hours = Number.parseInt(input.substring(8, 10)) - const minutes = Number.parseInt(input.substring(10, 12)) - const seconds = Number.parseInt(input.substring(12, 14)) - - // Create a Date object in UTC by adjusting for GMT+7 - const dateInGMT7 = new Date(Date.UTC(year, month, day, hours, minutes, seconds)) - const offsetInMilliseconds = 7 * 60 * 60 * 1000 // Convert from GMT+7 to UTC - const dateInUTC = new Date(dateInGMT7.getTime() - offsetInMilliseconds) - - return dateInUTC -} - -export default defineEventHandler(async (event) => { - try { - const { session } = await defineEventOptions(event, { - auth: true, - }) - - const { isSuccess, isVerified, vnp_OrderInfo, vnp_TxnRef, vnp_TransactionNo, vnp_Amount, vnp_PayDate }: VerifyIpnCall = vnpayAdmin.verifyIpnCall(getQuery(event)) - - if (!isVerified) - throw new Error('IpnFailChecksum') - - const { user_payments, payment_provider_transactions } = (await db.select() - .from(userPaymentTable) - .where(eq(userPaymentTable.id, vnp_TxnRef)) - .innerJoin(paymentProviderTransactionTable, eq(paymentProviderTransactionTable.payment_id, userPaymentTable.id)))[0] - - if (!user_payments) - throw new Error('IpnOrderNotFound') - - if (user_payments.amount !== vnp_Amount.toString()) - throw new Error('IpnInvalidAmount') - - if (payment_provider_transactions.provider_transaction_status !== PaymentStatus.PENDING) - throw new Error('InpOrderAlreadyConfirmed') - - const transactionStatus = isSuccess ? PaymentStatus.RESOLVED : PaymentStatus.FAILED - const transactionDate = convertToSQLDateWithTimezone(vnp_PayDate?.toString() || '') - - await db.transaction(async (db) => { - await db.update(paymentProviderTransactionTable).set({ - provider_transaction_id: vnp_TransactionNo?.toString(), - provider_transaction_status: transactionStatus, - provider_transaction_resolved_at: transactionDate, - }).where(eq(paymentProviderTransactionTable.id, payment_provider_transactions.id)) - - await db.update(userPaymentTable).set({ - status: transactionStatus, - }).where(eq(userPaymentTable.id, user_payments.id)) - }) - - // CHECK AND HANDLE TOP UP PAYMENT - if (isSuccess && vnp_OrderInfo.includes('credit')) { - const [_, amount] = payment_provider_transactions.provider_transaction_info.split(':') - await addCreditToUser(session, Number.parseInt(amount)) - } - - const runtimeConfig = useRuntimeConfig() - // TODO: Do something with the success - return sendRedirect( - event, - withQuery( - joinURL( - runtimeConfig.public.appBaseUrl, - runtimeConfig.public.appPaymentRedirect, - ), - { paymentStatus: isSuccess ? 'success' : 'fail' }, - ), - 200, - ) - } - catch (error: any) { - const runtimeConfig = useRuntimeConfig() - let errResponse = IpnUnknownError - switch (error.message) { - case 'IpnFailChecksum': - errResponse = IpnFailChecksum - break - case 'IpnOrderNotFound': - errResponse = IpnOrderNotFound - break - case 'IpnInvalidAmount': - errResponse = IpnInvalidAmount - break - case 'InpOrderAlreadyConfirmed': - errResponse = InpOrderAlreadyConfirmed - break - default: - break - } - const queryString = stringify(errResponse) - // TODO: Do something with the error - return sendRedirect( - event, - `${joinURL( - runtimeConfig.public.appBaseUrl, - runtimeConfig.public.appPaymentRedirect, - )}?${queryString}`, - 200, - ) - } -}) diff --git a/server/api/payments/vnpay/query.post.ts b/server/api/payments/vnpay/query.post.ts deleted file mode 100644 index c5ff7b40..00000000 --- a/server/api/payments/vnpay/query.post.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { QueryDr, QueryDrResponse } from 'vnpay' -import { generateRandomString } from 'vnpay' -import { format } from 'date-fns' -import { paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' -import { eq } from 'drizzle-orm' - -export default defineEventHandler(async (event) => { - try { - const { paymentId } = await readBody(event) - - const { user_payments, payment_provider_transactions } = (await db.select() - .from(userPaymentTable) - .where(eq(userPaymentTable.id, paymentId)) - .innerJoin(paymentProviderTransactionTable, eq(paymentProviderTransactionTable.payment_id, userPaymentTable.id)))[0] - - if (!user_payments || !payment_provider_transactions) { - throw new Error('Payment not found') - } - - const ipAddr = getRequestIP(event) - const date = new Date().getTime().toString() - const data: QueryDrResponse = await vnpayAdmin.queryDr({ - vnp_RequestId: generateRandomString(16), - vnp_IpAddr: ipAddr || '127.0.0.1', - vnp_TxnRef: paymentId, - vnp_OrderInfo: payment_provider_transactions.provider_transaction_info, - vnp_TransactionNo: payment_provider_transactions.provider_transaction_id, - vnp_TransactionDate: Number(format(payment_provider_transactions.provider_transaction_resolved_at ?? new Date(), 'yyyyMMddHHmmss')), - vnp_CreateDate: date, - } as unknown as QueryDr) - - setResponseStatus(event, 200) - return { - message: 'Success', - data, - } - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/products/credit-packages.get.ts b/server/api/products/credit-packages.get.ts new file mode 100644 index 00000000..89ad23c1 --- /dev/null +++ b/server/api/products/credit-packages.get.ts @@ -0,0 +1,16 @@ +export default defineEventHandler(async (event) => { + try { + await defineEventOptions(event) + + const { getCreditPackages } = useProduct() + + const creditPackages = await getCreditPackages() + + return { data: creditPackages } + } + catch (error: any) { + logger.error('[Products API] Error fetching products:', error) + + throw parseError(error) + } +}) diff --git a/server/api/products/index.get.ts b/server/api/products/index.get.ts new file mode 100644 index 00000000..4b7c3f2e --- /dev/null +++ b/server/api/products/index.get.ts @@ -0,0 +1,16 @@ +export default defineEventHandler(async (event) => { + try { + await defineEventOptions(event) + + const { getProducts } = useProduct() + + const products = await getProducts() + + return { data: products } + } + catch (error: any) { + logger.error('[Products API] Error fetching products:', error) + + throw parseError(error) + } +}) diff --git a/server/api/ref/[referCode].get.ts b/server/api/ref/[referCode].get.ts new file mode 100644 index 00000000..174164e2 --- /dev/null +++ b/server/api/ref/[referCode].get.ts @@ -0,0 +1,19 @@ +import { withQuery } from 'ufo' + +export default defineEventHandler(async (event) => { + try { + const { referCode } = await defineEventOptions(event, { params: [REFERENCE_CODE_COOKIE_NAME] }) + + setCookie(event, REFERENCE_CODE_COOKIE_NAME, referCode, { + httpOnly: true, + }) + + return sendRedirect(event, withQuery('/pricing', { referCode }), 301) + } + catch (error: any) { + throw createError({ + statusCode: 503, + statusMessage: error.message, + }) + } +}) diff --git a/server/api/scopes.get.ts b/server/api/scopes.get.ts index e4273dfc..815535f7 100644 --- a/server/api/scopes.get.ts +++ b/server/api/scopes.get.ts @@ -5,6 +5,8 @@ export default defineEventHandler(async (event) => { return await getUserScopes() } catch (error: any) { + logger.error('[Scopes API] Error fetching scopes:', error) + throw parseError(error) } }) diff --git a/server/api/users/[userId]/devices/index.delete.ts b/server/api/users/[userId]/devices/index.delete.ts deleted file mode 100644 index 6ae68cec..00000000 --- a/server/api/users/[userId]/devices/index.delete.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useUserDeviceCrud } from '@base/server/composables/useUserDeviceCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - const { token } = await readBody(event) - - const { deleteUserDeviceToken } = useUserDeviceCrud({ user_id: userId }) - await deleteUserDeviceToken(token) - setResponseStatus(event, 200) - return { message: 'Token unregistration successful' } - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/devices/index.get.ts b/server/api/users/[userId]/devices/index.get.ts deleted file mode 100644 index 8d35b188..00000000 --- a/server/api/users/[userId]/devices/index.get.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useUserDeviceCrud } from '@base/server/composables/useUserDeviceCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const { getUserDeviceAllTokens } = useUserDeviceCrud({ user_id: userId }) - - const tokens = await getUserDeviceAllTokens({} as ParsedFilterQuery) - setResponseStatus(event, 200) - return tokens - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/devices/index.post.ts b/server/api/users/[userId]/devices/index.post.ts deleted file mode 100644 index 83cd65e0..00000000 --- a/server/api/users/[userId]/devices/index.post.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useUserDeviceCrud } from '@base/server/composables/useUserDeviceCrud' -import { z } from 'zod' - -export default defineEventHandler(async (event) => { - const { session, userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const nitroApp = useNitroApp() - - try { - const { token } = await readValidatedBody(event, z.object({ token: z.string() }).parse) - - const { getUserDeviceToken, createUserDeviceToken } = useUserDeviceCrud({ user_id: userId }) - const dataTokenExists = await getUserDeviceToken(token) - - if (!dataTokenExists?.data) { - const tokenRegistered = await createUserDeviceToken({ - user_id: userId, - token_device: token, - }) - return { message: 'Token registration successful', token: tokenRegistered.data.token_device } - } - return { message: 'Token registration successful' } - } - catch (error: any) { - const _error = parseError(error) - - if (_error.data?.code === '23503') - await nitroApp.hooks.callHook('session:cache:clear', { providerAccountId: session.sub }) - - throw _error - } -}) diff --git a/server/api/users/[userId]/notifications/[notificationUId].delete.ts b/server/api/users/[userId]/notifications/[notificationUId].delete.ts deleted file mode 100644 index 7d00f8d9..00000000 --- a/server/api/users/[userId]/notifications/[notificationUId].delete.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useNotificationCrud } from '@base/server/composables/useNotificationCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId, notificationUId } = await defineEventOptions(event, { auth: true, params: ['userId', 'notificationUId'] }) - - const queryRestrict = { user_id: userId } - const { deleteNotificationById } = useNotificationCrud(queryRestrict) - - const data = await deleteNotificationById(notificationUId) - - setResponseStatus(event, 200) - - return data - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/notifications/[notificationUId].patch.ts b/server/api/users/[userId]/notifications/[notificationUId].patch.ts deleted file mode 100644 index 4fd31caa..00000000 --- a/server/api/users/[userId]/notifications/[notificationUId].patch.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useNotificationCrud } from '@base/server/composables/useNotificationCrud' -import { createInsertSchema } from 'drizzle-zod' -import { sysNotificationTable } from '@base/server/db/schemas' - -export default defineEventHandler(async (event) => { - try { - const { userId, notificationUId } = await defineEventOptions(event, { auth: true, params: ['userId', 'notificationUId'] }) - - const queryRestrict = { user_id: userId } - const { updateNotificationById } = useNotificationCrud(queryRestrict) - - const body = await readValidatedBody(event, createInsertSchema(sysNotificationTable).partial().parse) - - if (body && body.read_at) { - body.read_at = new Date(body.read_at) - } - - const data = await updateNotificationById(notificationUId, body) - - setResponseStatus(event, 200) - - return data - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/notifications/index.get.ts b/server/api/users/[userId]/notifications/index.get.ts deleted file mode 100644 index fff7fe9d..00000000 --- a/server/api/users/[userId]/notifications/index.get.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useNotificationCrud } from '@base/server/composables/useNotificationCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const queryRestrict = { user_id: userId } - const { getNotificationsPaginated } = useNotificationCrud(queryRestrict) - - const notifications = await getNotificationsPaginated(getFilter(event)) - - setResponseStatus(event, 200) - - return notifications.data - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/notifications/mark-all-read.patch.ts b/server/api/users/[userId]/notifications/mark-all-read.patch.ts deleted file mode 100644 index 12fbe022..00000000 --- a/server/api/users/[userId]/notifications/mark-all-read.patch.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useNotificationCrud } from '@base/server/composables/useNotificationCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const queryRestrict = { user_id: userId, markAllRead: true } - const { markAllRead } = useNotificationCrud(queryRestrict) - const response = await markAllRead() - - return response - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/notifications/mark-all-unread.patch.ts b/server/api/users/[userId]/notifications/mark-all-unread.patch.ts deleted file mode 100644 index 23923744..00000000 --- a/server/api/users/[userId]/notifications/mark-all-unread.patch.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useNotificationCrud } from '@base/server/composables/useNotificationCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const queryRestrict = { user_id: userId, markAllUnread: true } - const { markAllUnread } = useNotificationCrud(queryRestrict) - const response = await markAllUnread() - - return response - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/notifications/unread.get.ts b/server/api/users/[userId]/notifications/unread.get.ts deleted file mode 100644 index aaaf0c3a..00000000 --- a/server/api/users/[userId]/notifications/unread.get.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { useNotificationCrud } from '@base/server/composables/useNotificationCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - const queryRestrict = { user_id: userId, markAllRead: true } - const { countNotifications } = useNotificationCrud(queryRestrict) - const notifications = await countNotifications() - setResponseStatus(event, 200) - return notifications - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/shortcuts/[shortcutUId].delete.ts b/server/api/users/[userId]/shortcuts/[shortcutUId].delete.ts deleted file mode 100644 index fb0be76d..00000000 --- a/server/api/users/[userId]/shortcuts/[shortcutUId].delete.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { useShortcutCrud } from '@base/server/composables/useShortcutCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId, shortcutUId } = await defineEventOptions(event, { auth: true, params: ['userId', 'shortcutUId'] }) - - const { deleteShortcutById } = useShortcutCrud(userId) - - const data = await deleteShortcutById(shortcutUId) - - setResponseStatus(event, 200) - - return data - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/shortcuts/[shortcutUId].get.ts b/server/api/users/[userId]/shortcuts/[shortcutUId].get.ts deleted file mode 100644 index adabda33..00000000 --- a/server/api/users/[userId]/shortcuts/[shortcutUId].get.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { and, eq } from 'drizzle-orm' -import { userShortcutTable } from '@base/server/db/schemas' - -export default defineEventHandler(async (event) => { - try { - const { userId, shortcutUId } = await defineEventOptions(event, { auth: true, params: ['userId', 'shortcutUId'] }) - - const userShortcut = await db.select().from(userShortcutTable) - .where( - and( - eq(userShortcutTable.user_id, userId), - eq(userShortcutTable.id, shortcutUId), - ), - ) - .limit(1) - - setResponseStatus(event, 201) - - return { data: userShortcut[0] } - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/shortcuts/[shortcutUId].patch.ts b/server/api/users/[userId]/shortcuts/[shortcutUId].patch.ts deleted file mode 100644 index 357ad205..00000000 --- a/server/api/users/[userId]/shortcuts/[shortcutUId].patch.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { eq } from 'drizzle-orm' -import { userShortcutTable } from '@base/server/db/schemas' -import { createInsertSchema } from 'drizzle-zod' - -export default defineEventHandler(async (event) => { - try { - const { userId, shortcutUId } = await defineEventOptions(event, { auth: true, params: ['userId', 'shortcutUId'] }) - - const body = await readValidatedBody(event, createInsertSchema(userShortcutTable).partial().parse) - - const userShortcut = await db.update(userShortcutTable) - .set({ ...body, user_id: userId }) - .where(eq(userShortcutTable.id, shortcutUId)) - .returning() - - setResponseStatus(event, 201) - - return { data: userShortcut } - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/shortcuts/count.get.ts b/server/api/users/[userId]/shortcuts/count.get.ts deleted file mode 100644 index 8e89d810..00000000 --- a/server/api/users/[userId]/shortcuts/count.get.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { count, eq } from 'drizzle-orm' -import { userShortcutTable } from '@base/server/db/schemas' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const userShortcutSubquery = db.select().from(userShortcutTable) - .where( - eq(userShortcutTable.user_id, userId), - ) - - const total = await db.select({ count: count() }).from(userShortcutSubquery.as('count')) - - return { - total, - } - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/shortcuts/index.get.ts b/server/api/users/[userId]/shortcuts/index.get.ts deleted file mode 100644 index de58326b..00000000 --- a/server/api/users/[userId]/shortcuts/index.get.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useShortcutCrud } from '@base/server/composables/useShortcutCrud' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const { getShortcutsPaginated } = useShortcutCrud(userId) - - const userShortcuts = await getShortcutsPaginated({ - ...getFilter(event), - sortBy: 'route', - }) - - return userShortcuts - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/api/users/[userId]/shortcuts/index.post.ts b/server/api/users/[userId]/shortcuts/index.post.ts deleted file mode 100644 index d5d61297..00000000 --- a/server/api/users/[userId]/shortcuts/index.post.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useShortcutCrud } from '@base/server/composables/useShortcutCrud' -import { createInsertSchema } from 'drizzle-zod' -import { userShortcutTable } from '@base/server/db/schemas' - -export default defineEventHandler(async (event) => { - try { - const { userId } = await defineEventOptions(event, { auth: true, params: ['userId'] }) - - const body = await readValidatedBody(event, createInsertSchema(userShortcutTable).partial().parse) - - const { createShortcut } = useShortcutCrud(userId) - - const userShortcut = await createShortcut({ ...body, user_id: userId }) - - setResponseStatus(event, 201) - - return userShortcut - } - catch (error: any) { - throw parseError(error) - } -}) diff --git a/server/composables/useCredit.ts b/server/composables/useCredit.ts new file mode 100644 index 00000000..beb0b6b6 --- /dev/null +++ b/server/composables/useCredit.ts @@ -0,0 +1,41 @@ +import type { CreditHistoryType } from '@base/server/db/schemas' +import { ProductStatus, creditHistoryTable } from '@base/server/db/schemas' +import type { CreditHistory, Product } from '@base/server/types/models' + +export function useCredit() { + function getProducts(): Promise { + return db.query.productTable.findMany({ + where(schema, { eq }) { + return eq(schema.status, ProductStatus.ACTIVE) + }, + orderBy(fields, { asc }) { + return asc(fields.price) + }, + }) + } + + async function updateCreditHistory( + type: CreditHistoryType, + amount: number, + userId: string, + ): Promise { + return (await db.insert(creditHistoryTable) + .values({ + amount, + type, + user_id: userId, + }) + .returning())[0] + } + + function updateUserCredit(userId: string, credit: number) { + return useUser() + .upsertUser(userId, { credit }) + } + + return { + getProducts, + updateCreditHistory, + updateUserCredit, + } +} diff --git a/server/composables/useCrud.ts b/server/composables/useCrud.ts deleted file mode 100644 index eaea4fc9..00000000 --- a/server/composables/useCrud.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { and, asc, count, desc, eq, ilike, or } from 'drizzle-orm' -import type { InferInsertModel, InferSelectModel } from 'drizzle-orm' -import type { PgTable } from 'drizzle-orm/pg-core' -import type { ParsedFilterQuery } from '@base/server/utils/filter' - -interface CrudOptions { - searchBy?: Array - queryRestrict?: () => any -} - -export function useCrud(sourceTable: T, options?: CrudOptions) { - async function getRecordsPaginated(opts: Partial) { - const { keyword = '', keywordLower = '', sortBy = 'created_at', sortAsc = true, limit = 10, page = 1, withCount = false } = opts - - const searchConditions = [] - - if (Array.isArray(options?.searchBy)) { - for (const field of options.searchBy) { - if (keyword || keywordLower) { - searchConditions.push(...[ - sourceTable[field] && ilike(sourceTable[field] as any, `%${keyword || ''}%`), - sourceTable[field] && ilike(sourceTable[field] as any, `%${keywordLower || ''}%`), - ]) - } - } - } - - const sysRecordSubquery = db.select().from(sourceTable) - .where( - and(...[ - options?.queryRestrict?.(), - searchConditions.length && or( - ...searchConditions.filter(Boolean), - ), - ].filter(Boolean)), - ) - - let total = 0 - - if (withCount) { - total = ( - await db.select({ count: count() }).from(sysRecordSubquery.as('count')) - )[0]?.count || 0 - } - - const sysRecords = await sysRecordSubquery - .orderBy( - sortAsc ? asc((sourceTable as any)[sortBy]) : desc((sourceTable as any)[sortBy]), - ) - .offset((page - 1) * limit) - .limit(limit) - - if (!withCount) - total = sysRecords.length - - return { - data: sysRecords as InferSelectModel[], - total, - } - } - - async function getRecordByKey(key: keyof T, value: any) { - const sysRecord = ( - await db.select().from(sourceTable) - .where( - and( - ...[ - options?.queryRestrict?.(), - eq(sourceTable[key] as any, value), - ].filter(Boolean), - - ), - ) - .limit(1) - )[0] - - return { data: sysRecord as InferSelectModel } - } - - async function updateRecordByKey(key: keyof T, value: any, body: InferInsertModel) { - const sysRecord = ( - await db.update(sourceTable) - .set(body) - .where( - and( - - ...[ - options?.queryRestrict?.(), - eq(sourceTable[key] as any, value), - ].filter(Boolean), - ), - ) - .returning() - )[0] - - return { data: sysRecord as InferSelectModel } - } - - async function createRecord(body: InferInsertModel) { - const sysRecord = ( - await db.insert(sourceTable) - .values(body) - .returning() - )[0] - - return { data: sysRecord as InferSelectModel } - } - - async function deleteRecordByKey(key: keyof T, value: any) { - const sysRecord = await db.delete(sourceTable) - .where( - and( - ...[ - options?.queryRestrict?.(), - eq(sourceTable[key] as any, value), - ].filter(Boolean), - ), - ) - .returning() - - return { data: sysRecord as InferSelectModel } - } - - async function countRecords() { - const sysRecordSubquery = db.select().from(sourceTable).where(options?.queryRestrict?.()) - - const response = ( - await db.select({ count: count() }).from(sysRecordSubquery.as('count')) - )[0] - - return { - total: response?.count || 0, - } - } - async function updateManyRecords(body: InferInsertModel) { - if (!options?.queryRestrict) { - throw createError({ - statusCode: 500, - statusMessage: 'Query restrict option is required for updating many records.', - }) - } - - const sysRecord = ( - await db.update(sourceTable) - .set(body) - .where( - options?.queryRestrict?.(), - ) - .returning() - ) - - return { data: sysRecord as InferSelectModel[] } - } - - return { - getRecordsPaginated, - getRecordByKey, - createRecord, - updateRecordByKey, - deleteRecordByKey, - countRecords, - updateManyRecords, - } -} diff --git a/server/composables/useDeviceToken.ts b/server/composables/useDeviceToken.ts new file mode 100644 index 00000000..83a9423e --- /dev/null +++ b/server/composables/useDeviceToken.ts @@ -0,0 +1,42 @@ +import { and, eq } from 'drizzle-orm' +import { deviceTable } from '@base/server/db/schemas' +import type { Device } from '@base/server/types/models' + +export function useDeviceToken() { + async function getDeviceTokens(userId: string): Promise { + return db.query.deviceTable.findMany({ + where: eq(deviceTable.user_id, userId), + }) + } + + function getDeviceToken(userId: string, deviceToken: string): Promise { + return db.query.deviceTable.findFirst({ + where: (schema, { eq }) => { + return eq(schema.token_device, deviceToken) + }, + }) + } + + async function createDeviceToken(userId: string, deviceToken: string): Promise { + return (await db.insert(deviceTable).values({ + user_id: userId, + token_device: deviceToken, + }).returning())[0] + } + + function deleteDeviceToken(userId: string, deviceToken: string) { + return db.delete(deviceTable).where( + and( + eq(deviceTable.user_id, userId), + eq(deviceTable.token_device, deviceToken), + ), + ) + } + + return { + getDeviceToken, + getDeviceTokens, + createDeviceToken, + deleteDeviceToken, + } +} diff --git a/server/composables/useFaqCrud.ts b/server/composables/useFaqCrud.ts deleted file mode 100644 index a89cd944..00000000 --- a/server/composables/useFaqCrud.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { sysFaqTable } from '../db/schemas/sys_faqs.schema' -import { sysFaqCategoryTable } from '../db/schemas/sys_faq_categories.schema' -import { useCrud } from './useCrud' - -export function useFaqCrud() { - const { getRecordsPaginated: getRecordsFaqCategories } = useCrud(sysFaqCategoryTable) - - const { getRecordsPaginated } = useCrud(sysFaqTable, { - searchBy: ['question'], - }) - - async function getFaqQuestions(options: ParsedFilterQuery) { - const { data: categories } = await getRecordsFaqCategories({}) - - const { data: faqs } = await getRecordsPaginated(options) - - const faqCategories = categories.map(category => ({ ...category, questions: [] as typeof faqs })) - - for (const faq of faqs) { - const category = faqCategories.find(item => item.id === faq.category_id) - if (category) { - category.questions.push(faq) - } - } - return faqCategories - } - - return { - getFaqQuestions, - } -} diff --git a/server/composables/useIdentity.ts b/server/composables/useIdentity.ts new file mode 100644 index 00000000..9bffcbaf --- /dev/null +++ b/server/composables/useIdentity.ts @@ -0,0 +1,79 @@ +import { and, eq } from 'drizzle-orm' +import { identityTable } from '../db/schemas' +import type { Identity } from '../types/models' + +export function useIdentity() { + function getIdentitiesByUserId(userId: string): Promise { + return db.query.identityTable.findMany({ + where: eq(identityTable.user_id, userId), + }) + } + + function getIdentityByProvider(userId: string, provider: string): Promise { + return db.query.identityTable.findFirst({ + where: (fields, { and, eq }) => and( + eq(fields.user_id, userId), + eq(fields.provider, provider), + ), + }) + } + + async function createIdentity( + userId: string, + provider: string, + providerUserId: string, + providerData: Record, + ): Promise { + return (await db.insert(identityTable).values({ + user_id: userId, + provider, + provider_user_id: providerUserId, + provider_data: providerData || {}, + }).returning())[0] + } + + async function updateIdentity( + identityId: string, + data: Partial>, + ): Promise { + return (await db.update(identityTable) + .set({ + ...data, + updated_at: new Date(), + }) + .where(eq(identityTable.id, identityId)) + .returning())[0] + } + + async function upsertIdentity( + userId: string, + provider: string, + providerUserId: string, + providerData: Record, + ): Promise { + const existingIdentity = await getIdentityByProvider(userId, provider) + + if (existingIdentity) { + return updateIdentity(existingIdentity.id, { + provider_user_id: providerUserId, + provider_data: providerData, + }) + } + + return createIdentity(userId, provider, providerUserId, providerData) + } + + function deleteIdentitiesByUserId(userId: string) { + return db.delete(identityTable) + .where(eq(identityTable.user_id, userId)) + } + + return { + getIdentitiesByUserId, + getIdentityByProvider, + createIdentity, + updateIdentity, + upsertIdentity, + deleteIdentitiesByUserId, + } +} diff --git a/server/composables/useNotification.ts b/server/composables/useNotification.ts new file mode 100644 index 00000000..1c77f3ad --- /dev/null +++ b/server/composables/useNotification.ts @@ -0,0 +1,153 @@ +import { and, count, eq, ilike, isNotNull, isNull, or } from 'drizzle-orm' +import { notificationTable } from '@base/server/db/schemas' +import type { Notification, PaginatedResponse, PaginationOptions } from '@base/server/types/models' + +export function useNotification() { + async function getNotificationCount( + userId: string, + options: Partial, + unread?: boolean, + ): Promise<{ total: number }> { + const data = await db.select({ total: count() }).from(notificationTable).where( + and( + eq(notificationTable.user_id, userId), + unread ? isNull(notificationTable.read_at) : undefined, + or( + ilike(notificationTable.title, `%${options?.keyword || ''}%`), + ilike(notificationTable.message, `%${options?.keyword || ''}%`), + ilike(notificationTable.title, `%${options?.keywordLower || ''}%`), + ilike(notificationTable.message, `%${options?.keywordLower || ''}%`), + ), + ), + ) + + return data[0] + } + + async function getNotificationsPaginated( + userId: string, + options: Partial, + unread?: boolean, + ): Promise> { + const limit = options.limit || 20 + const page = options.page || 1 + + const notifications = await db.query.notificationTable.findMany({ + limit, + offset: limit * (page - 1), + orderBy(schema, { asc, desc }) { + return options.sortAsc + ? asc((schema as any)[options.sortBy || 'created_at']) + : desc((schema as any)[options.sortBy || 'created_at']) + }, + where(schema, { and, or, eq, ilike }) { + if (options.keyword && options.keywordLower) { + return and( + eq(schema.user_id, userId), + unread ? isNull(schema.read_at) : undefined, + or( + ilike(schema.title, `%${options.keyword}%`), + ilike(schema.message, `%${options.keyword}%`), + ilike(schema.title, `%${options.keywordLower}%`), + ilike(schema.message, `%${options.keywordLower}%`), + ), + ) + } + }, + }) + + const { total } = options.withCount + ? await getNotificationCount(userId, options, unread) + : { total: notifications.length } + + return { + data: notifications, + total, + } + } + + function getNotificationById(notificationId: string, userId: string): Promise { + return db.query.notificationTable.findFirst({ + where(schema, { and, eq }) { + return and( + eq(schema.user_id, userId), + eq(schema.id, notificationId), + ) + }, + }) + } + + type NotificationInput = Pick + + async function createNotification(userId: string, payload: Omit): Promise { + return (await db.insert(notificationTable).values({ + ...payload, + user_id: userId, + }).returning())[0] + } + + function readNotificationById(notificationId: string, userId: string) { + return db.update(notificationTable).set({ + read_at: new Date(), + }).where( + and( + eq(notificationTable.user_id, userId), + eq(notificationTable.id, notificationId), + ), + ) + } + + function unreadNotificationById(notificationId: string, userId: string) { + return db.update(notificationTable).set({ + read_at: null, + }).where( + and( + eq(notificationTable.user_id, userId), + eq(notificationTable.id, notificationId), + ), + ) + } + + function deleteNotificationById(notificationId: string, userId: string) { + return db.delete(notificationTable).where( + and( + eq(notificationTable.user_id, userId), + eq(notificationTable.id, notificationId), + ), + ) + } + + function markAllRead(userId: string) { + return db.update(notificationTable).set({ + read_at: new Date(), + }).where( + and( + eq(notificationTable.user_id, userId), + isNull(notificationTable.read_at), + ), + ) + } + + function markAllUnread(userId: string) { + return db.update(notificationTable).set({ + read_at: null, + }).where( + and( + eq(notificationTable.user_id, userId), + isNotNull(notificationTable.read_at), + ), + ) + } + + return { + getNotificationsPaginated, + getNotificationCount, + getNotificationById, + createNotification, + readNotificationById, + unreadNotificationById, + deleteNotificationById, + markAllRead, + markAllUnread, + } +} diff --git a/server/composables/useNotificationCrud.ts b/server/composables/useNotificationCrud.ts deleted file mode 100644 index 591fbc9b..00000000 --- a/server/composables/useNotificationCrud.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { and, eq, isNotNull, isNull } from 'drizzle-orm' -import { sysNotificationTable } from '@base/server/db/schemas' -import { useCrud } from '@base/server/composables/useCrud' -import type { ParsedFilterQuery } from '@base/server/utils/filter' - -interface QueryRestrict { - user_id: string - markAllRead?: any - markAllUnread?: any -} -export function useNotificationCrud(queryRestrict: QueryRestrict) { - const { - countRecords, - createRecord, - deleteRecordByKey, - getRecordByKey, - getRecordsPaginated, - updateRecordByKey, - updateManyRecords, - } = useCrud(sysNotificationTable, { - queryRestrict: () => and(...[ - queryRestrict.user_id && eq(sysNotificationTable.user_id, queryRestrict.user_id), - queryRestrict.markAllRead && isNull(sysNotificationTable.read_at), - queryRestrict.markAllUnread && isNotNull(sysNotificationTable.read_at), - ].filter(Boolean)), - }) - async function getNotificationsPaginated(options: ParsedFilterQuery) { - const { data, total } = await getRecordsPaginated(options) - return { data, total } - } - async function getNotificationById(id: string) { - const { data } = await getRecordByKey('id', id) - return { data } - } - async function updateNotificationById(id: string, body: any) { - const { data } = await updateRecordByKey('id', id, body) - return { data } - } - async function createNotification(body: any) { - const { data } = await createRecord(body) - return { data } - } - async function deleteNotificationById(id: string) { - const { data } = await deleteRecordByKey('id', id) - return { data } - } - function countNotifications() { - return countRecords() - } - function markAllRead() { - return updateManyRecords({ read_at: new Date() }) - } - function markAllUnread() { - return updateManyRecords({ read_at: null }) - } - return { - getNotificationsPaginated, - getNotificationById, - createNotification, - updateNotificationById, - deleteNotificationById, - countNotifications, - markAllRead, - markAllUnread, - } -} diff --git a/server/composables/usePayment.ts b/server/composables/usePayment.ts new file mode 100644 index 00000000..847af9e5 --- /dev/null +++ b/server/composables/usePayment.ts @@ -0,0 +1,100 @@ +import { eq } from 'drizzle-orm' +import { PaymentStatus, orderTable, paymentProviderTransactionTable, paymentTable } from '../db/schemas' +import type { Order, Payment, PaymentProviderTransaction } from '../types/models' + +export function usePayment() { + async function createOrder(productId: string, userId: string, referenceId?: string): Promise { + return ( + await db.insert(orderTable).values({ + product_id: productId, + user_id: userId, + reference_id: referenceId, + }).returning() + )[0] + } + + async function createPayment(orderId: string, userId: string, amount: number): Promise { + return ( + await db.insert(paymentTable).values({ + amount, + status: PaymentStatus.PENDING, + user_id: userId, + order_id: orderId, + }).returning() + )[0] + } + + function updatePaymentStatus(paymentId: string, status: PaymentStatus) { + return db.update(paymentTable).set({ + status, + }).where( + eq(paymentTable.id, paymentId), + ) + } + + async function createProviderTransaction( + paymentId: string, + userId: string, + orderCode: string, + provider: string, + productType: string, + productInfo: Record, + ): Promise { + return ( + await db.insert(paymentProviderTransactionTable).values({ + provider, + provider_transaction_id: orderCode, + provider_transaction_status: PaymentStatus.PENDING, + provider_transaction_info: `${productType}:${productInfo.amount}`, + payment_id: paymentId, + user_id: userId, + }).returning() + )[0] + } + + function getProviderTransactionByOrderCode(orderCode: string): Promise< + | (PaymentProviderTransaction & { + payment: Payment & { + order: Order & { + reference: any + package: any + } + } + }) + | undefined + > { + return db.query.paymentProviderTransactionTable.findFirst({ + where: eq(paymentProviderTransactionTable.provider_transaction_id, orderCode), + with: { + payment: { + with: { + order: { + with: { + reference: true, + package: true, + }, + }, + }, + }, + }, + }) + } + + function updateProviderTransactionStatus(transactionId: string, status: PaymentStatus, resolvedAt: string | Date | number) { + return db.update(paymentProviderTransactionTable).set({ + provider_transaction_status: status, + provider_transaction_resolved_at: new Date(resolvedAt), + }).where( + eq(paymentProviderTransactionTable.id, transactionId), + ) + } + + return { + createOrder, + createPayment, + updatePaymentStatus, + createProviderTransaction, + getProviderTransactionByOrderCode, + updateProviderTransactionStatus, + } +} diff --git a/server/composables/useProduct.ts b/server/composables/useProduct.ts new file mode 100644 index 00000000..64f98e17 --- /dev/null +++ b/server/composables/useProduct.ts @@ -0,0 +1,56 @@ +import type { Product } from '@base/server/types/models' +import { ProductStatus, ProductType } from '../db/schemas' + +export function useProduct() { + function getProducts(): Promise { + return db.query.productTable.findMany({ + where(schema, { eq }) { + return eq(schema.status, ProductStatus.ACTIVE) + }, + orderBy(schema, { asc }) { + return [ + asc(schema.position), + ] + }, + }) + } + + function getCreditPackages(): Promise { + return db.query.productTable.findMany({ + where(schema, { eq, and }) { + return and( + eq(schema.type, ProductType.CREDIT), + eq(schema.status, ProductStatus.ACTIVE), + ) + }, + orderBy(schema, { asc }) { + return [ + asc(schema.position), + ] + }, + }) + } + + function getProductByProductId(productId: string): Promise | undefined> { + return db.query.productTable.findFirst({ + where(schema, { eq, and }) { + return and( + eq(schema.id, productId), + eq(schema.status, ProductStatus.ACTIVE), + ) + }, + columns: { + id: true, + price: true, + price_discount: true, + amount: true, + }, + }) + } + + return { + getProducts, + getCreditPackages, + getProductByProductId, + } +} diff --git a/server/composables/useReference.ts b/server/composables/useReference.ts new file mode 100644 index 00000000..1afe6def --- /dev/null +++ b/server/composables/useReference.ts @@ -0,0 +1,90 @@ +import { eq, sql } from 'drizzle-orm' +import { referenceTable, referenceUsageTable } from '../db/schemas' + +export const REFERENCE_CODE_COOKIE_NAME = 'referCode' + +export function useReference() { + function getReferenceById(referenceId: string) { + return db.query.referenceTable.findFirst({ + where(schema, { eq }) { + return eq(schema.id, referenceId) + }, + }) + } + + function getReferenceByCode(referenceCode: string) { + return db.query.referenceTable.findFirst({ + where(schema, { eq }) { + return eq(schema.code, referenceCode) + }, + }) + } + + function getUserReferenceUsage(userId: string) { + return db.query.referenceUsageTable.findFirst({ + where(schema, { eq }) { + return eq(schema.user_id, userId) + }, + }) + } + + async function getUserBestPrice(userId: string, originalPrice: number, discountPrice?: number | null, referCode?: string | null) { + const userReferenceUsage = await getUserReferenceUsage(userId) + + let price = originalPrice + + if (!userReferenceUsage && referCode) { + const reference = await getReferenceByCode(referCode) + + if (reference) { + const referenceInStock = reference.quantity === null || reference.quantity > 0 + + if (referenceInStock && reference?.percentage) { + price = originalPrice * (1 - reference.percentage / 100) + } + else if (referenceInStock && reference?.amount) { + price = originalPrice - reference.amount + } + } + } + + // use the best price for the customer + price = Math.ceil( + discountPrice + ? Math.min(discountPrice, price) + : price, + ) + + if (!price) { + throw createError({ + statusCode: 400, + statusMessage: ErrorMessage.BAD_REQUEST, + }) + } + + return price + } + + async function createReferenceUsage(userId: string, referenceId: string, paymentProviderTransactionId: string) { + const referenceUsage = await db.insert(referenceUsageTable).values({ + user_id: userId, + reference_id: referenceId, + payment_provider_transaction_id: paymentProviderTransactionId, + }).returning() + + await db.update(referenceTable) + .set({ + quantity: sql`${referenceTable.quantity} - 1`, + }) + .where(eq(referenceTable.id, referenceId)) + + return referenceUsage[0] + } + + return { + getReferenceById, + getUserReferenceUsage, + getUserBestPrice, + createReferenceUsage, + } +} diff --git a/server/composables/useShortcutCrud.ts b/server/composables/useShortcutCrud.ts deleted file mode 100644 index e4e6e7e4..00000000 --- a/server/composables/useShortcutCrud.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { eq } from 'drizzle-orm' -import type { ParsedFilterQuery } from '@base/server/utils/filter' -import { userShortcutTable } from '@base/server/db/schemas' -import { useCrud } from './useCrud' - -export function useShortcutCrud(userId: string) { - const { - getRecordsPaginated, - getRecordByKey, - createRecord, - updateRecordByKey, - deleteRecordByKey, - countRecords, - } = useCrud(userShortcutTable, { - searchBy: ['route'], - queryRestrict: () => eq(userShortcutTable.user_id, userId), - }) - - async function getShortcutsPaginated(options: ParsedFilterQuery) { - const { data, total } = await getRecordsPaginated(options) - - return { data, total } - } - - async function getShortcutById(id: string) { - const { data } = await getRecordByKey('id', id) - - return { data } - } - - async function updateShortcutById(id: string, body: any) { - const { data } = await updateRecordByKey('id', id, body) - - return { data } - } - - async function createShortcut(body: any) { - const { data } = await createRecord(body) - - return { data } - } - - async function deleteShortcutById(id: string) { - const { data } = await deleteRecordByKey('id', id) - - return { data } - } - - function countShortcuts() { - return countRecords() - } - - return { - getShortcutsPaginated, - getShortcutById, - createShortcut, - updateShortcutById, - deleteShortcutById, - countShortcuts, - } -} diff --git a/server/composables/useUser.ts b/server/composables/useUser.ts new file mode 100644 index 00000000..a3ac6692 --- /dev/null +++ b/server/composables/useUser.ts @@ -0,0 +1,139 @@ +import { eq } from 'drizzle-orm' +import { userTable } from '../db/schemas' +import type { User, UserInput } from '../types/models' + +export function useUser() { + async function getUserById(userId: string): Promise { + return db.query.userTable.findFirst({ + where: isUUID(userId) + ? eq(userTable.id, userId) + : eq(userTable.logto_id, userId), + }) + } + + async function getUserCreditById(userId: string): Promise { + const userProfile = await getUserById(userId) + + return userProfile?.credit || 0 + } + + async function createUser(userId: string, payload: UserInput): Promise { + if (!userId) { + throw new Error('User ID is required when creating a user') + } + + // Remove null values to avoid type errors + const cleanPayload: Record = {} + + for (const [key, value] of Object.entries(payload)) { + if (value !== null && value !== undefined) { + cleanPayload[key] = value + } + } + + const insertData: Record = { + ...cleanPayload, + } + + // Set the ID field properly + if (isUUID(userId)) { + insertData.id = userId + } + else { + // If not UUID, logto_id is required + insertData.logto_id = userId + } + + // Type assertion to satisfy TypeScript + return ( + await db.insert(userTable) + .values(insertData as any) + .returning() + )[0] + } + + async function updateUser(userId: string, payload: Partial): Promise { + // Remove null values to avoid type errors + const cleanPayload: Record = { + updated_at: new Date(), + } + + for (const [key, value] of Object.entries(payload)) { + if (value !== null && value !== undefined) { + cleanPayload[key] = value + } + } + + return ( + await db.update(userTable) + .set(cleanPayload) + .where( + isUUID(userId) + ? eq(userTable.id, userId) + : eq(userTable.logto_id, userId), + ) + .returning() + )[0] + } + + function upsertUser(userId: string, payload: UserInput): Promise { + return db.transaction(async () => { + // Resolve to correct ID format + const resolvedUser = await getUserById(userId) + + if (!resolvedUser) { + // If we can't resolve to UUID, create new user with Logto ID reference + return createUser(userId, payload) + } + + // Update existing user + return updateUser(userId, payload) + }) + } + + function deleteUser(userId: string) { + return db.delete(userTable) + .where( + isUUID(userId) + ? eq(userTable.id, userId) + : eq(userTable.logto_id, userId), + ) + } + + function updateLastSignIn(userId: string, signInTime?: Date | number | string) { + return db.update(userTable) + .set({ + last_sign_in_at: signInTime ? new Date(signInTime) : new Date(), + updated_at: new Date(), + }) + .where( + isUUID(userId) + ? eq(userTable.id, userId) + : eq(userTable.logto_id, userId), + ) + } + + function updateSuspensionStatus(userId: string, isSuspended: boolean) { + return db.update(userTable) + .set({ + is_suspended: isSuspended, + updated_at: new Date(), + }) + .where( + isUUID(userId) + ? eq(userTable.id, userId) + : eq(userTable.logto_id, userId), + ) + } + + return { + getUserById, + getUserCreditById, + createUser, + updateUser, + upsertUser, + deleteUser, + updateLastSignIn, + updateSuspensionStatus, + } +} diff --git a/server/api/users/.gitkeep b/server/composables/useUserDevice.ts similarity index 100% rename from server/api/users/.gitkeep rename to server/composables/useUserDevice.ts diff --git a/server/composables/useUserDeviceCrud.ts b/server/composables/useUserDeviceCrud.ts deleted file mode 100644 index 3493f3bb..00000000 --- a/server/composables/useUserDeviceCrud.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { and, eq } from 'drizzle-orm' -import { userDeviceTable } from '@base/server/db/schemas' -import { useCrud } from './useCrud' - -interface QueryRestrict { - user_id: string | any -} -export function useUserDeviceCrud(queryRestrict: QueryRestrict) { - const { getRecordsPaginated, getRecordByKey, createRecord, deleteRecordByKey } = useCrud(userDeviceTable, { - queryRestrict: () => and( - ...[queryRestrict.user_id && eq(userDeviceTable.user_id, queryRestrict.user_id)].filter(Boolean), - ), - }) - async function getUserDeviceAllTokens(options: ParsedFilterQuery) { - const { data, total } = await getRecordsPaginated(options) - return { data, total } - } - async function getUserDeviceToken(token_device: string) { - const { data } = await getRecordByKey('token_device', token_device) - return { data } - } - - async function createUserDeviceToken(body: any) { - const { data } = await createRecord(body) - return { data } - } - async function deleteUserDeviceToken(token_device: string) { - const { data } = await deleteRecordByKey('token_device', token_device) - return { data } - } - - return { - getUserDeviceToken, - createUserDeviceToken, - deleteUserDeviceToken, - getUserDeviceAllTokens, - } -} diff --git a/server/db/schemas/credit_histories.schema.ts b/server/db/schemas/credit_histories.schema.ts index d9514e86..3547fe37 100644 --- a/server/db/schemas/credit_histories.schema.ts +++ b/server/db/schemas/credit_histories.schema.ts @@ -1,10 +1,20 @@ -import { numeric, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { integer, pgTable, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' import { creditHistoryType } from './enum.schema' +import { userTable } from './users.schema' export const creditHistoryTable = pgTable('credit_histories', { id: uuid('id').defaultRandom().primaryKey().notNull(), - amount: numeric('amount').notNull(), + amount: integer('amount').notNull(), type: creditHistoryType('type').notNull(), - user_id: text('user_id').notNull(), + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), }) + +export const creditHistoryRelations = relations(creditHistoryTable, ({ one }) => ({ + user: one(userTable, { + fields: [creditHistoryTable.user_id], + references: [userTable.id], + }), +})) diff --git a/server/db/schemas/credit_packages.schema.ts b/server/db/schemas/credit_packages.schema.ts deleted file mode 100644 index 079643bd..00000000 --- a/server/db/schemas/credit_packages.schema.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { jsonb, numeric, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' - -export const creditPackageTable = pgTable('credit_packages', { - id: uuid('id').defaultRandom().primaryKey().notNull(), - title: text('title'), - description: text('description'), - price: numeric('price').notNull(), - currency: text('currency').notNull(), - amount: numeric('amount').notNull(), - features: jsonb('features'), - created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), - updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), -}) diff --git a/server/db/schemas/devices.schema.ts b/server/db/schemas/devices.schema.ts new file mode 100644 index 00000000..4a7fea57 --- /dev/null +++ b/server/db/schemas/devices.schema.ts @@ -0,0 +1,18 @@ +import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { userTable } from './users.schema' + +export const deviceTable = pgTable('devices', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), + token_device: text('token_device'), + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), +}) + +export const deviceRelations = relations(deviceTable, ({ one }) => ({ + user: one(userTable, { + fields: [deviceTable.user_id], + references: [userTable.id], + }), +})) diff --git a/server/db/schemas/enum.schema.ts b/server/db/schemas/enum.schema.ts index 2fd4eb64..eb780ed9 100644 --- a/server/db/schemas/enum.schema.ts +++ b/server/db/schemas/enum.schema.ts @@ -21,8 +21,23 @@ export enum SupportedCurrency { VND = 'VND', } +export enum ProductType { + CREDIT = 'credit', + SUBSCRIPTION = 'subscription', + OTHER = 'other', +} + +export enum ProductStatus { + ACTIVE = 'active', + INACTIVE = 'inactive', +} + export const paymentStatus = pgEnum('payment_status', enumToPgEnum(PaymentStatus)) export const creditHistoryType = pgEnum('credit_history_type', enumToPgEnum(CreditHistoryType)) export const supportedCurrency = pgEnum('supported_currency', enumToPgEnum(SupportedCurrency)) + +export const productType = pgEnum('product_type', enumToPgEnum(ProductType)) + +export const productStatus = pgEnum('product_status', enumToPgEnum(ProductStatus)) diff --git a/server/db/schemas/identities.schema.ts b/server/db/schemas/identities.schema.ts new file mode 100644 index 00000000..f4ecc188 --- /dev/null +++ b/server/db/schemas/identities.schema.ts @@ -0,0 +1,21 @@ +import { jsonb, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { userTable } from './users.schema' + +export const identityTable = pgTable('identities', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), + provider: text('provider').notNull(), // e.g., 'google', 'facebook', etc. + provider_user_id: text('provider_user_id').notNull(), + provider_data: jsonb('provider_data').default({}), + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), +}) + +export const identityRelations = relations(identityTable, ({ one }) => ({ + user: one(userTable, { + fields: [identityTable.user_id], + references: [userTable.id], + }), +})) diff --git a/server/db/schemas/index.ts b/server/db/schemas/index.ts index e6c9ce0e..226cb891 100644 --- a/server/db/schemas/index.ts +++ b/server/db/schemas/index.ts @@ -1,21 +1,23 @@ export * from './credit_histories.schema' -export * from './credit_packages.schema' +export * from './products.schema' export * from './enum.schema' +export * from './identities.schema' + export * from './payment_provider_transactions.schema' -export * from './sys_faq_categories.schema' +export * from './notifications.schema' -export * from './sys_faqs.schema' +export * from './devices.schema' -export * from './sys_notifications.schema' +export * from './orders.schema' -export * from './user_devices.schema' +export * from './payments.schema' -export * from './user_orders.schema' +export * from './users.schema' -export * from './user_payments.schema' +export * from './reference_usages.schema' -export * from './user_shortcuts.schema' +export * from './references.schema' diff --git a/server/db/schemas/notifications.schema.ts b/server/db/schemas/notifications.schema.ts new file mode 100644 index 00000000..e53e3de1 --- /dev/null +++ b/server/db/schemas/notifications.schema.ts @@ -0,0 +1,21 @@ +import { jsonb, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { userTable } from './users.schema' + +export const notificationTable = pgTable('notifications', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + title: text('title'), + message: text('message'), + action: jsonb('action'), + read_at: timestamp('read_at', { withTimezone: true }), + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), +}) + +export const notificationRelations = relations(notificationTable, ({ one }) => ({ + user: one(userTable, { + fields: [notificationTable.user_id], + references: [userTable.id], + }), +})) diff --git a/server/db/schemas/orders.schema.ts b/server/db/schemas/orders.schema.ts new file mode 100644 index 00000000..5a2381e2 --- /dev/null +++ b/server/db/schemas/orders.schema.ts @@ -0,0 +1,37 @@ +import { pgTable, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { paymentTable } from './payments.schema' +import { productTable } from './products.schema' +import { userTable } from './users.schema' +import { referenceTable } from './references.schema' + +export const orderTable = pgTable('orders', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), + product_id: uuid('product_id') + .references(() => productTable.id, { onDelete: 'no action', onUpdate: 'no action' }), + reference_id: uuid('reference_id') + .references(() => referenceTable.id, { onDelete: 'no action', onUpdate: 'no action' }), + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), +}) + +export const userOrderRelations = relations(orderTable, ({ one }) => ({ + package: one(productTable, { + fields: [orderTable.product_id], + references: [productTable.id], + }), + payment: one(paymentTable, { + fields: [orderTable.id], + references: [paymentTable.order_id], + }), + user: one(userTable, { + fields: [orderTable.user_id], + references: [userTable.id], + }), + reference: one(referenceTable, { + fields: [orderTable.reference_id], + references: [referenceTable.id], + }), +})) diff --git a/server/db/schemas/payment_provider_transactions.schema.ts b/server/db/schemas/payment_provider_transactions.schema.ts index 8f260106..82320f5d 100644 --- a/server/db/schemas/payment_provider_transactions.schema.ts +++ b/server/db/schemas/payment_provider_transactions.schema.ts @@ -1,6 +1,7 @@ import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' import { relations } from 'drizzle-orm/relations' -import { userPaymentTable } from './user_payments.schema' +import { paymentTable } from './payments.schema' +import { userTable } from './users.schema' export const paymentProviderTransactionTable = pgTable('payment_provider_transactions', { id: uuid('id').defaultRandom().primaryKey().notNull(), @@ -10,15 +11,20 @@ export const paymentProviderTransactionTable = pgTable('payment_provider_transac provider_transaction_resolved_at: timestamp('provider_transaction_resolved_at', { withTimezone: true }), // vnp_PayDate provider_transaction_info: text('provider_transaction_info').notNull(), // vnp_OrderInfo payment_id: uuid('payment_id') - .references(() => userPaymentTable.id, { onDelete: 'no action', onUpdate: 'no action' }).notNull(), - user_id: text('user_id').notNull(), + .references(() => paymentTable.id, { onDelete: 'no action', onUpdate: 'no action' }).notNull(), + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), }) export const paymentProviderTransactionRelations = relations(paymentProviderTransactionTable, ({ one }) => ({ - payment: one(userPaymentTable, { + payment: one(paymentTable, { fields: [paymentProviderTransactionTable.payment_id], - references: [userPaymentTable.id], + references: [paymentTable.id], + }), + user: one(userTable, { + fields: [paymentProviderTransactionTable.user_id], + references: [userTable.id], }), })) diff --git a/server/db/schemas/payments.schema.ts b/server/db/schemas/payments.schema.ts new file mode 100644 index 00000000..e08b1732 --- /dev/null +++ b/server/db/schemas/payments.schema.ts @@ -0,0 +1,33 @@ +import { integer, pgTable, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { orderTable } from './orders.schema' +import { paymentStatus } from './enum.schema' +import { paymentProviderTransactionTable } from './payment_provider_transactions.schema' +import { userTable } from './users.schema' + +export const paymentTable = pgTable('payments', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + amount: integer('amount').notNull(), + status: paymentStatus('status').notNull(), + order_id: uuid('order_id') + .references(() => orderTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), +}) + +export const userPaymentRelations = relations(paymentTable, ({ one }) => ({ + order: one(orderTable, { + fields: [paymentTable.order_id], + references: [orderTable.id], + }), + providerTransaction: one(paymentProviderTransactionTable, { + fields: [paymentTable.id], + references: [paymentProviderTransactionTable.payment_id], + }), + user: one(userTable, { + fields: [paymentTable.user_id], + references: [userTable.id], + }), +})) diff --git a/server/db/schemas/products.schema.ts b/server/db/schemas/products.schema.ts new file mode 100644 index 00000000..e2cf4f14 --- /dev/null +++ b/server/db/schemas/products.schema.ts @@ -0,0 +1,29 @@ +import { integer, jsonb, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { orderTable } from './orders.schema' +import { ProductType, productStatus, productType } from './enum.schema' + +interface PricingPlanFeature { + title: string + icon?: string +} + +export const productTable = pgTable('products', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + title: text('title'), + description: text('description'), + price: integer('price').notNull(), + price_discount: integer('price_discount'), + currency: text('currency').notNull(), + amount: integer('amount').notNull(), + type: productType('type').default(ProductType.CREDIT).notNull(), + features: jsonb('features').$type().default([]), + position: integer('position'), + status: productStatus('status').default('active').notNull(), + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), +}) + +export const productRelations = relations(productTable, ({ many }) => ({ + orders: many(orderTable), +})) diff --git a/server/db/schemas/reference_usages.schema.ts b/server/db/schemas/reference_usages.schema.ts new file mode 100644 index 00000000..8cd10369 --- /dev/null +++ b/server/db/schemas/reference_usages.schema.ts @@ -0,0 +1,25 @@ +import { pgTable, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { userTable } from './users.schema' +import { referenceTable } from './references.schema' +import { paymentProviderTransactionTable } from './payment_provider_transactions.schema' + +export const referenceUsageTable = pgTable('reference_usages', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + // the one who uses/applies the reference code + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'no action', onUpdate: 'no action' }).notNull(), + reference_id: uuid('reference_id') + .references(() => referenceTable.id, { onDelete: 'no action', onUpdate: 'no action' }).notNull(), + payment_provider_transaction_id: uuid('payment_provider_transaction_id') + .references(() => paymentProviderTransactionTable.id, { onDelete: 'no action', onUpdate: 'no action' }).notNull(), + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), +}) + +export const referenceUsageRelations = relations(referenceUsageTable, ({ one }) => ({ + user: one(userTable, { + fields: [referenceUsageTable.user_id], + references: [userTable.id], + }), +})) diff --git a/server/db/schemas/references.schema.ts b/server/db/schemas/references.schema.ts new file mode 100644 index 00000000..1631f879 --- /dev/null +++ b/server/db/schemas/references.schema.ts @@ -0,0 +1,24 @@ +import { integer, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { customAlphabet } from 'nanoid' +import { userTable } from './users.schema' + +export const referenceTable = pgTable('references', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + // owner, the one who created the reference code + user_id: uuid('user_id') + .references(() => userTable.id, { onDelete: 'no action', onUpdate: 'no action' }).notNull(), + code: text('code').$defaultFn(() => customAlphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 16)()), + percentage: integer('percentage').default(0), + amount: integer('amount').default(0), // discount amount (in VND) + quantity: integer('quantity'), // number of times this reference code can be used + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), +}) + +export const referenceRelations = relations(referenceTable, ({ one }) => ({ + user: one(userTable, { + fields: [referenceTable.user_id], + references: [userTable.id], + }), +})) diff --git a/server/db/schemas/sys_faq_categories.schema.ts b/server/db/schemas/sys_faq_categories.schema.ts deleted file mode 100644 index e46a8bb4..00000000 --- a/server/db/schemas/sys_faq_categories.schema.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { pgTable, smallint, text, timestamp } from 'drizzle-orm/pg-core' -import { relations } from 'drizzle-orm/relations' -import { sysFaqTable } from './sys_faqs.schema' - -export const sysFaqCategoryTable = pgTable('sys_faq_categories', { - id: smallint('id').primaryKey().generatedByDefaultAsIdentity({ name: 'sys_faq_categories_id_seq', startWith: 1, increment: 1, minValue: 1, maxValue: 32767, cache: 1 }), - title: text('title'), - icon: text('icon'), - subtitle: text('subtitle'), - created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), -}) - -export const sysFaqCategoryRelations = relations(sysFaqCategoryTable, ({ many }) => ({ - faqs: many(sysFaqTable), -})) diff --git a/server/db/schemas/sys_faqs.schema.ts b/server/db/schemas/sys_faqs.schema.ts deleted file mode 100644 index 3bc4036f..00000000 --- a/server/db/schemas/sys_faqs.schema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { pgTable, smallint, text, timestamp, uuid } from 'drizzle-orm/pg-core' -import { relations } from 'drizzle-orm/relations' -import { sysFaqCategoryTable } from './sys_faq_categories.schema' - -export const sysFaqTable = pgTable('sys_faqs', { - id: uuid('id').defaultRandom().primaryKey().notNull(), - answer: text('answer'), - category_id: smallint('category_id') - .references(() => sysFaqCategoryTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }), - question: text('question'), - created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), -}) - -export const sysFaqRelations = relations(sysFaqTable, ({ one }) => ({ - category: one(sysFaqCategoryTable, { - fields: [sysFaqTable.category_id], - references: [sysFaqCategoryTable.id], - }), -})) diff --git a/server/db/schemas/sys_notifications.schema.ts b/server/db/schemas/sys_notifications.schema.ts deleted file mode 100644 index 4d176ee7..00000000 --- a/server/db/schemas/sys_notifications.schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { jsonb, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' - -export const sysNotificationTable = pgTable('sys_notifications', { - id: uuid('id').defaultRandom().primaryKey().notNull(), - created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), - title: text('title'), - message: text('message'), - action: jsonb('action'), - read_at: timestamp('read_at', { withTimezone: true }), - user_id: text('user_id').notNull(), -}) diff --git a/server/db/schemas/user_devices.schema.ts b/server/db/schemas/user_devices.schema.ts deleted file mode 100644 index 98f1b0dc..00000000 --- a/server/db/schemas/user_devices.schema.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' - -export const userDeviceTable = pgTable('user_devices', { - id: uuid('id').defaultRandom().primaryKey().notNull(), - user_id: text('user_id').notNull(), - token_device: text('token_device'), - created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), -}) diff --git a/server/db/schemas/user_orders.schema.ts b/server/db/schemas/user_orders.schema.ts deleted file mode 100644 index 3a188d4d..00000000 --- a/server/db/schemas/user_orders.schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' -import { relations } from 'drizzle-orm/relations' -import { userPaymentTable } from './user_payments.schema' - -export const userOrderTable = pgTable('user_orders', { - id: uuid('id').defaultRandom().primaryKey().notNull(), - user_id: text('user_id').notNull(), - created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), - updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), -}) - -export const userOrderRelations = relations(userOrderTable, ({ one }) => ({ - payment: one(userPaymentTable, { - fields: [userOrderTable.id], - references: [userPaymentTable.order_id], - }), -})) diff --git a/server/db/schemas/user_payments.schema.ts b/server/db/schemas/user_payments.schema.ts deleted file mode 100644 index 9e651d88..00000000 --- a/server/db/schemas/user_payments.schema.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { numeric, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' -import { relations } from 'drizzle-orm/relations' -import { userOrderTable } from './user_orders.schema' -import { paymentStatus } from './enum.schema' -import { paymentProviderTransactionTable } from './payment_provider_transactions.schema' - -export const userPaymentTable = pgTable('user_payments', { - id: uuid('id').defaultRandom().primaryKey().notNull(), - amount: numeric('amount').notNull(), - status: paymentStatus('status').notNull(), - order_id: uuid('order_id') - .references(() => userOrderTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }).notNull(), - user_id: text('user_id').notNull(), - created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), - updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), -}) - -export const userPaymentRelations = relations(userPaymentTable, ({ one }) => ({ - order: one(userOrderTable, { - fields: [userPaymentTable.order_id], - references: [userOrderTable.id], - }), - providerTransaction: one(paymentProviderTransactionTable, { - fields: [userPaymentTable.id], - references: [paymentProviderTransactionTable.payment_id], - }), -})) diff --git a/server/db/schemas/user_shortcuts.schema.ts b/server/db/schemas/user_shortcuts.schema.ts deleted file mode 100644 index dca5b33c..00000000 --- a/server/db/schemas/user_shortcuts.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { pgTable, text, uuid } from 'drizzle-orm/pg-core' - -export const userShortcutTable = pgTable('user_shortcuts', { - id: uuid('id').defaultRandom().primaryKey().notNull(), - route: text('route').notNull(), - user_id: text('user_id').notNull(), -}) diff --git a/server/db/schemas/users.schema.ts b/server/db/schemas/users.schema.ts new file mode 100644 index 00000000..d943456b --- /dev/null +++ b/server/db/schemas/users.schema.ts @@ -0,0 +1,55 @@ +import { boolean, integer, jsonb, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { relations } from 'drizzle-orm/relations' +import { identityTable } from './identities.schema' +import { deviceTable } from './devices.schema' +import { creditHistoryTable } from './credit_histories.schema' +import { notificationTable } from './notifications.schema' +import { orderTable } from './orders.schema' +import { paymentTable } from './payments.schema' +import { referenceTable } from './references.schema' +import { referenceUsageTable } from './reference_usages.schema' + +export const userTable = pgTable('users', { + id: uuid('id').defaultRandom().primaryKey().notNull(), + logto_id: text('logto_id').notNull().unique(), + + // User profile data + username: text('username'), + name: text('name'), + primary_email: text('primary_email'), + primary_phone: text('primary_phone'), + avatar: text('avatar'), + + // Custom fields from your original profiles schema + facebook: text('facebook'), + zalo: text('zalo'), + credit: integer('credit').default(0), + + // Notification settings with default values + email_notifications: boolean('email_notifications').default(true), + desktop_notifications: boolean('desktop_notifications').default(true), + product_updates_notifications: boolean('product_updates_notifications').default(true), + weekly_digest_notifications: boolean('weekly_digest_notifications').default(true), + important_updates_notifications: boolean('important_updates_notifications').default(true), + + // Additional Logto metadata + custom_data: jsonb('custom_data').default({}), + last_sign_in_at: timestamp('last_sign_in_at', { withTimezone: true }), + is_suspended: boolean('is_suspended').default(false), + has_password: boolean('has_password').default(false), + + // Timestamps + created_at: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + updated_at: timestamp('updated_at', { withTimezone: true }).defaultNow().$onUpdate(() => new Date()), +}) + +export const userRelations = relations(userTable, ({ many, one }) => ({ + identities: many(identityTable), + devices: many(deviceTable), + creditHistories: many(creditHistoryTable), + notifications: many(notificationTable), + orders: many(orderTable), + payments: many(paymentTable), + references: many(referenceTable), + referenceUsage: one(referenceUsageTable), +})) diff --git a/server/db/seeds/all.seed.ts b/server/db/seeds/all.seed.ts deleted file mode 100644 index cbf21400..00000000 --- a/server/db/seeds/all.seed.ts +++ /dev/null @@ -1,8 +0,0 @@ -export async function seed() { - try { - // - } - catch (error: any) { - console.error(error) - } -} diff --git a/server/db/seeds/index.seed.ts b/server/db/seeds/index.seed.ts deleted file mode 100644 index f025108b..00000000 --- a/server/db/seeds/index.seed.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { seed } from './all.seed' - -(async function () { - await seed() - - process.exit(0) -})() diff --git a/server/db/seeds/index.ts b/server/db/seeds/index.ts new file mode 100644 index 00000000..ca24c841 --- /dev/null +++ b/server/db/seeds/index.ts @@ -0,0 +1,10 @@ +import { seedProducts } from './products.seed' +import { seedNotifications } from './notifications.seed' + +(async () => { + await seedProducts() + + await seedNotifications('ax0p23zp6a2k', 'nguyenhuunguyeny.ny@gmail.com') + + process.exit(0) +})() diff --git a/server/db/seeds/notifications.seed.ts b/server/db/seeds/notifications.seed.ts new file mode 100644 index 00000000..b8e4be11 --- /dev/null +++ b/server/db/seeds/notifications.seed.ts @@ -0,0 +1,12 @@ +import { notificationTable } from '../schemas' +import { db } from '../../utils/db' + +export async function seedNotifications(id: string, email: string) { + console.log('Seeding notifications...') + const notifications = Array.from({ length: 10 }).map(() => ({ + user_id: id, + title: `Notification test ${Math.random()}`, + message: `Notification send to ${email}`, + })) + return await db.insert(notificationTable).values(notifications) +} diff --git a/server/db/seeds/products.seed.ts b/server/db/seeds/products.seed.ts new file mode 100644 index 00000000..1c38c66c --- /dev/null +++ b/server/db/seeds/products.seed.ts @@ -0,0 +1,126 @@ +import { productTable } from '../schemas' +import { db } from '../../utils/db' + +export async function seedProducts() { + console.log('Seeding products...') + + return await db.insert(productTable).values([ + { + title: 'Basic', + description: 'Ideal for testing their workflows.', + price: String(2000), + amount: String(30), + currency: 'VND', + position: String(1), + features: [ + 'Homelab servers', + '96.69% uptime', + 'Recommended for development purposes', + 'Customer support', + '1 vCPU, 1GB RAM, 8GB SSD', + 'Unlimited bandwidth', + 'Private VPS', + 'Free sub-domain', + ], + created_at: new Date(), + }, + { + title: 'Standard', + description: 'Great for small-scale automation needs.', + price: String(6900), + amount: String(69), + currency: 'VND', + position: String(2), + features: [ + 'Homelab servers', + '96.69% uptime', + 'Recommended for development purposes', + 'Customer support', + '1 vCPU, 2GB RAM, 15GB SSD', + 'Unlimited bandwidth', + 'Private VPS', + 'Custom domain', + ], + created_at: new Date(), + }, + { + title: 'Pro', + description: 'Enhanced performance for serious automation.', + price: String(9600), + amount: String(96), + currency: 'VND', + position: String(3), + features: [ + 'Homelab servers', + '96.69% uptime', + 'Recommended for development purposes', + 'Customer support', + '2 vCPU, 4GB RAM, 20GB SSD', + 'Unlimited bandwidth', + 'Private VPS', + 'Custom domain', + ], + created_at: new Date(), + }, + { + title: 'Premium', + description: 'Ultimate power for complex workflows.', + price: String(16900), + amount: String(169), + currency: 'VND', + position: String(4), + features: [ + 'Homelab servers', + '96.69% uptime', + 'Recommended for development purposes', + 'Customer support', + '4 vCPU, 8GB RAM, 25GB SSD', + 'Unlimited bandwidth', + 'Private VPS', + 'Custom domain', + ], + created_at: new Date(), + }, + { + title: 'Solution', + description: 'We solve your company problems by leveraging our expertise on n8n automation.', + price: String(0), + amount: String(0), + currency: 'VND', + position: String(5), + features: [ + 'Custom automation solutions', + 'Dedicated support team', + 'Tailored workflow design', + 'Integration with existing systems', + 'Scalable infrastructure', + 'Performance optimization', + 'Security and compliance', + 'Training and onboarding', + ], + created_at: new Date(), + }, + { + title: 'Enterprise', + description: 'Unlimited resource for your enterprise-scale automation.', + price: String(0), + amount: String(0), + currency: 'VND', + position: String(6), + features: [ + '99.99% uptime', + 'Recommended for enterprise purposes', + 'Priority customer support', + 'On-demand vCPU, RAM, SSD', + 'Unlimited bandwidth', + 'Private VPS', + 'Custom domain', + 'Scalable infrastructure', + 'Performance optimization', + 'Security and compliance', + 'Training and onboarding', + ], + created_at: new Date(), + }, + ]).returning() +} diff --git a/server/plugins/logger.ts b/server/plugins/logger.ts new file mode 100644 index 00000000..f99315ae --- /dev/null +++ b/server/plugins/logger.ts @@ -0,0 +1,14 @@ +import type { H3Event } from 'h3' + +const EXCLUDED_PATHS = ['/api/health'] + +export default defineNitroPlugin(async (nitroApp) => { + // Create a request logger function + const logRequest = logger.createRequestLogger() + + // Hook into each request + nitroApp.hooks.hook('request', async (event: H3Event) => { + if (!EXCLUDED_PATHS.includes(event.path)) + await logRequest(event) + }) +}) diff --git a/server/plugins/mongo.ts b/server/plugins/mongo.ts new file mode 100644 index 00000000..ffbf2d29 --- /dev/null +++ b/server/plugins/mongo.ts @@ -0,0 +1,15 @@ +import mongodbDriver from 'unstorage/drivers/mongodb' + +export default defineNitroPlugin(() => { + const storage = useStorage() + + if (process.env.MONGODB_CONNECTION_STRING && process.env.MONGODB_DATABASE_NAME && process.env.MONGODB_COLLECTION_NAME) { + const driver = mongodbDriver({ + connectionString: process.env.MONGODB_CONNECTION_STRING, + databaseName: process.env.MONGODB_DATABASE_NAME, + collectionName: process.env.MONGODB_COLLECTION_NAME, + }) + + storage.mount('mongodb', driver) + } +}) diff --git a/server/plugins/redis.ts b/server/plugins/redis.ts index 88c009ae..52459972 100644 --- a/server/plugins/redis.ts +++ b/server/plugins/redis.ts @@ -1,18 +1,25 @@ import redisDriver from 'unstorage/drivers/redis' +import upstashDriver from 'unstorage/drivers/upstash' export default defineNitroPlugin(() => { const storage = useStorage() - const config = useRuntimeConfig() - if (config.redis.host && config.redis.port && config.redis.password) { + if (process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN) { + const driver = upstashDriver({ + base: 'redis', + }) + + storage.mount('redis', driver) + } + else if (process.env.REDIS_HOST && process.env.REDIS_PASSWORD) { const driver = redisDriver({ base: 'redis', - host: config.redis.host, - port: Number(config.redis.port), - password: config.redis.password, + host: process.env.REDIS_HOST, + port: Number(process.env.REDIS_PORT), + password: process.env.REDIS_PASSWORD, + maxRetriesPerRequest: 0, }) - // Mount driver storage.mount('redis', driver) } }) diff --git a/server/tasks/.gitkeep b/server/tasks/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/server/tasks/db/backup.ts b/server/tasks/db/backup.ts new file mode 100644 index 00000000..e9a8e75f --- /dev/null +++ b/server/tasks/db/backup.ts @@ -0,0 +1,156 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { execa } from 'execa' +import { DeleteObjectsCommand, ListObjectsV2Command, PutObjectCommand } from '@aws-sdk/client-s3' + +const BACKUP_RETENTION_DAYS = 3 + +export default defineTask({ + meta: { + name: 'db:backup', + description: 'Dump database and upload to S3 daily', + }, + async run() { + const now = new Date() + const timestamp = now.toISOString().split('T')[0] // YYYY-MM-DD + const backupFileName = `backup-${timestamp}.sql.gz` + const localBackupPath = path.join('/tmp', backupFileName) + + // S3 Environment Variables + const s3Bucket = process.env.AWS_S3_BUCKET + const s3Region = process.env.AWS_S3_REGION + const s3AccessKey = process.env.AWS_S3_ACCESS_KEY + const s3SecretKey = process.env.AWS_S3_SECRET_ACCESS_KEY + + if (!s3Bucket || !s3Region || !s3AccessKey || !s3SecretKey) { + console.error('S3 environment variables are not fully configured. Skipping backup.') + return { result: 'Error: Missing S3 environment variables' } + } + + // Database Environment Variables + const postgresUrl = process.env.POSTGRES_URL + const dbHost = process.env.POSTGRES_HOST + const dbPort = process.env.POSTGRES_PORT + const dbUser = process.env.POSTGRES_USER + const dbPassword = process.env.POSTGRES_PASSWORD + const dbName = process.env.POSTGRES_DB + + let pgDumpBaseCommand: string + const pgDumpExecaOptions: { shell: true, env: Record } = { shell: true, env: {} } + + if (postgresUrl) { + // Escape single quotes in the URL for shell safety, though pg_dump expects a raw URL. + // The primary concern is the shell interpreting the quotes, not pg_dump itself. + const escapedPostgresUrl = postgresUrl.replace(/'/g, '\'\\\\\'\'') + pgDumpBaseCommand = `pg_dump --dbname='${escapedPostgresUrl}' --format=c` + // PGPASSWORD is not typically set when the password is in the connection string for pg_dump. + console.log('Using POSTGRES_URL for database connection.') + } + else if (dbHost && dbPort && dbUser && dbPassword && dbName) { + pgDumpBaseCommand = `pg_dump --host=${dbHost} --port=${dbPort} --username=${dbUser} --dbname=${dbName} --format=c --no-password` + pgDumpExecaOptions.env.PGPASSWORD = dbPassword + console.log('Using individual POSTGRES_HOST/USER/DB variables for database connection.') + } + else { + console.error('Database connection environment variables are not fully configured. Provide POSTGRES_URL or all of POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB. Skipping backup.') + return { result: 'Error: Missing database environment variables' } + } + + // pg_dump command will output to stdout, then piped to gzip + const fullBackupCommand = `${pgDumpBaseCommand} | gzip > ${localBackupPath}` + + try { + console.log(`Starting database backup to ${localBackupPath}...`) + // Execute the piped command using shell + await execa(fullBackupCommand, pgDumpExecaOptions) + console.log('Database dump and compression successful.') + + const fileContent = await fs.readFile(localBackupPath) + const s3Key = `backups/database/${backupFileName}` + + console.log(`Uploading backup to S3 bucket ${s3Bucket} with key ${s3Key}...`) + const s3Client = getS3Client() + + await s3Client.send(new PutObjectCommand({ + Bucket: s3Bucket, + Key: s3Key, + Body: fileContent, + ContentType: 'application/gzip', // Specify content type for gzipped file + })) + console.log('Backup uploaded to S3 successfully.') + + // Implement 3-day retention policy + console.log('Applying 3-day retention policy...') + const listCommand = new ListObjectsV2Command({ + Bucket: s3Bucket, + Prefix: 'backups/database/', + }) + const listedObjects = await s3Client.send(listCommand) + + if (listedObjects.Contents && listedObjects.Contents.length > 0) { + const cutoffDate = new Date(now) + cutoffDate.setDate(now.getDate() - BACKUP_RETENTION_DAYS) // Keep today's and 2 previous days' backups + + const objectsToDelete = listedObjects.Contents.filter((obj) => { + if (!obj.Key) + return false + const match = obj.Key.match(/backup-(\\d{4}-\\d{2}-\\d{2})\\.sql\\.gz$/) + if (match && match[1]) { + const backupDate = new Date(match[1]) + // Ensure comparison is date-only by setting hours to 0 + backupDate.setHours(0, 0, 0, 0) + const comparisonCutoff = new Date(cutoffDate) + comparisonCutoff.setHours(0, 0, 0, 0) + return backupDate < comparisonCutoff + } + return false + }) + + if (objectsToDelete.length > 0) { + const deleteParams = { + Bucket: s3Bucket, + Delete: { + Objects: objectsToDelete.map(obj => ({ Key: obj.Key })), + Quiet: false, + }, + } + const deleteResult = await s3Client.send(new DeleteObjectsCommand(deleteParams)) + if (deleteResult.Deleted && deleteResult.Deleted.length > 0) { + console.log(`Successfully deleted ${deleteResult.Deleted.length} old backup(s): ${deleteResult.Deleted.map(d => d.Key).join(', ')}`) + } + if (deleteResult.Errors && deleteResult.Errors.length > 0) { + deleteResult.Errors.forEach(err => console.error(`Error deleting S3 object ${err.Key}: ${err.Message}`)) + } + } + else { + console.log('No old backups found to delete.') + } + } + else { + console.log('No backups found in S3 to apply retention policy.') + } + + return { result: 'Success', backupPath: s3Key } + } + catch (error: any) { + console.error('Database backup or S3 upload failed:', error.message) + if (error.stderr) { + console.error('pg_dump stderr:', error.stderr) + } + if (error.stdout) { + console.error('pg_dump stdout:', error.stdout) + } + return { result: 'Error', error: error.message } + } + finally { + try { + await fs.unlink(localBackupPath) + console.log(`Cleaned up local backup file: ${localBackupPath}`) + } + catch (cleanupError: any) { + // Log if cleanup fails but don't let it mask the primary error + console.warn(`Failed to clean up local backup file ${localBackupPath}:`, cleanupError.message) + } + } + }, +}) diff --git a/server/tasks/email/test.ts b/server/tasks/email/test.ts new file mode 100644 index 00000000..0e13b1f0 --- /dev/null +++ b/server/tasks/email/test.ts @@ -0,0 +1,17 @@ +export default defineTask({ + meta: { + name: 'email:test', + description: 'Test email sender', + }, + async run() { + const { sendMail } = useNodeMailer() + + await sendMail({ + subject: 'Hehe test', + to: 'nguyenhuunguyeny.ny@gmail.com', + html: 'This is a test email', + }) + + return { result: 'Success' } + }, +}) diff --git a/server/types/logto.ts b/server/types/logto.ts new file mode 100644 index 00000000..91468247 --- /dev/null +++ b/server/types/logto.ts @@ -0,0 +1,12 @@ +import type { UserInfoResponse } from '@logto/nuxt' + +export interface LogtoUser extends UserInfoResponse { + custom_data: { + credit?: number + email?: boolean + desktop?: boolean + product_updates?: boolean + weekly_digest?: boolean + important_updates?: boolean + } +} diff --git a/server/types/models.ts b/server/types/models.ts new file mode 100644 index 00000000..208db994 --- /dev/null +++ b/server/types/models.ts @@ -0,0 +1,95 @@ +import type { InferSelectModel } from 'drizzle-orm' +import type { + creditHistoryTable, + deviceTable, + identityTable, + notificationTable, + orderTable, + paymentProviderTransactionTable, + paymentTable, + productTable, + referenceTable, + userTable, +} from '../db/schemas' + +/** + * Database model types derived from schema tables + */ +export type User = InferSelectModel +export type Identity = InferSelectModel +export type Notification = InferSelectModel +export type CreditHistory = InferSelectModel +export type Order = InferSelectModel +export type Payment = InferSelectModel +export type PaymentProviderTransaction = InferSelectModel +export type Product = InferSelectModel +export type Device = InferSelectModel +export type Reference = InferSelectModel + +/** + * Utility types for handling nullable values consistently + */ +export type Nullable = T | null + +/** + * Makes all properties in an object nullable + */ +export type NullableProps = { + [P in keyof T]: Nullable +} + +/** + * Makes all properties optional + */ +export type Optional = { + [P in keyof T]?: T[P] +} + +/** + * Combines properties being both optional and nullable + */ +export type OptionalNullable = Optional> + +/** + * Creates a user input type with specific included fields only + */ +export type UserInput = OptionalNullable< + Pick +> + +/** + * Type for basic filter pagination + */ +export interface PaginationOptions { + page?: number + limit?: number + sortBy?: string + sortAsc?: boolean + keyword?: string + keywordLower?: string + withCount?: boolean +} + +/** + * Type for API responses with pagination + */ +export interface PaginatedResponse { + data: T[] + total: number +} diff --git a/server/utils/array.ts b/server/utils/array.ts deleted file mode 100644 index 86aded6e..00000000 --- a/server/utils/array.ts +++ /dev/null @@ -1 +0,0 @@ -export { omit } from '@base/utils/array' diff --git a/server/utils/auth/scope.ts b/server/utils/auth/scope.ts index 0e961753..677e2125 100644 --- a/server/utils/auth/scope.ts +++ b/server/utils/auth/scope.ts @@ -1,5 +1,6 @@ import type { IncomingHttpHeaders } from 'node:http' import { createRemoteJWKSet, jwtVerify } from 'jose' +import { cleanDoubleSlashes } from 'ufo' function extractBearerTokenFromHeaders({ authorization }: IncomingHttpHeaders) { if (!authorization) { @@ -19,7 +20,7 @@ export async function getUserScopes() { const event = useEvent() // Generate a JWKS using jwks_uri obtained from the Logto server - const jwks = createRemoteJWKSet(new URL(`${process.env.LOGTO_ENDPOINT}/oidc/jwks`)) + const jwks = createRemoteJWKSet(new URL(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT}/oidc/jwks`))) const token = extractBearerTokenFromHeaders(event.node.req.headers) @@ -29,7 +30,7 @@ export async function getUserScopes() { jwks, { // Expected issuer of the token, issued by the Logto server - issuer: `${process.env.LOGTO_ENDPOINT}/oidc`, + issuer: cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT}/oidc`), // Expected audience token, the resource indicator of the current API audience: config.public.apiBaseUrl, }, diff --git a/server/utils/db.ts b/server/utils/db.ts index c0c8877c..9c98987e 100644 --- a/server/utils/db.ts +++ b/server/utils/db.ts @@ -10,12 +10,12 @@ export const db = drizzle( process.env.POSTGRES_URL ? postgres(process.env.POSTGRES_URL) : postgres({ - host: process.env.POSTGRES_HOST!, - port: Number(process.env.POSTGRES_PORT), - user: process.env.POSTGRES_USER!, - password: process.env.POSTGRES_PASSWORD!, - database: process.env.POSTGRES_DB!, - }), + host: process.env.POSTGRES_HOST!, + port: Number(process.env.POSTGRES_PORT), + user: process.env.POSTGRES_USER!, + password: process.env.POSTGRES_PASSWORD!, + database: process.env.POSTGRES_DB!, + }), { schema, }, diff --git a/server/utils/error-message.ts b/server/utils/error-message.ts deleted file mode 100644 index 7e239642..00000000 --- a/server/utils/error-message.ts +++ /dev/null @@ -1,16 +0,0 @@ -export enum ErrorMessage { - UNAUTHORIZED = 'Unauthorized!', - CANNOT_FIND_ROLE = 'Cannot assign role and permissions to user!', - INTERNAL_SERVER_ERROR = 'Internal server error!', - INVALID_CREDENTIALS = 'Invalid signin credentials!', - CANNOT_CHECKOUT = 'Cannot create Stripe Checkout session!', - DONOT_HAVE_PERMISSION = 'You do not have permission to perform this action!', - INVALID_PARAMS = 'Invalid parameter: <%= key %>, receive value: <%= value %>', - STRIPE_NO_PRICE = 'No price found for this product!', - BAD_REQUEST = 'Bad request!', - EMAIL_NOT_VERIFIED = 'Email not verified!', - INVALID_VERIFICATION_URL = 'Invalid verification URL!', - EMAIL_ALREADY_VERIFIED = 'Email already verified!', - PASSWORD_MISMATCH = 'Password mismatch!', - INVALID_BODY = 'Invalid request body!', -} diff --git a/server/utils/error.ts b/server/utils/error.ts index 586d7e81..4e2c45ab 100644 --- a/server/utils/error.ts +++ b/server/utils/error.ts @@ -1,14 +1,27 @@ -import type { PostgresError } from 'postgres' -import { pick } from 'lodash-es' +export enum ErrorMessage { + UNAUTHORIZED = 'Unauthorized!', + CANNOT_FIND_ROLE = 'Cannot assign role and permissions to user!', + INTERNAL_SERVER_ERROR = 'Internal server error!', + INVALID_CREDENTIALS = 'Invalid signin credentials!', + CANNOT_CHECKOUT = 'Cannot create Stripe Checkout session!', + DONOT_HAVE_PERMISSION = 'You do not have permission to perform this action!', + INVALID_PARAMS = 'Invalid parameter: <%= key %>, receive value: <%= value %>', + STRIPE_NO_PRICE = 'No price found for this product!', + BAD_REQUEST = 'Bad request!', + EMAIL_NOT_VERIFIED = 'Email not verified!', + INVALID_VERIFICATION_URL = 'Invalid verification URL!', + EMAIL_ALREADY_VERIFIED = 'Email already verified!', + PASSWORD_MISMATCH = 'Password mismatch!', + INVALID_WEBHOOK_BODY = 'Invalid webhook body!', +} export function parseError(error: any) { if (error.name === 'PostgresError') { - const _error: PostgresError = error - return createError({ statusCode: 400, - statusMessage: _error.message, - data: pick(_error, ['code', 'table_name', 'constraint_name', 'detail']), + statusMessage: ErrorMessage.BAD_REQUEST, + data: error, + stack: '', }) } @@ -16,5 +29,6 @@ export function parseError(error: any) { statusCode: error.statusCode || 500, statusMessage: error.message, data: error, + stack: '', }) } diff --git a/server/utils/firebase.ts b/server/utils/firebase.ts index f999cc70..85e9732c 100644 --- a/server/utils/firebase.ts +++ b/server/utils/firebase.ts @@ -1,17 +1,39 @@ -import admin from 'firebase-admin' +import firebaseAdmin from 'firebase-admin' export function getFirebaseServiceAccount() { return { + type: 'service_account', project_id: process.env.FIREBASE_PROJECT_ID, private_key_id: process.env.FIREBASE_PRIVATE_KEY_ID, private_key: process.env.FIREBASE_PRIVATE_KEY, - client_email: process.env.FIREBASE_CLIENT_EMAIL, + client_email: `firebase-adminsdk-fmxbs@${process.env.FIREBASE_PROJECT_ID}.iam.gserviceaccount.com`, client_id: process.env.FIREBASE_CLIENT_ID, - client_x509_cert_url: process.env.FIREBASE_CLIENT_X509_CERT_URL, - type: 'service_account', auth_uri: 'https://accounts.google.com/o/oauth2/auth', token_uri: 'https://oauth2.googleapis.com/token', auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs', + client_x509_cert_url: `https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-fmxbs%40${process.env.FIREBASE_PROJECT_ID}.iam.gserviceaccount.com`, universe_domain: 'googleapis.com', - } as admin.ServiceAccount + } +} + +export async function sendFirebaseCloudMessage(userId: string, title: string, body: string) { + const service = getFirebaseServiceAccount() + + if (firebaseAdmin.apps.length === 0) { + firebaseAdmin.initializeApp({ + credential: firebaseAdmin.credential.cert(service as firebaseAdmin.ServiceAccount), + }) + } + + const { getDeviceTokens } = useDeviceToken() + + const deviceTokens = await getDeviceTokens(userId) + + return firebaseAdmin.messaging().sendEachForMulticast({ + tokens: deviceTokens.map(device => device.token_device).filter(Boolean) as string[], + notification: { + title, + body, + }, + }) } diff --git a/server/utils/index.ts b/server/utils/index.ts index a921386f..95d991e8 100644 --- a/server/utils/index.ts +++ b/server/utils/index.ts @@ -1,6 +1,8 @@ -export * from './stripe' +export * from './auth' + +export * from './payment' -export * from './array' +export * from './stripe' export * from './db' @@ -19,5 +21,3 @@ export * from './s3' export * from './storage' export * from './url' - -export * from './payment' diff --git a/server/utils/logger.ts b/server/utils/logger.ts new file mode 100644 index 00000000..ecc80162 --- /dev/null +++ b/server/utils/logger.ts @@ -0,0 +1,291 @@ +import { promises as fs, mkdirSync } from 'node:fs' +import path, { join } from 'node:path' +import type { H3Event } from 'h3' +import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3' +import winston from 'winston' +import DailyRotateFile from 'winston-daily-rotate-file' + +export type LogLevel = 'log' | 'info' | 'warn' | 'error' + +const customToWinstonLevel: Record = { + error: 'error', + warn: 'warn', + info: 'info', + log: 'verbose', +} + +function winstonToCustomLevel(winstonLevel: string): LogLevel | undefined { + if (winstonLevel === 'verbose') { + return 'log' + } + if (['error', 'warn', 'info'].includes(winstonLevel)) { + return winstonLevel as LogLevel + } + return undefined +} + +const isDev = process.env.NODE_ENV === 'development' + +export class Logger { + private logger: winston.Logger + private s3Bucket: string | null = null + private s3Client?: S3Client + private enabledLogLevels: Set | null = null + private logsDir: string + private dailyRotateFileTransport: DailyRotateFile + + constructor(logsDirOpt?: string) { + this.logsDir = logsDirOpt || join(process.cwd(), 'logs') + this.ensureLogDirectoryExistsSync() + this.initS3Config() + this.initLogLevels() + + const winstonLogLevel = this.determineWinstonLogLevel() + + const levelFilter = winston.format((info) => { + if (this.enabledLogLevels === null) { + return info + } + const customLevel = winstonToCustomLevel(info.level) + return customLevel && this.enabledLogLevels.has(customLevel) ? info : false + }) + + this.dailyRotateFileTransport = new DailyRotateFile({ + level: winstonLogLevel, + dirname: this.logsDir, + filename: '%DATE%.log', + zippedArchive: false, + frequency: isDev ? '1m' : '15m', + maxFiles: '2d', + datePattern: 'YYYY-MM-DD-HH-mm', + format: winston.format.combine( + winston.format.timestamp(), + winston.format.errors({ stack: true }), + levelFilter(), + winston.format.json(), + ), + }) + + this.dailyRotateFileTransport.on('archive', (archivedPath: string) => { + if (this.s3Bucket && this.s3Client) { + this.uploadToS3(archivedPath).catch(err => console.error('S3 upload failed from archive event:', err)) + } + }) + + this.dailyRotateFileTransport.on('error', (error: Error) => { + console.error('Winston DailyRotateFile Transport Error:', error) + }) + + this.logger = winston.createLogger({ + level: winstonLogLevel, + transports: [ + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.simple(), + levelFilter(), + ), + silent: this.enabledLogLevels !== null && this.enabledLogLevels.size === 0, + }), + this.dailyRotateFileTransport, + ], + }) + + if (this.enabledLogLevels !== null && this.enabledLogLevels.size === 0) { + console.info('Logger: All logging is disabled (LOG_LEVEL is empty array or all levels filtered out)') + } + } + + private initLogLevels() { + const logLevelEnv = process.env.LOG_LEVEL + + if (logLevelEnv === undefined) { + this.enabledLogLevels = null + console.info('Logger: LOG_LEVEL is undefined, all log levels enabled.') + } + else { + try { + const parsedLevels = JSON.parse(logLevelEnv) + if (Array.isArray(parsedLevels)) { + if (parsedLevels.length === 0) { + this.enabledLogLevels = new Set() + console.info('Logger: LOG_LEVEL is an empty array, file logging disabled.') + } + else { + const validLevels = parsedLevels.filter( + (level): level is LogLevel => Object.keys(customToWinstonLevel).includes(level), + ) + this.enabledLogLevels = new Set(validLevels) + console.info(`Logger: Enabled log levels: ${Array.from(this.enabledLogLevels).join(', ')}`) + } + } + else { + this.enabledLogLevels = null + console.warn('Logger: Invalid LOG_LEVEL format, all log levels enabled.') + } + } + catch (error) { + this.enabledLogLevels = null + console.warn(`Logger: Failed to parse LOG_LEVEL, all log levels enabled: ${error}`) + } + } + } + + private determineWinstonLogLevel(): string { + if (this.enabledLogLevels === null) { + return 'silly' + } + if (this.enabledLogLevels.size === 0) { + return 'error' + } + + const winstonLevelsHierarchy: { [key: string]: number } = { error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5 } + let maxNumericLevel = -1 + + this.enabledLogLevels.forEach((level) => { + const winstonLevel = customToWinstonLevel[level] + if (winstonLevel && winstonLevelsHierarchy[winstonLevel] !== undefined) { + maxNumericLevel = Math.max(maxNumericLevel, winstonLevelsHierarchy[winstonLevel]) + } + }) + + if (maxNumericLevel === -1) { + return 'error' + } + + for (const levelStr in winstonLevelsHierarchy) { + if (winstonLevelsHierarchy[levelStr] === maxNumericLevel) { + return levelStr + } + } + return 'silly' + } + + private initS3Config() { + const bucket = process.env.AWS_LOGGER_S3_BUCKET + const region = process.env.AWS_LOGGER_S3_REGION || process.env.AWS_S3_REGION + const accessKeyId = process.env.AWS_S3_ACCESS_KEY + const secretAccessKey = process.env.AWS_S3_SECRET_ACCESS_KEY + + if (bucket && region && accessKeyId && secretAccessKey) { + this.s3Bucket = bucket + this.s3Client = new S3Client({ + region, + credentials: { accessKeyId, secretAccessKey }, + }) + console.info(`Logger: S3 uploads enabled to bucket ${bucket} in region ${region}.`) + } + else { + console.warn('Logger: S3 upload disabled due to missing AWS configuration (bucket, region, or credentials).') + } + } + + private ensureLogDirectoryExistsSync() { + try { + mkdirSync(this.logsDir, { recursive: true }) + } + catch (error) { + console.error(`Logger: Error creating logs directory '${this.logsDir}':`, error) + } + } + + private async uploadToS3(filePath: string) { + if (!this.s3Bucket || !this.s3Client) { + console.warn(`Logger: S3 upload skipped for ${filePath}, S3 not configured.`) + return + } + + try { + const fileStats = await fs.stat(filePath) + if (fileStats.size === 0) { + console.info(`Logger: Skipping empty archived log file: ${filePath}`) + await fs.unlink(filePath) + return + } + + const fileContent = await fs.readFile(filePath) + const fileName = path.basename(filePath) + + const dateMatch = fileName.match(/(\d{4}-\d{2}-\d{2})/) + let s3KeyPrefix = 'logs/unknown-date/' + if (dateMatch && dateMatch[1]) { + const [year, month, day] = dateMatch[1].split('-') + s3KeyPrefix = `logs/${year}/${month}/${day}/` + } + + const s3Key = `${s3KeyPrefix}${fileName}` + + await this.s3Client.send(new PutObjectCommand({ + Bucket: this.s3Bucket, + Key: s3Key, + Body: fileContent, + ContentType: 'text/plain', // Changed from application/gzip + })) + + console.info(`Logger: Successfully uploaded log file to S3: ${s3Key}`) + await fs.unlink(filePath) + console.info(`Logger: Deleted local archived log file: ${filePath}`) + } + catch (error) { + console.error(`Logger: Error uploading log file ${filePath} to S3:`, error) + } + } + + public log(message: any, meta?: Record) { + this.logger.verbose(message, meta) + } + + public info(message: any, meta?: Record) { + this.logger.info(message, meta) + } + + public warn(message: any, meta?: Record) { + this.logger.warn(message, meta) + } + + public error(message: any, meta?: Record) { + this.logger.error(message, meta) + } + + public createRequestLogger() { + return async (event: H3Event, meta?: Record) => { + const isInfoEnabled = this.enabledLogLevels === null || this.enabledLogLevels.has('info') + if (!isInfoEnabled || (this.enabledLogLevels !== null && this.enabledLogLevels.size === 0)) { + return + } + + const headers = event.headers + const headerEntries = Array.from(headers.entries()) + const filteredHeaders = headerEntries.filter( + ([key]) => !key.toLowerCase().includes('authorization') && !key.toLowerCase().includes('cookie'), + ) + + let body = null + try { + if (['POST', 'PUT', 'PATCH'].includes(event.method)) { + body = await readBody(event).catch(() => null) + } + } + catch (error) { + this.warn('Logger: Failed to read request body for logging:', { error }) + } + + const requestMeta = { + method: event.method, + url: event.path, + params: event.context.params, + query: getQuery(event), + headers: Object.fromEntries(filteredHeaders as Array<[string, string]>), + ip: headers.get('x-forwarded-for') || headers.get('x-real-ip') || 'unknown', + body, + ...meta, + } + + this.info(`Request: ${event.method} ${event.path}`, requestMeta) + } + } +} + +const logger = new Logger() + +export { logger } diff --git a/server/utils/logto.ts b/server/utils/logto.ts index 7a864226..81bcbf10 100644 --- a/server/utils/logto.ts +++ b/server/utils/logto.ts @@ -1,5 +1,6 @@ import type LogtoClient from '@logto/node' -import type { UserInfoResponse } from '@logto/node' +import type { LogtoUser } from '@base/server/types/logto' +import { cleanDoubleSlashes } from 'ufo' type LogtoAccountCenterFieldStatus = 'Off' | 'Edit' | 'ReadOnly' @@ -23,7 +24,7 @@ interface LogtoAccountCenterSettings { export function useLogtoUser() { const event = useEvent() - return (event.context?.logtoUser as UserInfoResponse) || null + return (event.context?.logtoUser as LogtoUser) || null } export function useLogtoClient() { @@ -32,9 +33,21 @@ export function useLogtoClient() { return (event.context?.logtoClient as LogtoClient) || null } +export async function getLogtoUserById(userId: string) { + const { access_token: accessToken } = await fetchM2MAccessToken() + + const response = await $fetch>(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT!}/api/users/${userId}`), { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + + return response +} + export async function getLogtoUserCustomData(userId: string) { const { access_token: accessToken } = await fetchM2MAccessToken() - const response = await $fetch>(`${process.env.LOGTO_ENDPOINT!}/api/users/${userId}/custom-data`, { + const response = await $fetch>(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT!}/api/users/${userId}/custom-data`), { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -45,7 +58,7 @@ export async function getLogtoUserCustomData(userId: string) { export async function updateLogtoUserCustomData(userId: string, customData: Record) { const { access_token: accessToken } = await fetchM2MAccessToken() - const response = await $fetch(`${process.env.LOGTO_ENDPOINT!}/api/users/${userId}/custom-data`, { + const response = await $fetch(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT!}/api/users/${userId}/custom-data`), { method: 'PATCH', headers: { 'Content-Type': 'application/json', @@ -60,7 +73,7 @@ export async function updateLogtoUserCustomData(userId: string, customData: Reco } export async function fetchM2MAccessToken() { - const response = await $fetch<{ access_token: string }>(`${process.env.LOGTO_ENDPOINT!}/oidc/token`, { + const response = await $fetch<{ access_token: string }>(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT!}/oidc/token`), { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -82,7 +95,7 @@ export async function fetchM2MAccessToken() { export async function enableAccountCenter() { const { access_token: accessToken } = await fetchM2MAccessToken() - const accountCenterSettings = await $fetch(`${process.env.LOGTO_ENDPOINT!}/api/account-center`, { + const accountCenterSettings = await $fetch(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT!}/api/account-center`), { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -91,7 +104,7 @@ export async function enableAccountCenter() { if (accountCenterSettings.enabled) return - await $fetch(`${process.env.LOGTO_ENDPOINT!}/api/account-center`, { + await $fetch(cleanDoubleSlashes(`${process.env.LOGTO_ENDPOINT!}/api/account-center`), { method: 'PATCH', body: { enabled: true, diff --git a/server/utils/notification.ts b/server/utils/notification.ts index 989d1cdc..a8d22904 100644 --- a/server/utils/notification.ts +++ b/server/utils/notification.ts @@ -1,5 +1,4 @@ -import admin from 'firebase-admin' -import { useUserDeviceCrud } from '@base/server/composables/useUserDeviceCrud' +import firebaseAdmin from 'firebase-admin' interface NotificationBody { user_id: string @@ -7,24 +6,26 @@ interface NotificationBody { body: string link: string } + export async function pushNotification(param: NotificationBody) { if (!param.user_id) return const service = getFirebaseServiceAccount() - if (admin.apps.length === 0) { - admin.initializeApp({ - credential: admin.credential.cert(service), + if (firebaseAdmin.apps.length === 0) { + firebaseAdmin.initializeApp({ + credential: firebaseAdmin.credential.cert(service as firebaseAdmin.ServiceAccount), }) } - const { getUserDeviceAllTokens } = useUserDeviceCrud({ user_id: param.user_id }) - const response = await getUserDeviceAllTokens({} as ParsedFilterQuery) + const { getDeviceTokens } = useDeviceToken() + + const response = await getDeviceTokens(param.user_id) - if (response && response.total === 0) + if (response && response.length === 0) return - const tokens = response.data!.map((item: any) => item.token_device) + const tokens = response!.map((item: any) => item.token_device) const body = { tokens, notification: { @@ -38,7 +39,9 @@ export async function pushNotification(param: NotificationBody) { }, } - const res = await admin.messaging().sendEachForMulticast(body) - console.log('push:', res) + const res = await firebaseAdmin.messaging().sendEachForMulticast(body) + + logger.log('Notification pushed:', res) + return res } diff --git a/server/utils/options.ts b/server/utils/options.ts index 60200c93..862f58c5 100644 --- a/server/utils/options.ts +++ b/server/utils/options.ts @@ -1,6 +1,6 @@ import type { H3Event } from 'h3' import { z } from 'zod' -import type { UserInfoResponse } from '@logto/node' +import type { User } from '../types/models' import { useLogtoUser } from '#imports' interface RouteOptions { @@ -17,7 +17,7 @@ export async function defineEventOptions< UseAuthU extends boolean, ParamsT extends string[], >(event: H3Event, options?: RouteOptions>) { - type SessionType = ConditionalType + type SessionType = ConditionalType type Result = { [K in TupleType[number]]: string @@ -37,7 +37,16 @@ export async function defineEventOptions< }) } - result.session = user as SessionType + const currentUser = await useUser().getUserById(user.sub) + + if (!currentUser) { + throw createError({ + statusCode: 401, + statusMessage: ErrorMessage.UNAUTHORIZED, + }) + } + + result.session = currentUser as SessionType } if (options?.scopes?.length) { diff --git a/server/utils/payment/credit/index.ts b/server/utils/payment/credit/index.ts new file mode 100644 index 00000000..8059a7f4 --- /dev/null +++ b/server/utils/payment/credit/index.ts @@ -0,0 +1,37 @@ +import { CreditHistoryType } from '@base/server/db/schemas' + +export async function addCreditToUser(userId: string, amount: number) { + const { getUserCreditById } = useUser() + + const userCredit = await getUserCreditById(userId) + + const newAmount = userCredit + amount + + const { updateCreditHistory, updateUserCredit } = useCredit() + + await updateCreditHistory(CreditHistoryType.TOPUP, amount, userId) + + await updateUserCredit(userId, newAmount) + + await useNitroApp().hooks.callHook('credit:change', { userId, amount: newAmount }) + + return { success: true } +} + +export async function subtractCreditFromUser(userId: string, amount: number) { + const { getUserCreditById } = useUser() + + const userCredit = await getUserCreditById(userId) + + const newAmount = userCredit - amount + + const { updateCreditHistory, updateUserCredit } = useCredit() + + await updateCreditHistory(CreditHistoryType.SPEND, amount, userId) + + await updateUserCredit(userId, newAmount) + + await useNitroApp().hooks.callHook('credit:change', { userId, amount: newAmount }) + + return { success: true } +} diff --git a/server/utils/payment/index.ts b/server/utils/payment/index.ts index 099638b5..0b743dbe 100644 --- a/server/utils/payment/index.ts +++ b/server/utils/payment/index.ts @@ -1 +1,3 @@ +export * from './credit/index' + export * from './vn/index' diff --git a/server/utils/payment/vn/index.ts b/server/utils/payment/vn/index.ts index 6f09764b..159c4b6e 100644 --- a/server/utils/payment/vn/index.ts +++ b/server/utils/payment/vn/index.ts @@ -1,48 +1,39 @@ -import { PaymentStatus, creditPackageTable, paymentProviderTransactionTable, userOrderTable, userPaymentTable } from '@base/server/db/schemas' -import type { UserInfoResponse } from '@logto/nuxt' -import { eq } from 'drizzle-orm' -import { createPayOSCheckout } from './payos' -import { createVNPayCheckout } from './vnpay' +import type { User } from '@base/server/types/models' +import { customAlphabet } from 'nanoid' export * from './payos' -export * from './vnpay' - export async function createPaymentCheckout( - provider: 'payos' | 'vnpay', + provider: 'payos' | 'vnpay' | 'sepay', payload: { clientIP?: string productIdentifier: string - user: UserInfoResponse + user: User }, ) { - if (!payload.productIdentifier || !payload.user || !payload.user.sub) { + if (!payload.productIdentifier || !payload.user || !payload.user.id) { throw createError({ statusCode: 400, - statusMessage: ErrorMessage.INVALID_BODY, + statusMessage: ErrorMessage.INVALID_WEBHOOK_BODY, }) } const [productType, productId] = payload.productIdentifier.split(':') - let productInfo: any + let productInfo: { id: string, price: number, amount: number, price_discount: number | null } | undefined + + const { createOrder, createPayment, createProviderTransaction } = usePayment() + const { getProductByProductId } = useProduct() switch (productType) { case 'credit': - productInfo = await db.query.creditPackageTable.findFirst({ - where: eq(creditPackageTable.id, productId), - columns: { - id: true, - price: true, - amount: true, - }, - }) + productInfo = await getProductByProductId(productId) break default: throw createError({ statusCode: 400, - statusMessage: ErrorMessage.INVALID_BODY, + statusMessage: ErrorMessage.INVALID_WEBHOOK_BODY, }) } @@ -53,61 +44,43 @@ export async function createPaymentCheckout( }) } - // TODO: what if the user has an existing order? - const date = new Date() - const { - userPayment, - paymentProviderTransaction, - } = await db.transaction(async (db) => { - const userOrder = (await db.insert(userOrderTable).values({ - user_id: payload.user.sub, - }).returning())[0] - - const userPayment = (await db.insert(userPaymentTable).values({ - amount: productInfo.price, - status: PaymentStatus.PENDING, - user_id: payload.user.sub, - order_id: userOrder.id, - created_at: date, - }).returning())[0] - - const paymentProviderTransaction = (await db.insert(paymentProviderTransactionTable).values({ - provider, - provider_transaction_id: date.getTime().toString(), - provider_transaction_status: PaymentStatus.PENDING, - provider_transaction_info: `${productType}:${productInfo.amount}`, - payment_id: userPayment.id, - user_id: payload.user.sub, - created_at: date, - }).returning())[0] - - return { - userPayment, - paymentProviderTransaction, - } - }) + const { getUserBestPrice } = useReference() + + const referCode = getCookie(useEvent(), REFERENCE_CODE_COOKIE_NAME) + + const price = await getUserBestPrice(payload.user.id, productInfo.price, productInfo.price_discount, referCode) + + const userOrder = await createOrder(productId, payload.user.id) + + const userPayment = await createPayment( + userOrder.id, + payload.user.id, + price, + ) + + // exclude underscore _ + const orderCode = customAlphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 16)() + + await createProviderTransaction( + userPayment.id, + payload.user.id, + orderCode, + provider, + productType, + productInfo, + ) switch (provider) { - case 'payos': - return await createPayOSCheckout({ - date, - amount: Number.parseInt(userPayment.amount), - buyerEmail: payload.user.email as string, - buyerPhone: payload.user.phone_number as string, - paymentProviderTransaction, - }) - case 'vnpay': - return createVNPayCheckout({ - date, - clientIP: payload.clientIP as string, - userPayment, - paymentProviderTransaction, + case 'sepay': + return await createSePayCheckout({ + orderCode, + amount: userPayment.amount, }) default: throw createError({ statusCode: 400, - statusMessage: ErrorMessage.INVALID_BODY, + statusMessage: ErrorMessage.INVALID_WEBHOOK_BODY, }) } } diff --git a/server/utils/payment/vn/payos.ts b/server/utils/payment/vn/payos.ts index 56ccaf2a..c6a159f1 100644 --- a/server/utils/payment/vn/payos.ts +++ b/server/utils/payment/vn/payos.ts @@ -2,34 +2,39 @@ import type { paymentProviderTransactionTable } from '@base/server/db/schemas' import PayOS from '@payos/node' -interface payOSCheckoutProps { - date: Date +interface PayOSCheckoutProps { + orderCode: number amount: number buyerEmail?: string buyerPhone?: string paymentProviderTransaction: typeof paymentProviderTransactionTable.$inferSelect } -export const payOSAdmin = new PayOS( - process.env.PAYOS_CLIENT_ID!, - process.env.PAYOS_API_KEY!, - process.env.PAYOS_CHECKSUM_KEY!, -) +export function getPayOSAdmin() { + const config = useRuntimeConfig() + + return new PayOS( + config.payos.clientId, + config.payos.apiKey, + config.payos.checksumKey, + ) +} export async function createPayOSCheckout({ - date, + orderCode, amount, buyerEmail, buyerPhone, paymentProviderTransaction, -}: payOSCheckoutProps) { - const runtimeConfig = useRuntimeConfig() - const { checkoutUrl } = await payOSAdmin.createPaymentLink({ - orderCode: date.getTime(), +}: PayOSCheckoutProps) { + const config = useRuntimeConfig() + + const { checkoutUrl } = await getPayOSAdmin().createPaymentLink({ + orderCode, amount, description: paymentProviderTransaction.provider_transaction_info, - cancelUrl: `${runtimeConfig.public.appBaseUrl}/api/payments/payos/cancel`, - returnUrl: `${runtimeConfig.public.appBaseUrl}/api/payments/payos/callback`, + cancelUrl: config.payos.cancelUrl || `${config.public.appBaseUrl}/app/settings/billing`, + returnUrl: config.payos.returnUrl || `${config.public.appBaseUrl}/app/settings/billing`, buyerEmail, buyerPhone, }) diff --git a/server/utils/payment/vn/sepay.ts b/server/utils/payment/vn/sepay.ts new file mode 100644 index 00000000..a28e8e61 --- /dev/null +++ b/server/utils/payment/vn/sepay.ts @@ -0,0 +1,29 @@ +import { withQuery } from 'ufo' + +interface SePayCheckoutProps { + orderCode: string + amount: number +} + +export async function createSePayCheckout({ + orderCode, + amount, +}: SePayCheckoutProps) { + const prefix = process.env.SEPAY_TRANSACTION_PREFIX || 'SP' + + if (prefix.length !== 2) { + throw createError({ + statusCode: 400, + statusMessage: 'Transaction prefix must be exactly 2 characters long.', + }) + } + + return withQuery('https://qr.sepay.vn/img', { + acc: process.env.SEPAY_BANK_NUMBER, + bank: process.env.SEPAY_BANK_NAME, + amount, + des: [prefix, orderCode].join(''), + template: 'compact', + download: false, + }) +} diff --git a/server/utils/payment/vn/vnpay.ts b/server/utils/payment/vn/vnpay.ts deleted file mode 100644 index 442502e9..00000000 --- a/server/utils/payment/vn/vnpay.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ProductCode, VNPay, VnpLocale, ignoreLogger } from 'vnpay' -import { format } from 'date-fns' -import type { paymentProviderTransactionTable, userPaymentTable } from '@base/server/db/schemas' - -interface VNPayCheckoutProps { - date: Date - clientIP: string - userPayment: typeof userPaymentTable.$inferSelect - paymentProviderTransaction: typeof paymentProviderTransactionTable.$inferSelect -} - -export const vnpayAdmin = new VNPay({ - tmnCode: process.env.VNP_TMNCODE!, - secureSecret: process.env.VNP_HASHSECRET!, - testMode: !process.env.DISABLE_TEST_MODE, - loggerFn: ignoreLogger, -}) - -export function createVNPayCheckout({ - date, - clientIP, - userPayment, - paymentProviderTransaction, -}: VNPayCheckoutProps) { - const runtimeConfig = useRuntimeConfig() - const paymentUrl = vnpayAdmin.buildPaymentUrl({ - vnp_Amount: Number(userPayment.amount), - vnp_CreateDate: Number(format(date, 'yyyyMMddHHmmss')), - vnp_IpAddr: clientIP || '127.0.0.1', // TODO: get real IP - vnp_Locale: VnpLocale.VN, - vnp_OrderInfo: paymentProviderTransaction.provider_transaction_info, - vnp_OrderType: ProductCode.Other, - vnp_ReturnUrl: `${runtimeConfig.public.appBaseUrl}/api/payments/vnpay/callback`, - vnp_TxnRef: userPayment.id, - }) - - return paymentUrl -} diff --git a/server/utils/storage.ts b/server/utils/storage.ts index 5cbafbde..aa23d217 100644 --- a/server/utils/storage.ts +++ b/server/utils/storage.ts @@ -1,23 +1,13 @@ -export function getStorageSessionKey(providerAccountId: string) { - return `session:${providerAccountId}` +export function getStorageSessionKey(sub: string) { + return `session:${sub}` } export function getStorageStripeKey(identifier: string) { return `stripe:${identifier}` } -function getStorage() { - const config = useRuntimeConfig() - - return (config.redis.host && config.redis.port && config.redis.password) - ? useStorage('redis') - : config.mongodb.connectionString - ? useStorage('mongodb') - : useStorage() -} - export async function tryWithCache(key: string, getter: () => Promise) { - const storage = getStorage() + const storage = useStorage('mongodb') const cachedResult = await storage.getItem(key) @@ -33,7 +23,7 @@ export async function tryWithCache(key: string, getter: () => Promise Date: Sat, 31 May 2025 17:51:37 +0700 Subject: [PATCH 02/24] fix: authorization logic --- .../components/navigation/HorizontalNavLink.vue | 8 ++++++-- .../components/navigation/VerticalNavLink.vue | 8 ++++++-- .../navigation/VerticalNavSectionTitle.vue | 8 ++++++-- app/@layouts/plugins/casl.ts | 10 +++++++--- app/utils/layout.ts | 14 +++++++++++--- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/app/@layouts/components/navigation/HorizontalNavLink.vue b/app/@layouts/components/navigation/HorizontalNavLink.vue index f5e83704..f9caca98 100644 --- a/app/@layouts/components/navigation/HorizontalNavLink.vue +++ b/app/@layouts/components/navigation/HorizontalNavLink.vue @@ -20,10 +20,14 @@ const { can } = useAbility() const router = useRouter() const visible = computed(() => { - if (!props.item.action || !props.item.subject) + if (!props.item.scopes) return true - return can(props.item.action, props.item.subject) + return props.item.scopes.some((scope: string) => { + const [action, subject] = scope.split(':') as [string, string] + + return can(action, subject) + }) }) diff --git a/app/@layouts/components/navigation/VerticalNavLink.vue b/app/@layouts/components/navigation/VerticalNavLink.vue index 0542e6cc..846ce2ba 100644 --- a/app/@layouts/components/navigation/VerticalNavLink.vue +++ b/app/@layouts/components/navigation/VerticalNavLink.vue @@ -17,10 +17,14 @@ const { can } = useAbility() const router = useRouter() const visible = computed(() => { - if (!props.item.action || !props.item.subject) + if (!props.item.scopes) return true - return can(props.item.action, props.item.subject) + return props.item.scopes.some((scope: string) => { + const [action, subject] = scope.split(':') as [string, string] + + return can(action, subject) + }) }) diff --git a/app/@layouts/components/navigation/VerticalNavSectionTitle.vue b/app/@layouts/components/navigation/VerticalNavSectionTitle.vue index b1389bf3..c75e25e1 100644 --- a/app/@layouts/components/navigation/VerticalNavSectionTitle.vue +++ b/app/@layouts/components/navigation/VerticalNavSectionTitle.vue @@ -14,10 +14,14 @@ const shallRenderIcon = configStore.isVerticalNavMini() const { can } = useAbility() const visible = computed(() => { - if (!props.item.action || !props.item.subject) + if (!props.item.scopes) return true - return can(props.item.action, props.item.subject) + return props.item.scopes.some((scope: string) => { + const [action, subject] = scope.split(':') as [string, string] + + return can(action, subject) + }) }) diff --git a/app/@layouts/plugins/casl.ts b/app/@layouts/plugins/casl.ts index 6149e543..50d18a79 100644 --- a/app/@layouts/plugins/casl.ts +++ b/app/@layouts/plugins/casl.ts @@ -8,8 +8,12 @@ export function canNavigate(to: RouteLocationNormalized) { const { can } = useAbility() - if (!to.meta.action || !to.meta.subject) - return true + return !to.meta.scopes || ( + Array.isArray(to.meta.scopes) + && to.meta.scopes.some((scope: string) => { + const [action, subject] = scope.split(':') as [string, string] - return can(to.meta.action, to.meta.subject) + return can(action, subject) + }) + ) } diff --git a/app/utils/layout.ts b/app/utils/layout.ts index 5697a844..71146b6e 100644 --- a/app/utils/layout.ts +++ b/app/utils/layout.ts @@ -21,11 +21,19 @@ export function createRouteTree(routes: RouteRecordNormalized[] = []): NavItem[] ]) } - if (!route.meta.action || !route.meta.subject || can(route.meta.action, route.meta.subject)) { + const canNavigate = !route.meta.scopes || ( + Array.isArray(route.meta.scopes) + && route.meta.scopes.some((scope: string) => { + const [action, subject] = scope.split(':') as [string, string] + + return can(action, subject) + }) + ) + + if (canNavigate) { tree.push({ ...item, - action: route.meta.action, - subject: route.meta.subject, + scopes: route.meta.scopes, to, }) } From 6bfd00e461c304a224778c1799c9d3f5b68dcbf8 Mon Sep 17 00:00:00 2001 From: Nguyen Huu Nguyen Y Date: Sat, 31 May 2025 18:17:32 +0700 Subject: [PATCH 03/24] chore: update docker --- .env.example | 14 +++--- Dockerfile | 69 ++++++++++++++------------- docker-compose.service.yml | 98 ++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 41 +++++----------- package.json | 6 +-- 5 files changed, 155 insertions(+), 73 deletions(-) create mode 100644 docker-compose.service.yml diff --git a/.env.example b/.env.example index 07e46c3e..0f670b9b 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,7 @@ AUTH_MAX_AGE="2592000" AWS_CLOUDFRONT_DOMAIN= + AWS_S3_ACCESS_KEY= AWS_S3_BUCKET="nuxt-template" AWS_S3_REGION= @@ -36,9 +37,10 @@ LOGTO_ADMIN_APP_ID="" LOGTO_ADMIN_APP_SECRET="" MONGODB_COLLECTION_NAME="nuxt-template-cache" -MONGODB_CONNECTION_STRING= +MONGODB_CONNECTION_STRING="mongodb://root:password@localhost:27017/nuxt-template?authSource=admin" MONGODB_DATABASE_NAME="nuxt-template" +NUXT_APP_CDN_URL="" NUXT_PUBLIC_API_BASE_URL="http://localhost:3000" NUXT_PUBLIC_APP_BASE_URL="http://localhost:3000" NUXT_PUBLIC_APP_NAME="nuxt-template" @@ -52,9 +54,9 @@ POSTGRES_PASSWORD="postgres" POSTGRES_PORT="54321" POSTGRES_USER="postgres" -REDIS_HOST= -REDIS_PASSWORD= -REDIS_PORT= +REDIS_HOST="localhost" +REDIS_PASSWORD="secret" +REDIS_PORT="6379" REDIS_USER="default" SMTP_FROM="noreply@example.com" @@ -70,10 +72,6 @@ STRIPE_PUBLISHABLE_KEY= STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= -VERCEL_ORG_ID= -VERCEL_PROJECT_ID= -VERCEL_TOKEN= - VNPAY_DISABLE_TEST_MODE= VNPAY_HASHSECRET= VNPAY_TMNCODE= diff --git a/Dockerfile b/Dockerfile index f8944c47..96f2c7c5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,42 +1,47 @@ -# Step 1: Base image for building -FROM node:22-bullseye-slim AS build -# Step 2: Set working directory +# Dockerfile +# Production-grade Dockerfile for Nuxt 3 with PNPM and Node 22 Alpine, multi-stage build +# --- Stage 1: Base Image Setup --- +FROM node:22-alpine AS base + +# Set working directory WORKDIR /app -# Step 3: Install dependencies for pnpm -RUN npm install -g pnpm@10.2.1 # Ensure a specific version of pnpm -# Step 4: Copy application files + +# --- Stage 2: Dependencies Installation --- +FROM base AS builder + +# Install pnpm globally +RUN npm install -g pnpm@latest + +COPY scripts/ ./scripts COPY .npmrc ./ COPY .nuxtignore ./ COPY package*.json ./ COPY pnpm-*.yaml ./ COPY *.config.ts ./ COPY tsconfig.json ./ -COPY package.json package.json +COPY public/ ./public COPY . . -# Step 5: Clean up old node_modules (if any) and install dependencies -RUN rm -rf node_modules && pnpm install -# Step 6: Build the application -RUN pnpm build -# Step 7: Use a smaller image for production -FROM node:22-bullseye-slim AS prod -# Step 8: Set working directory -WORKDIR /app -# Step 9: Install required packages (curl needed for AWS CLI) -RUN apt-get update && apt-get install -y curl unzip -# Step 10: Install pnpm (again) to ensure it's available in the production environment -RUN npm install -g pnpm@10.2.1 # Ensure the same version of pnpm -# Step 11: Copy built application from build stage -COPY --from=build /app /app -# Step 12: Remove unnecessary dev dependencies + +# Install dependencies RUN pnpm install -# Step 13: Install AWS CLI -RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \ - && unzip awscliv2.zip \ - && ./aws/install \ - && rm -rf awscliv2.zip aws -# Step 14: Expose port 3000 +RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm build + +FROM node:22-alpine AS production + +# Set working directory +WORKDIR /app + +RUN apk add --no-cache curl + +# Copy the .output directory from the builder stage +COPY --from=builder /app/.output ./.output + +COPY --from=builder /app/.env ./.env + +ENV NITRO_HOST=0.0.0.0 +ENV NITRO_PORT=3000 + EXPOSE 3000 -# Step 15: Push output files to S3 before starting the application -CMD aws s3 sync /app/.output s3://$AWS_S3_BUCKET -# Step 16: Start the application -CMD ["pnpm", "start"] + +# Command to run the Nuxt application +CMD ["node", ".output/server/index.mjs"] diff --git a/docker-compose.service.yml b/docker-compose.service.yml new file mode 100644 index 00000000..16e6c105 --- /dev/null +++ b/docker-compose.service.yml @@ -0,0 +1,98 @@ +version: '3.7' + +services: + postgres: + container_name: nuxt-template-pg + image: postgres:latest + volumes: + - ./docker/postgres:/var/lib/postgresql/data + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_DB: ${POSTGRES_DB:-postgres} + POSTGRES_PORT: ${POSTGRES_PORT:-5432} + ports: + - '${POSTGRES_PORT}:5432' + restart: unless-stopped + + redis: + container_name: nuxt-template-redis + image: redis:latest + volumes: + - ./docker/redis:/data + environment: + REDIS_PASSWORD: ${REDIS_PASSWORD:-redis} + ports: + - '${REDIS_PORT}:6379' + restart: unless-stopped + + mondodb: + container_name: nuxt-template-mongodb + image: mongo:latest + volumes: + - ./docker/mongodb:/data/db + environment: + MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:-root} + MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:-password} + ports: + - '27017:27017' + restart: unless-stopped + + mailhog: + container_name: nuxt-template-mailhog + image: mailhog/mailhog:latest + volumes: + - ./docker/mailhog:/data + ports: + - '${SMTP_PORT:-1025}:1025' # SMTP server port + - '${SMTP_WEB_PORT:-8025}:8025' # Web UI port + restart: unless-stopped + + logto: + depends_on: + postgres-logto: + condition: service_healthy + image: svhd/logto:latest + container_name: nuxt-template-logto + entrypoint: ["sh", "-c", "npm run cli db seed -- --swe && npm start"] + volumes: + - ./docker/logto:/opt/logto/packages/core/data + ports: + - '3001:3001' + - '3002:3002' + environment: + - TRUST_PROXY_HEADER=1 + - DB_URL=postgresql://postgres:p0stgr3s@postgres-logto:5432/logto + - ENDPOINT + - ADMIN_ENDPOINT + restart: unless-stopped + + postgres-logto: + image: postgres:latest + container_name: nuxt-template-pg-logto + volumes: + - ./docker/postgres-logto:/var/lib/postgresql/data + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: p0stgr3s + POSTGRES_DB: logto + ports: + - '54333:5432' + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 10s + timeout: 5s + retries: 5 + restart: unless-stopped + +volumes: + postgres: + driver: local + pgadmin: + driver: local + redis: + driver: local + mondodb: + driver: local + logto: + driver: local diff --git a/docker-compose.yml b/docker-compose.yml index bf43fbc9..931a555b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,31 +1,12 @@ -services: - postgres: - container_name: nuxt-pg - image: postgres:latest - volumes: - - ./docker/postgres:/var/lib/postgresql/data - environment: - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - POSTGRES_DB: ${POSTGRES_DB:-postgres} - POSTGRES_HOSTNAME: ${POSTGRES_HOSTNAME:-nuxt-pg} - POSTGRES_PORT: ${POSTGRES_PORT:-5432} - ports: - - "${POSTGRES_PORT}:5432" - restart: unless-stopped - redis: - container_name: nuxt-redis - image: redis:latest - volumes: - - ./docker/redis:/data - environment: - REDIS_PASSWORD: ${REDIS_PASSWORD:-redis} - ports: - - "${REDIS_PORT}:6379" - restart: unless-stopped +version: "3.9" -volumes: - postgres: - driver: local - redis: - driver: local +services: + nuxt-template: + image: "registry.digitalocean.com/thecodeorigin/nuxt-template:latest" + command: > + sh -c "node .output/server/index.mjs" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000"] + interval: 30s + timeout: 10s + retries: 5 diff --git a/package.json b/package.json index 67b65f82..10ce59a5 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,9 @@ "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", "db:seed": "jiti ./server/db/seeds/index.seed.ts", - "docker:clear": "rimraf ./docker/postgres ./docker/redis", - "docker:start": "docker compose up -d", - "docker:stop": "docker-compose down", + "docker:clear": "rimraf ./docker/postgres ./docker/redis ./docker/mondodb", + "docker:start": "docker compose -f docker-compose.service.yml up -d --force-recreate", + "docker:stop": "docker-compose -f docker-compose.service.yml down", "docker:reset": "pnpm docker:stop && pnpm docker:clear && pnpm docker:start --force-recreate", "gettext:extract": "vue-gettext-extract", "gettext:compile": "vue-gettext-compile" From 5b26f8b50511e8e2977267969450397f9f6533b1 Mon Sep 17 00:00:00 2001 From: Nguyen Huu Nguyen Y Date: Sat, 31 May 2025 18:26:31 +0700 Subject: [PATCH 04/24] chore: update example env --- .env.example | 7 ++++++- .gitignore | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 0f670b9b..3c4ba592 100644 --- a/.env.example +++ b/.env.example @@ -31,7 +31,7 @@ GOOGLE_CLIENT_SECRET= LOGTO_APP_ID= LOGTO_APP_SECRET= LOGTO_COOKIE_ENCRYPTION_KEY= -LOGTO_ENDPOINT="" +LOGTO_ENDPOINT="https://auth.thecodeorigin.com" LOGTO_ADMIN_APP_ID="" LOGTO_ADMIN_APP_SECRET="" @@ -79,3 +79,8 @@ VNPAY_TMNCODE= PAYOS_CLIENT_ID= PAYOS_API_KEY= PAYOS_CHECKSUM_KEY= + +SEPAY_WEBHOOK_SIGNING_KEY= +SEPAY_BANK_NUMBER= +SEPAY_BANK_NAME= +SEPAY_TRANSACTION_PREFIX= diff --git a/.gitignore b/.gitignore index 843c876d..b6b09a0e 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ server/db/schemas/mjs server/db/migrations areas +docker From 7f2a2270eb786b00be3e5a99db82807f5196091f Mon Sep 17 00:00:00 2001 From: Nguyen Huu Nguyen Y Date: Sat, 31 May 2025 18:29:47 +0700 Subject: [PATCH 05/24] feat: add api folder --- app/api/auth.ts | 20 +++++++++ app/api/casl.ts | 9 +++++ app/api/credit.ts | 12 ++++++ app/api/health.ts | 9 +++++ app/api/notification.ts | 89 +++++++++++++++++++++++++++++++++++++++++ app/api/payment.ts | 37 +++++++++++++++++ app/api/product.ts | 19 +++++++++ app/api/s3.ts | 12 ++++++ app/api/stripe.ts | 30 ++++++++++++++ nuxt.config.ts | 1 + 10 files changed, 238 insertions(+) create mode 100644 app/api/auth.ts create mode 100644 app/api/casl.ts create mode 100644 app/api/credit.ts create mode 100644 app/api/health.ts create mode 100644 app/api/notification.ts create mode 100644 app/api/payment.ts create mode 100644 app/api/product.ts create mode 100644 app/api/s3.ts create mode 100644 app/api/stripe.ts diff --git a/app/api/auth.ts b/app/api/auth.ts new file mode 100644 index 00000000..50709c87 --- /dev/null +++ b/app/api/auth.ts @@ -0,0 +1,20 @@ +export function useApiAuth() { + function updateProfile(payload: Partial<{ username: string, name: string, avatar: string }>) { + return $api('/api/auth/me', { + method: 'PATCH', + body: payload, + }) + } + + function updatePassword(payload: Partial<{ password: string }>) { + return $api('/api/auth/password', { + method: 'POST', + body: payload, + }) + } + + return { + updateProfile, + updatePassword, + } +} diff --git a/app/api/casl.ts b/app/api/casl.ts new file mode 100644 index 00000000..6a0eae10 --- /dev/null +++ b/app/api/casl.ts @@ -0,0 +1,9 @@ +export function useApiCasl() { + function fetchScopes() { + return $api('/api/scopes') + } + + return { + fetchScopes, + } +} diff --git a/app/api/credit.ts b/app/api/credit.ts new file mode 100644 index 00000000..20ccaee2 --- /dev/null +++ b/app/api/credit.ts @@ -0,0 +1,12 @@ +import type { User } from '@base/server/types/models' + +export function useApiCredit() { + function fetchCredit() { + // Get user credit from our database instead of depending on Logto data + return $api<{ data: User }>('/api/auth/me') + } + + return { + fetchCredit, + } +} diff --git a/app/api/health.ts b/app/api/health.ts new file mode 100644 index 00000000..97ff6d67 --- /dev/null +++ b/app/api/health.ts @@ -0,0 +1,9 @@ +export function useApiHealth() { + function fetchHealthCheck() { + return $api<{ success: true }>('/api/health') + } + + return { + fetchHealthCheck, + } +} diff --git a/app/api/notification.ts b/app/api/notification.ts new file mode 100644 index 00000000..76216b23 --- /dev/null +++ b/app/api/notification.ts @@ -0,0 +1,89 @@ +import type { ParsedFilterQuery } from '@base/server/utils/filter' + +export function useApiNotification() { + function fetchNotifications(query?: Partial) { + return $api(`/api/notifications`, { + query, + }) + } + + function markRead(id: string) { + return $api(`/api/notifications/${id}`, { + method: 'PATCH', + body: { + read_at: new Date(), + }, + }) + } + + function markUnread(id: string) { + return $api(`/api/notifications/${id}`, { + method: 'PATCH', + body: { + read_at: null, + }, + }) + } + + function markAllRead() { + return $api(`/api/notifications/read`, { + method: 'PATCH', + }) + } + + function markAllUnread() { + return $api(`/api/notifications/unread`, { + method: 'PATCH', + }) + } + + function deleteNotification(id: string) { + return $api(`/api/notifications/${id}`, { + method: 'DELETE', + }) + } + + function countUnreadNotifications() { + return $api(`/api/notifications/unread`) + } + + function createTokenDevice(token: string) { + return $api(`/api/devices`, { + method: 'POST', + body: { token }, + }) + } + + function deleteTokenDevice(token: string) { + return $api(`/api/devices`, { + method: 'DELETE', + body: { token }, + }) + } + + function updateSettings(payload: Partial<{ + email: boolean | null + desktop: boolean | null + product_updates: boolean | null + weekly_digest: boolean | null + important_updates: boolean | null + }>) { + return $api('/api/auth/notification', { + method: 'PATCH', + body: payload, + }) + } + + return { + fetchNotifications, + markRead, + markUnread, + markAllRead, + markAllUnread, + deleteNotification, + countUnreadNotifications, + createTokenDevice, + deleteTokenDevice, + updateSettings, + } +} diff --git a/app/api/payment.ts b/app/api/payment.ts new file mode 100644 index 00000000..3de49948 --- /dev/null +++ b/app/api/payment.ts @@ -0,0 +1,37 @@ +import type { PaymentStatus } from '@base/server/db/schemas' + +export function useApiPayment() { + function checkout(type: 'payos' | 'vnpay' | 'sepay', productIdentifier: string) { + if (type !== 'payos' && type !== 'vnpay' && type !== 'sepay') + throw new Error('Invalid payment provider') + + return $api<{ + data: { + message: string + paymentUrl: string + } + }>(`api/payments/${type}/checkout`, { + method: 'POST', + body: { + productIdentifier, + }, + }) + } + + function checkStatus(type: 'payos' | 'vnpay' | 'sepay', description: string) { + return $api<{ + data: { + status: PaymentStatus + } + }>(`api/payments/${type}/status`, { + params: { + description, + }, + }) + } + + return { + checkout, + checkStatus, + } +} diff --git a/app/api/product.ts b/app/api/product.ts new file mode 100644 index 00000000..1b3f594e --- /dev/null +++ b/app/api/product.ts @@ -0,0 +1,19 @@ +import type { productTable } from '@base/server/db/schemas' +import type { InferSelectModel } from 'drizzle-orm' + +export type Product = InferSelectModel + +export function useApiProduct() { + function fetchProducts() { + return $api<{ data: Product[] }>('/api/products') + } + + function fetchCreditPackages() { + return $api<{ data: Product[] }>('/api/products/credit-packages') + } + + return { + fetchProducts, + fetchCreditPackages, + } +} diff --git a/app/api/s3.ts b/app/api/s3.ts new file mode 100644 index 00000000..f2325c12 --- /dev/null +++ b/app/api/s3.ts @@ -0,0 +1,12 @@ +export function useApiS3() { + function getSignedUrl(filename: string) { + return $api<{ uploadUrl: string, assetUrl: string }>('/api/s3', { + method: 'PUT', + body: { filename }, + }) + } + + return { + getSignedUrl, + } +} diff --git a/app/api/stripe.ts b/app/api/stripe.ts new file mode 100644 index 00000000..40354dad --- /dev/null +++ b/app/api/stripe.ts @@ -0,0 +1,30 @@ +export function useApiStripe() { + function fetchStripeProducts() { + return $api('/api/payments/stripe/products') + } + + function fetchStripePrices(productId: string) { + return $api(`/api/payments/stripe/products/${productId}/prices`) + } + + function fetchStripeSubscription() { + return $api('/api/payments/stripe/me') + } + + async function createSubscriptionCheckoutUrl(customerId: string, priceId: string) { + return $api<{ url: string }>(`/api/payments/stripe/customers/${customerId}/checkout`, { + method: 'POST', + body: { + priceId, + redirectPath: '/settings/billing-plans', + }, + }) + } + + return { + fetchStripeProducts, + fetchStripePrices, + fetchStripeSubscription, + createSubscriptionCheckoutUrl, + } +} diff --git a/nuxt.config.ts b/nuxt.config.ts index 0f5f6aa3..51773cf4 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -150,6 +150,7 @@ export default defineNuxtConfig({ dirs: [ fileURLToPath(new URL('./app/@core/utils', import.meta.url)), fileURLToPath(new URL('./app/@core/composable', import.meta.url)), + fileURLToPath(new URL('./app/api', import.meta.url)), ], }, From dca3d57a7b4c8fa3d05b920d029d773a8f382572 Mon Sep 17 00:00:00 2001 From: Nguyen Huu Nguyen Y Date: Sun, 8 Jun 2025 23:57:49 +0700 Subject: [PATCH 06/24] chore: remove redundant store --- app/@layouts/components/NavbarShortcuts.vue | 41 - app/@layouts/components/UserProfile.vue | 27 +- .../layout/DefaultLayoutWithHorizontalNav.vue | 3 +- .../layout/DefaultLayoutWithVerticalNav.vue | 3 +- app/api/auth.ts | 8 + app/app.vue | 33 +- .../AccountSettingsAccount.vue | 4 +- app/composables/useMessaging.ts | 6 - app/error.vue | 2 +- app/middleware/01.health.global.ts | 4 +- app/middleware/02.authentication.global.ts | 26 +- app/pages/auth/login.vue | 1 + app/pages/dashboard.vue | 1 + app/pages/faq.vue | 239 --- app/plugins/auth.ts | 17 - app/plugins/casl.ts | 1 - app/plugins/notification.client.ts | 30 - app/stores/auth.ts | 47 +- app/stores/casl.ts | 2 +- app/stores/faq.ts | 11 - app/stores/health.ts | 19 - app/stores/notification.ts | 59 - app/stores/payment.ts | 24 - app/stores/s3.ts | 12 - app/stores/shortcut.ts | 45 - app/stores/stripe.ts | 21 +- app/stores/subscription.ts | 13 +- app/stores/token.ts | 37 - app/utils/api.ts | 6 +- app/utils/i18n.ts | 24 + docker/.gitkeep | 1 + modules/sentry/runtime/plugin.ts | 1 - nuxt.config.ts | 18 +- package.json | 21 +- pnpm-lock.yaml | 1399 +++++++++++------ server/api/notifications.ts | 256 --- 36 files changed, 1030 insertions(+), 1432 deletions(-) delete mode 100644 app/@layouts/components/NavbarShortcuts.vue delete mode 100644 app/composables/useMessaging.ts delete mode 100644 app/pages/faq.vue delete mode 100644 app/plugins/auth.ts delete mode 100644 app/plugins/notification.client.ts delete mode 100644 app/stores/faq.ts delete mode 100644 app/stores/health.ts delete mode 100644 app/stores/notification.ts delete mode 100644 app/stores/payment.ts delete mode 100644 app/stores/s3.ts delete mode 100644 app/stores/shortcut.ts delete mode 100644 app/stores/token.ts create mode 100644 app/utils/i18n.ts delete mode 100644 server/api/notifications.ts diff --git a/app/@layouts/components/NavbarShortcuts.vue b/app/@layouts/components/NavbarShortcuts.vue deleted file mode 100644 index 38eca5f1..00000000 --- a/app/@layouts/components/NavbarShortcuts.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - diff --git a/app/@layouts/components/UserProfile.vue b/app/@layouts/components/UserProfile.vue index 7be2828f..9f00cd98 100644 --- a/app/@layouts/components/UserProfile.vue +++ b/app/@layouts/components/UserProfile.vue @@ -4,18 +4,13 @@ import { PerfectScrollbar } from 'vue3-perfect-scrollbar' const { t } = useI18n() const authStore = useAuthStore() -const tokenDeviceStore = useTokenDeviceStore() -const userEmail = computed(() => authStore.currentUser?.email) -const userAvatar = computed(() => authStore.currentUser?.picture) +const userEmail = computed(() => authStore.currentUser?.primary_email) +const userAvatar = computed(() => authStore.currentUser?.avatar) const userFullname = computed(() => authStore.currentUser?.name) -const userRole = computed(() => authStore.currentUser?.roles?.[0] || authStore.currentUser?.organization_roles?.[0] || t('User')) async function logout() { try { - if (authStore.currentUser) - await tokenDeviceStore.clearTokenDevice() - - await authStore.signOut() + await navigateTo({ path: '/sign-out' }, { external: true }) navigateTo({ name: 'auth-login' }) } @@ -51,12 +46,12 @@ const userProfileList = computed @@ -114,8 +109,8 @@ const userProfileList = computed {{ userFullname || userEmail }} -

diff --git a/app/@layouts/components/layout/DefaultLayoutWithHorizontalNav.vue b/app/@layouts/components/layout/DefaultLayoutWithHorizontalNav.vue index ecd89e3d..47c9ede1 100644 --- a/app/@layouts/components/layout/DefaultLayoutWithHorizontalNav.vue +++ b/app/@layouts/components/layout/DefaultLayoutWithHorizontalNav.vue @@ -30,8 +30,7 @@ const config = useRuntimeConfig() - - + diff --git a/app/@layouts/components/layout/DefaultLayoutWithVerticalNav.vue b/app/@layouts/components/layout/DefaultLayoutWithVerticalNav.vue index 4e128fe1..81215313 100644 --- a/app/@layouts/components/layout/DefaultLayoutWithVerticalNav.vue +++ b/app/@layouts/components/layout/DefaultLayoutWithVerticalNav.vue @@ -39,8 +39,7 @@ watch([ - - + diff --git a/app/api/auth.ts b/app/api/auth.ts index 50709c87..bb58fa78 100644 --- a/app/api/auth.ts +++ b/app/api/auth.ts @@ -1,4 +1,11 @@ +import type { User } from '@base/server/types/models' + export function useApiAuth() { + function fetchProfile() { + // Get user credit from our database instead of depending on Logto data + return $api<{ data: User }>('/api/auth/me') + } + function updateProfile(payload: Partial<{ username: string, name: string, avatar: string }>) { return $api('/api/auth/me', { method: 'PATCH', @@ -14,6 +21,7 @@ export function useApiAuth() { } return { + fetchProfile, updateProfile, updatePassword, } diff --git a/app/app.vue b/app/app.vue index 2ea7d585..d425abcd 100644 --- a/app/app.vue +++ b/app/app.vue @@ -1,6 +1,6 @@ diff --git a/app/components/account-settings/AccountSettingsAccount.vue b/app/components/account-settings/AccountSettingsAccount.vue index f5dde848..366b405d 100644 --- a/app/components/account-settings/AccountSettingsAccount.vue +++ b/app/components/account-settings/AccountSettingsAccount.vue @@ -5,6 +5,8 @@ const config = useRuntimeConfig() const inputFileRef = ref() +const authApi = useApiAuth() + const authStore = useAuthStore() const formFile = ref(null) @@ -97,7 +99,7 @@ async function handleSubmit() { if (formFile.value && authStore.currentUser) avatarUrl = await uploadToS3(formFile.value, authStore.currentUser.sub) - await authStore.updateProfile({ + await authApi.updateProfile({ ...formData.value, avatar: avatarUrl, }) diff --git a/app/composables/useMessaging.ts b/app/composables/useMessaging.ts deleted file mode 100644 index 7356cde3..00000000 --- a/app/composables/useMessaging.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { getMessaging } from 'firebase/messaging' -import { useFirebaseApp } from 'vuefire' - -export function useMessaging() { - return getMessaging(useFirebaseApp()) -} diff --git a/app/error.vue b/app/error.vue index e9a77c92..7eccd4c1 100644 --- a/app/error.vue +++ b/app/error.vue @@ -12,7 +12,7 @@ defineProps<{ diff --git a/app/middleware/01.health.global.ts b/app/middleware/01.health.global.ts index b2351c95..4bcf4454 100644 --- a/app/middleware/01.health.global.ts +++ b/app/middleware/01.health.global.ts @@ -2,10 +2,8 @@ export default defineNuxtRouteMiddleware(async (to) => { if (to.meta.public || import.meta.prerender) return - const healthStore = useHealthStore() - try { - await healthStore.fetchHealthCheck() + await useApiHealth().fetchHealthCheck() } catch { throw createError({ diff --git a/app/middleware/02.authentication.global.ts b/app/middleware/02.authentication.global.ts index b2645a70..77c22e55 100644 --- a/app/middleware/02.authentication.global.ts +++ b/app/middleware/02.authentication.global.ts @@ -2,24 +2,20 @@ export default defineNuxtRouteMiddleware(async (to) => { if (to.meta.public) return - if (to.meta.auth || to.meta.auth === undefined) { - const authStore = useAuthStore() + const authStore = useAuthStore() - if (authStore.currentUser) { - if (to.meta.unauthenticatedOnly) - return navigateTo('/') + if (to.meta.unauthenticatedOnly && authStore.currentUser) { + return navigateTo({ path: '/dashboard' }) + } - try { - await authStore.fetchToken() - } - catch { - notifyError({ - content: 'Failed to retrieve user token.', - }) - } + if (to.meta.auth || to.meta.auth === undefined) { + try { + await authStore.fetchProfile() } - else if (!to.meta.unauthenticatedOnly) { - return navigateTo('/auth/login') + catch {} + + if (!authStore.currentUser) { + return navigateTo({ path: '/auth/login' }) } } }) diff --git a/app/pages/auth/login.vue b/app/pages/auth/login.vue index ac006035..766666eb 100644 --- a/app/pages/auth/login.vue +++ b/app/pages/auth/login.vue @@ -20,6 +20,7 @@ const authThemeMask = useGenerateImageVariant(authV2LoginMaskLight, authV2LoginM definePageMeta({ layout: 'blank', + auth: false, unauthenticatedOnly: true, }) diff --git a/app/pages/dashboard.vue b/app/pages/dashboard.vue index c3b9e6ac..24b0d413 100644 --- a/app/pages/dashboard.vue +++ b/app/pages/dashboard.vue @@ -1,5 +1,6 @@ - - - - diff --git a/app/plugins/auth.ts b/app/plugins/auth.ts deleted file mode 100644 index 6f63bacc..00000000 --- a/app/plugins/auth.ts +++ /dev/null @@ -1,17 +0,0 @@ -export default defineNuxtPlugin({ - name: 'auth', - async setup() { - const authStore = useAuthStore() - - if (authStore.currentUser) { - try { - await authStore.fetchToken() - } - catch { - notifyError({ - content: 'Failed to retrieve user token.', - }) - } - } - }, -}) diff --git a/app/plugins/casl.ts b/app/plugins/casl.ts index 34d5e3b6..de94549f 100644 --- a/app/plugins/casl.ts +++ b/app/plugins/casl.ts @@ -1,5 +1,4 @@ export default defineNuxtPlugin({ - dependsOn: ['auth'], async setup() { const caslStore = useCaslStore() diff --git a/app/plugins/notification.client.ts b/app/plugins/notification.client.ts deleted file mode 100644 index 5e88bb8f..00000000 --- a/app/plugins/notification.client.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getMessaging, getToken } from 'firebase/messaging' -import { isInAppBrowser } from '@base/utils/browser' - -export default defineNuxtPlugin({ - setup(nuxtApp) { - const authStore = useAuthStore() - const healthStore = useHealthStore() - const tokenDeviceStore = useTokenDeviceStore() - - const config = useRuntimeConfig() - - nuxtApp.hook('app:mounted', async () => { - if (healthStore.isHealthy && !isInAppBrowser()) { - if (authStore.currentUser) { - try { - if (Notification.permission !== 'granted') - await Notification.requestPermission() - - if (Notification.permission === 'granted' && authStore.currentUser) { - const messaging = getMessaging() - const token = await getToken(messaging, { vapidKey: config.public.firebase.keyPair }) - await tokenDeviceStore.setTokenDevice(token) - } - } - catch {} - } - } - }) - }, -}) diff --git a/app/stores/auth.ts b/app/stores/auth.ts index d5d2982e..3376dec9 100644 --- a/app/stores/auth.ts +++ b/app/stores/auth.ts @@ -1,45 +1,30 @@ -import type { UserInfoResponse } from '@logto/nuxt' +import type { User } from '@base/server/types/models' export const useAuthStore = defineStore('auth', () => { - const config = useRuntimeConfig() + const currentUser = useState('currentUser', () => null) - const client = useLogtoClient() + const crsfToken = computed(() => { + if (import.meta.server) + return useNuxtApp().ssrContext?.event?.context?.csrfToken - const accessToken = useState('accessToken', () => null) + return window.document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') + }) - const currentUser = useLogtoUser() as UserInfoResponse & { - custom_data?: { credit: number } - } | null + const authApi = useApiAuth() - const currentRoles = computed(() => currentUser?.roles || null) + async function fetchProfile() { + if (!currentUser.value) { + const response = await authApi.fetchProfile() - async function fetchToken() { - if (client && !accessToken.value && await client.isAuthenticated()) - accessToken.value = await client.getAccessToken(config.public.apiBaseUrl) - } - - function signIn() { - return navigateTo({ path: '/sign-in' }, { external: true }) - } - - function signOut() { - return navigateTo({ path: '/sign-out' }, { external: true }) - } + currentUser.value = response.data + } - function updateProfile(payload: Partial<{ username: string, name: string, avatar: string }>) { - return $api('/api/me', { - method: 'PATCH', - body: payload, - }) + return currentUser.value } return { - accessToken, + crsfToken, currentUser, - currentRoles, - signIn, - signOut, - fetchToken, - updateProfile, + fetchProfile, } }) diff --git a/app/stores/casl.ts b/app/stores/casl.ts index fca99bd2..95d0f099 100644 --- a/app/stores/casl.ts +++ b/app/stores/casl.ts @@ -38,7 +38,7 @@ export const useCaslStore = defineStore('casl', () => { ) async function fetchScopes() { - const response = await $api('/api/scopes') + const response = await useApiCasl().fetchScopes() if (Array.isArray(response)) { scopes.value = response.map((scope) => { diff --git a/app/stores/faq.ts b/app/stores/faq.ts deleted file mode 100644 index 8eba79dd..00000000 --- a/app/stores/faq.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const useFaqStore = defineStore('faq', () => { - async function fetchFaqs(query: Partial) { - return $api('/api/faq', { - query, - }) - } - - return { - fetchFaqs, - } -}) diff --git a/app/stores/health.ts b/app/stores/health.ts deleted file mode 100644 index d51dc59d..00000000 --- a/app/stores/health.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const useHealthStore = defineStore('health', () => { - const isHealthy = ref(false) - - async function fetchHealthCheck() { - try { - await $api('/api/health') - - isHealthy.value = true - } - catch { - isHealthy.value = false - } - } - - return { - isHealthy, - fetchHealthCheck, - } -}) diff --git a/app/stores/notification.ts b/app/stores/notification.ts deleted file mode 100644 index 219cdca1..00000000 --- a/app/stores/notification.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { ParsedFilterQuery } from '@base/server/utils/filter' - -export const useNotificationStore = defineStore('notification', () => { - const authStore = useAuthStore() - - function fetchNotifications(query: Partial) { - return $api(`/api/users/${authStore.currentUser?.sub}/notifications`, { - query, - }) - } - - async function markRead(id: string) { - return $api(`/api/users/${authStore.currentUser?.sub}/notifications/${id}`, { - method: 'PATCH', - body: { - read_at: new Date(), - }, - }) - } - - async function markUnread(id: string) { - return $api(`/api/users/${authStore.currentUser?.sub}/notifications/${id}`, { - method: 'PATCH', - body: { - read_at: null, - }, - }) - } - - async function markAllRead() { - return $api(`/api/users/${authStore.currentUser?.sub}/notifications/mark-all-read`, { - method: 'PATCH', - }) - } - - async function markAllUnread() { - return $api(`/api/users/${authStore.currentUser?.sub}/notifications/mark-all-unread`, { - method: 'PATCH', - }) - } - - async function deleteNotification(id: string) { - return $api(`/api/users/${authStore.currentUser?.sub}/notifications/${id}`, { - method: 'DELETE', - }) - } - async function countUnreadNotifications() { - return $api(`/api/users/${authStore.currentUser?.sub}/notifications/unread`) - } - return { - fetchNotifications, - markRead, - markUnread, - markAllRead, - markAllUnread, - deleteNotification, - countUnreadNotifications, - } -}) diff --git a/app/stores/payment.ts b/app/stores/payment.ts deleted file mode 100644 index d43b1728..00000000 --- a/app/stores/payment.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const usePaymentStore = defineStore('payment', () => { - async function checkout(type: 'payos' | 'vnpay', productIdentifier: string) { - if (type !== 'payos' && type !== 'vnpay') - throw new Error('Invalid payment provider') - - const { data } = await $api<{ - data: { - message: string - paymentUrl: string - } - }>(`/api/payments/${type}/checkout`, { - method: 'POST', - body: { - productIdentifier, - }, - }) - - return data - } - - return { - checkout, - } -}) diff --git a/app/stores/s3.ts b/app/stores/s3.ts deleted file mode 100644 index 044204ef..00000000 --- a/app/stores/s3.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const useS3Store = defineStore('s3', () => { - function getSignedUrl(filename: string) { - return $api('/api/s3', { - method: 'PUT', - body: { filename }, - }) - } - - return { - getSignedUrl, - } -}) diff --git a/app/stores/shortcut.ts b/app/stores/shortcut.ts deleted file mode 100644 index 295fcdf2..00000000 --- a/app/stores/shortcut.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { userShortcutTable } from '@base/server/db/schemas' -import type { InferSelectModel } from 'drizzle-orm' - -export type RawShortcut = InferSelectModel - -export const useShortcutStore = defineStore('shortcut', () => { - const authStore = useAuthStore() - - const userShortcuts = ref([]) - - async function getUserShortcuts() { - if (!userShortcuts.value.length) { - const response = await $api(`/api/users/${authStore.currentUser?.sub}/shortcuts`) - - userShortcuts.value = response.data - } - - return userShortcuts.value - } - - async function postUserShortcut(route: string) { - const response = await $api(`/api/users/${authStore.currentUser?.sub}/shortcuts`, { - method: 'POST', - body: JSON.stringify({ - route, - }), - }) - - userShortcuts.value.push(response.data) - } - - async function deleteUserShortcut(shortcutId: string) { - const response = await $api(`/api/users/${authStore.currentUser?.sub}/shortcuts/${shortcutId}`, { - method: 'DELETE', - }) - - userShortcuts.value = userShortcuts.value.filter(shortcut => shortcut.id !== response.data[0]?.id) - } - return { - userShortcuts, - getUserShortcuts, - postUserShortcut, - deleteUserShortcut, - } -}) diff --git a/app/stores/stripe.ts b/app/stores/stripe.ts index 384e17a9..f5ce0f8e 100644 --- a/app/stores/stripe.ts +++ b/app/stores/stripe.ts @@ -1,21 +1,28 @@ import type Stripe from 'stripe' export const useStripeStore = defineStore('stripe', () => { - const stripeProducts = ref([]) - const stripePrices = ref>({}) + const stripePrices = ref([]) - async function fetchStripeProductPrices() { - stripeProducts.value = await $api('/api/payments/stripe/products') + const stripeApi = useApiStripe() - for (const product of stripeProducts.value) { - stripePrices.value[product.id] = await $api(`/api/payments/stripe/products/${product.id}/prices`) + async function fetchStripeProductPrices() { + if (stripePrices.value && stripePrices.value.length > 0) { + return stripePrices.value } + const { data: products } = await stripeApi.fetchStripeProducts() + + if (!products?.[0]) + return [] + + const res = await stripeApi.fetchStripePrices(products[0].id) + + stripePrices.value = res.data || [] + return stripePrices.value } return { - stripeProducts, stripePrices, fetchStripeProductPrices, } diff --git a/app/stores/subscription.ts b/app/stores/subscription.ts index 8a1060eb..aa242974 100644 --- a/app/stores/subscription.ts +++ b/app/stores/subscription.ts @@ -14,7 +14,7 @@ export const useSubscriptionStore = defineStore('subscription', () => { async function fetchSubscriptions() { try { - const data = await $api('/api/payments/stripe/me') + const data = await useApiStripe().fetchStripeSubscription() customer.value = data.customer currentSubscription.value = data.subscription subscriptions.value = data.subscriptions @@ -24,22 +24,11 @@ export const useSubscriptionStore = defineStore('subscription', () => { } } - async function createSubscriptionCheckoutUrl(customerId: string, priceId: string) { - return $api(`/api/payments/stripe/customers/${customerId}/checkout`, { - method: 'POST', - body: { - priceId, - redirectPath: '/settings/billing-plans', - }, - }) - } - return { customer, subscriptions, isSubscriptionValid, currentSubscription, fetchSubscriptions, - createSubscriptionCheckoutUrl, } }) diff --git a/app/stores/token.ts b/app/stores/token.ts deleted file mode 100644 index 5439d34e..00000000 --- a/app/stores/token.ts +++ /dev/null @@ -1,37 +0,0 @@ -export const useTokenDeviceStore = defineStore('token-device', () => { - const authStore = useAuthStore() - - const tokenDevice = ref(null) - - async function setTokenDevice(token: string) { - try { - tokenDevice.value = token - await $api(`/api/users/${authStore.currentUser?.sub}/devices`, { - method: 'POST', - body: { token }, - }) - } - catch (error) { - console.error(error) - } - } - - async function clearTokenDevice() { - try { - await $api(`/api/users/${authStore.currentUser?.sub}/devices`, { - method: 'DELETE', - body: { token: tokenDevice.value }, - }) - tokenDevice.value = null - } - catch (error) { - console.error(error) - } - } - - return { - tokenDevice, - setTokenDevice, - clearTokenDevice, - } -}) diff --git a/app/utils/api.ts b/app/utils/api.ts index a3f8f6eb..989dfefb 100644 --- a/app/utils/api.ts +++ b/app/utils/api.ts @@ -6,19 +6,15 @@ export const $api = $fetch.create({ retryStatusCodes: [503, 504], // Request interceptor async onRequest({ options }) { - const authStore = useAuthStore() - options.baseURL = String(useRuntimeConfig().public.apiBaseUrl || '/api') options.headers = { ...options.headers, ...useRequestHeaders(['cookie']) /** need this for calls from SSR: https://auth.sidebase.io/guide/authjs/server-side/session-access#session-access-and-route-protection */, - 'Authorization': `Bearer ${authStore.accessToken}`, 'Csrf-Token': useCsrf().csrf, } }, async onResponseError(error) { - const authStore = useAuthStore() const isRequestFromExternalUrl = !String(error.response.url).startsWith(String(useRuntimeConfig().public.appBaseUrl)) switch (error.response?.status) { case 401: @@ -26,7 +22,7 @@ export const $api = $fetch.create({ return try { - await authStore.signOut() + await navigateTo({ path: '/sign-out' }, { external: true }) } catch {} finally { diff --git a/app/utils/i18n.ts b/app/utils/i18n.ts new file mode 100644 index 00000000..fee08676 --- /dev/null +++ b/app/utils/i18n.ts @@ -0,0 +1,24 @@ +/** + * A safe useI18n that have mocked fallbacks in case the app context is not available. + * + * Do not use this widely in the project, only in some plugins, auto-imports that potentially do not + * have the app context like in notifications, $api, etc. + */ +export function useSafeI18n() { + const nuxtApp = useNuxtApp() + + if (nuxtApp.$i18n) { + return nuxtApp.$i18n + } + else { + // mock useI18n + return { + t: (key: string) => key, + locale: 'en', + availableLocales: ['en'], + setLocale: (locale: string) => { + console.warn(`Setting locale to ${locale} is not supported in this mock implementation.`) + }, + } + } +} diff --git a/docker/.gitkeep b/docker/.gitkeep index e69de29b..0190c2bc 100644 --- a/docker/.gitkeep +++ b/docker/.gitkeep @@ -0,0 +1 @@ +backup.sql diff --git a/modules/sentry/runtime/plugin.ts b/modules/sentry/runtime/plugin.ts index 08dec383..12d05f65 100644 --- a/modules/sentry/runtime/plugin.ts +++ b/modules/sentry/runtime/plugin.ts @@ -3,7 +3,6 @@ import * as Sentry from '@sentry/browser' export default defineNuxtPlugin({ name: 'sentry', parallel: true, - dependsOn: ['auth'], setup(nuxtApp) { const config = useRuntimeConfig() diff --git a/nuxt.config.ts b/nuxt.config.ts index 51773cf4..20d2360d 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -216,13 +216,23 @@ export default defineNuxtConfig({ replace: { 'import-in-the-middle': fileURLToPath(new URL('./node_modules/import-in-the-middle', import.meta.url)), }, + + imports: { + dirs: [ + fileURLToPath(new URL('./server/composables', import.meta.url)), + ], + }, }, routeRules: { - '/': { prerender: true }, - '/api/payments/**/callback': { csurf: false }, - '/api/payments/**/webhook': { csurf: false }, - '/api/payments/**/IPN': { csurf: false }, + '/auth/**': { swr: false, prerender: false }, + '/callback': { cache: false, prerender: false, security: { enabled: false } }, + '/api/logto/webhook': { csurf: false }, + '/api/payments/sepay/webhook': { csurf: false }, + '/api/payments/payos/webhook': { csurf: false }, + '/api/payments/vnpay/callback': { csurf: false }, + '/api/payments/vnpay/IPN': { csurf: false }, + '/_nitro/tasks/**': { csurf: false }, }, pinia: { diff --git a/package.json b/package.json index 10ce59a5..13ec83ec 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "db:preview": "drizzle-kit studio --port 3001", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", - "db:seed": "jiti ./server/db/seeds/index.seed.ts", + "db:seed": "jiti ./server/db/seeds/index.ts", "docker:clear": "rimraf ./docker/postgres ./docker/redis ./docker/mondodb", "docker:start": "docker compose -f docker-compose.service.yml up -d --force-recreate", "docker:stop": "docker-compose -f docker-compose.service.yml down", @@ -107,6 +107,7 @@ "@types/webfontloader": "1.6.38", "@typescript-eslint/eslint-plugin": "7.7.1", "@typescript-eslint/parser": "7.7.1", + "@upstash/redis": "^1.35.0", "@videojs-player/vue": "1.0.0", "@vueuse/core": "10.9.0", "@vueuse/math": "10.9.0", @@ -118,18 +119,21 @@ "date-fns": "^4.1.0", "docx": "^8.5.0", "dotenv": "^16.4.5", - "drizzle-kit": "^0.23.0", - "drizzle-orm": "^0.32.0", - "drizzle-zod": "^0.5.1", + "drizzle-kit": "^0.30.5", + "drizzle-orm": "^0.40.0", + "drizzle-zod": "^0.7.0", "eslint": "8.57.0", "execa": "^9.3.0", - "firebase": "^10.12.4", - "firebase-admin": "^12.2.0", - "firebase-functions": "^5.0.1", + "firebase": "^11.4.0", + "firebase-admin": "^13.2.0", "h3": "^1.13.0", + "ioredis": "^5.6.1", + "jiti": "^2.4.2", "lodash-es": "^4.17.21", "mapbox-gl": "3.2.0", - "nodemailer": "^6.9.15", + "mongodb": "^6.14.2", + "nanoid": "^5.1.5", + "nodemailer": "^6.10.0", "nuxt": "^3.13.2", "nuxt-gtag": "^3.0.2", "nuxt-nodemailer": "^1.1.2", @@ -160,6 +164,7 @@ "ufo": "1.5.3", "unbuild": "^2.0.0", "unplugin-vue-define-options": "1.4.3", + "unstorage": "^1.16.0", "video.js": "8.6.0", "vite": "5.2.10", "vite-plugin-vuetify": "2.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d054960d..d81cf3f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,7 +86,7 @@ importers: version: 0.5.7(eslint@8.57.0)(magicast@0.3.5)(rollup@3.29.5)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) '@nuxt/fonts': specifier: ^0.9.2 - version: 0.9.2(encoding@0.1.13)(ioredis@5.4.1)(magicast@0.3.5)(rollup@3.29.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) + version: 0.9.2(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(encoding@0.1.13)(ioredis@5.6.1)(magicast@0.3.5)(rollup@3.29.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) '@nuxt/kit': specifier: ^3.13.2 version: 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) @@ -107,7 +107,7 @@ importers: version: 0.5.1(magicast@0.3.5)(rollup@3.29.5)(typescript@5.4.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) '@sentry/nuxt': specifier: ^8.36.0 - version: 8.37.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)(encoding@0.1.13)(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3))(pinia@2.1.7(typescript@5.4.5)(vue@3.5.8(typescript@5.4.5)))(rollup@3.29.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) + version: 8.37.0(bd6072b168615c8ea944b69150988573) '@sindresorhus/is': specifier: 6.3.0 version: 6.3.0 @@ -180,6 +180,9 @@ importers: '@typescript-eslint/parser': specifier: 7.7.1 version: 7.7.1(eslint@8.57.0)(typescript@5.4.5) + '@upstash/redis': + specifier: ^1.35.0 + version: 1.35.0 '@videojs-player/vue': specifier: 1.0.0 version: 1.0.0(@types/video.js@7.3.58)(video.js@8.6.0)(vue@3.5.8(typescript@5.4.5)) @@ -191,7 +194,7 @@ importers: version: 10.9.0(vue@3.5.8(typescript@5.4.5)) '@vueuse/nuxt': specifier: ^10.11.0 - version: 10.11.0(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3))(rollup@3.29.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) + version: 10.11.0(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3))(rollup@3.29.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) apexcharts: specifier: 3.49.0 version: 3.49.0 @@ -214,56 +217,65 @@ importers: specifier: ^16.4.5 version: 16.4.5 drizzle-kit: - specifier: ^0.23.0 - version: 0.23.2 + specifier: ^0.30.5 + version: 0.30.6 drizzle-orm: - specifier: ^0.32.0 - version: 0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0) + specifier: ^0.40.0 + version: 0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4) drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(zod@3.23.8) + specifier: ^0.7.0 + version: 0.7.1(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8) eslint: specifier: 8.57.0 version: 8.57.0 execa: specifier: ^9.3.0 - version: 9.3.0 + version: 9.6.0 firebase: - specifier: ^10.12.4 - version: 10.12.4 + specifier: ^11.4.0 + version: 11.9.0 firebase-admin: - specifier: ^12.2.0 - version: 12.2.0(encoding@0.1.13) - firebase-functions: - specifier: ^5.0.1 - version: 5.0.1(firebase-admin@12.2.0(encoding@0.1.13)) + specifier: ^13.2.0 + version: 13.4.0(encoding@0.1.13) h3: specifier: ^1.13.0 version: 1.13.0 + ioredis: + specifier: ^5.6.1 + version: 5.6.1 + jiti: + specifier: ^2.4.2 + version: 2.4.2 lodash-es: specifier: ^4.17.21 version: 4.17.21 mapbox-gl: specifier: 3.2.0 version: 3.2.0 + mongodb: + specifier: ^6.14.2 + version: 6.17.0 + nanoid: + specifier: ^5.1.5 + version: 5.1.5 nodemailer: - specifier: ^6.9.15 - version: 6.9.15 + specifier: ^6.10.0 + version: 6.10.1 nuxt: specifier: ^3.13.2 - version: 3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) + version: 3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) nuxt-gtag: specifier: ^3.0.2 version: 3.0.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) nuxt-nodemailer: specifier: ^1.1.2 - version: 1.1.2(magicast@0.3.5)(nodemailer@6.9.15)(rollup@3.29.5)(webpack-sources@3.2.3) + version: 1.1.2(magicast@0.3.5)(nodemailer@6.10.1)(rollup@3.29.5)(webpack-sources@3.2.3) nuxt-security: specifier: ^2.1.4 version: 2.1.4(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) nuxt-vuefire: specifier: ^1.0.3 - version: 1.0.3(@firebase/app-types@0.9.2)(firebase-admin@12.2.0(encoding@0.1.13))(firebase-functions@5.0.1(firebase-admin@12.2.0(encoding@0.1.13)))(firebase@10.12.4)(magicast@0.3.5)(rollup@3.29.5)(vuefire@3.1.24(consola@3.4.0)(firebase@10.12.4)(vue@3.5.8(typescript@5.4.5)))(webpack-sources@3.2.3) + version: 1.0.3(@firebase/app-types@0.9.2)(firebase-admin@13.4.0(encoding@0.1.13))(firebase-functions@5.0.1(firebase-admin@13.4.0(encoding@0.1.13)))(firebase@11.9.0)(magicast@0.3.5)(rollup@3.29.5)(vuefire@3.1.24(consola@3.4.0)(firebase@11.9.0)(vue@3.5.8(typescript@5.4.5)))(webpack-sources@3.2.3) ofetch: specifier: 1.3.4 version: 1.3.4 @@ -339,6 +351,9 @@ importers: unplugin-vue-define-options: specifier: 1.4.3 version: 1.4.3(rollup@3.29.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) + unstorage: + specifier: ^1.16.0 + version: 1.16.0(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(ioredis@5.6.1) video.js: specifier: 8.6.0 version: 8.6.0 @@ -386,7 +401,7 @@ importers: version: 2.0.0(vue@3.5.8(typescript@5.4.5)) vuefire: specifier: ^3.1.24 - version: 3.1.24(consola@3.4.0)(firebase@10.12.4)(vue@3.5.8(typescript@5.4.5)) + version: 3.1.24(consola@3.4.0)(firebase@11.9.0)(vue@3.5.8(typescript@5.4.5)) vuetify: specifier: 3.5.15 version: 3.5.15(typescript@5.4.5)(vite-plugin-vuetify@2.0.3)(vue-i18n@9.13.1(vue@3.5.8(typescript@5.4.5)))(vue@3.5.8(typescript@5.4.5)) @@ -407,7 +422,7 @@ importers: dependencies: '@antfu/eslint-config': specifier: ^2.22.0 - version: 2.22.0(@vue/compiler-sfc@3.5.8)(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4)) + version: 2.22.0(@vue/compiler-sfc@3.5.8)(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4)) '@antfu/eslint-config-vue': specifier: 0.43.1 version: 0.43.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) @@ -424,17 +439,20 @@ packages: '@antfu/eslint-config-basic@0.43.1': resolution: {integrity: sha512-SW6hmGmqI985fsCJ+oivo4MbiMmRMgCJ0Ne8j/hwCB6O6Mc0m5bDqYeKn5HqFhvZhG84GEg5jPDKNiHrBYnQjw==} + deprecated: Deprecated, please migrate to @antfu/eslint-config with the flat config peerDependencies: eslint: '>=7.4.0' '@antfu/eslint-config-ts@0.43.1': resolution: {integrity: sha512-s3zItBSopYbM/3eii/JKas1PmWR+wCPRNS89qUi4zxPvpuIgN5mahkBvbsCiWacrNFtLxe1zGgo5qijBhVfuvA==} + deprecated: Deprecated, please migrate to @antfu/eslint-config with the flat config peerDependencies: eslint: '>=7.4.0' typescript: '>=3.9' '@antfu/eslint-config-vue@0.43.1': resolution: {integrity: sha512-HxOfe8Vl+DPrzssbs5LHRDCnBtCy1LSA1DIeV71IC+iTpzoASFahSsVX5qckYu1InFgUm93XOhHCWm34LzPsvg==} + deprecated: Deprecated, please migrate to @antfu/eslint-config with the flat config peerDependencies: eslint: '>=7.4.0' @@ -971,8 +989,8 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@drizzle-team/brocli@0.8.2': - resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} '@es-joy/jsdoccomment@0.41.0': resolution: {integrity: sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==} @@ -1880,60 +1898,79 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@firebase/analytics-compat@0.2.12': - resolution: {integrity: sha512-rXWnOAdEHbvBPLNjFLu3U0yDZVIAi+C0DL+RkUEOirfSqAeQaKzBCATeBw6+K7FVpEnknhm4tZrvVUVtJjShMw==} + '@fastify/busboy@3.1.1': + resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + + '@firebase/ai@1.4.0': + resolution: {integrity: sha512-wvF33gtU6TXb6Co8TEC1pcl4dnVstYmRE/vs9XjUGE7he7Sgf5TqSu+EoXk/fuzhw5tKr1LC5eG9KdYFM+eosw==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-types': 0.x + + '@firebase/analytics-compat@0.2.22': + resolution: {integrity: sha512-VogWHgwkdYhjWKh8O1XU04uPrRaiDihkWvE/EMMmtWtaUtVALnpLnUurc3QtSKdPnvTz5uaIGKlW84DGtSPFbw==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/analytics-types@0.8.2': - resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} + '@firebase/analytics-types@0.8.3': + resolution: {integrity: sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==} - '@firebase/analytics@0.10.6': - resolution: {integrity: sha512-sB59EwcAvLt0fINGfMWmcRKcdUiYhE4AJNdDXSCSDo4D/ZXFRmb6qwX9YesKHXFB59XTLT03mAjqQcDrdym9qA==} + '@firebase/analytics@0.10.16': + resolution: {integrity: sha512-cMtp19He7Fd6uaj/nDEul+8JwvJsN8aRSJyuA1QN3QrKvfDDp+efjVurJO61sJpkVftw9O9nNMdhFbRcTmTfRQ==} peerDependencies: '@firebase/app': 0.x - '@firebase/app-check-compat@0.3.13': - resolution: {integrity: sha512-1sbS5Apq7dLys1KYdNQsmZLFIjJoFP9Mv4bzIcdXuTkWQjr3X2qAvwiTslC6prVAUMiTV0eM9eicdQIXVsiSRw==} + '@firebase/app-check-compat@0.3.25': + resolution: {integrity: sha512-3zrsPZWAKfV7DVC20T2dgfjzjtQnSJS65OfMOiddMUtJL1S5i0nAZKsdX0bOEvvrd0SBIL8jYnfpfDeQRnhV3w==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/app-check-interop-types@0.3.2': - resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} + '@firebase/app-check-interop-types@0.3.3': + resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==} - '@firebase/app-check-types@0.5.2': - resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} + '@firebase/app-check-types@0.5.3': + resolution: {integrity: sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==} - '@firebase/app-check@0.8.6': - resolution: {integrity: sha512-uSzl0/SDw54hwuORWHDtldb9kK/QEVZOcoPn2mlIjMrJOLDug/6kcqnIN3IHzwmPyf23Epg0AGBktvG2FugW4w==} + '@firebase/app-check@0.10.0': + resolution: {integrity: sha512-AZlRlVWKcu8BH4Yf8B5EI8sOi2UNGTS8oMuthV45tbt6OVUTSQwFPIEboZzhNJNKY+fPsg7hH8vixUWFZ3lrhw==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/app-compat@0.2.37': - resolution: {integrity: sha512-yiQLYT9LYQHuJGu/msuBLFtdWWTJ3Pz04E9gSeWykSB+8s0XXJJqfqQlghH7CcQ3KnJZR+Wuc3zSMcY3a+dn6Q==} + '@firebase/app-compat@0.4.1': + resolution: {integrity: sha512-9VGjnY23Gc1XryoF/ABWtZVJYnaPOnjHM7dsqq9YALgKRtxI1FryvELUVkDaEIUf4In2bfkb9ZENF1S9M273Dw==} + engines: {node: '>=18.0.0'} '@firebase/app-types@0.9.2': resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} - '@firebase/app@0.10.7': - resolution: {integrity: sha512-7OCd53B+wnk/onbMLn/vM10pDjw97zzWUD8m3swtLYKJIrL+gDZ7HZ4xcbBLw7OB8ikzu8k1ORNjRe2itgAy4g==} + '@firebase/app-types@0.9.3': + resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} - '@firebase/auth-compat@0.5.10': - resolution: {integrity: sha512-epDhgNIXmhl9DPuTW9Ec5NDJJKMFIdXBXiQI9O0xNHveow/ETtBCY86srzF7iCacqsd30CcpLwwXlhk8Y19Olg==} + '@firebase/app@0.13.1': + resolution: {integrity: sha512-0O33PKrXLoIWkoOO5ByFaLjZehBctSYWnb+xJkIdx2SKP/K9l1UPFXPwASyrOIqyY3ws+7orF/1j7wI5EKzPYQ==} + engines: {node: '>=18.0.0'} + + '@firebase/auth-compat@0.5.26': + resolution: {integrity: sha512-4baB7tR0KukyGzrlD25aeO4t0ChLifwvDQXTBiVJE9WWwJEOjkZpHmoU9Iww0+Vdalsq4sZ3abp6YTNjHyB1dA==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/auth-interop-types@0.2.3': - resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} + '@firebase/auth-interop-types@0.2.4': + resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==} - '@firebase/auth-types@0.12.2': - resolution: {integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==} + '@firebase/auth-types@0.13.0': + resolution: {integrity: sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/auth@1.7.5': - resolution: {integrity: sha512-DMFR1OA/f1/voeuFbSORg9AP36pMgOoSb/DRgiDalLmIJsDTlQNMCu+givjMP4s/XL85+tBk2MerYnK/AscJjw==} + '@firebase/auth@1.10.6': + resolution: {integrity: sha512-cFbo2FymQltog4atI9cKTO6CxKxS0dOMXslTQrlNZRH7qhDG44/d7QeI6GXLweFZtrnlecf52ESnNz1DU6ek8w==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x '@react-native-async-storage/async-storage': ^1.18.1 @@ -1941,133 +1978,141 @@ packages: '@react-native-async-storage/async-storage': optional: true - '@firebase/component@0.6.8': - resolution: {integrity: sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==} + '@firebase/component@0.6.17': + resolution: {integrity: sha512-M6DOg7OySrKEFS8kxA3MU5/xc37fiOpKPMz6cTsMUcsuKB6CiZxxNAvgFta8HGRgEpZbi8WjGIj6Uf+TpOhyzg==} + engines: {node: '>=18.0.0'} - '@firebase/database-compat@1.0.6': - resolution: {integrity: sha512-1OGA0sLY47mkXjhICCrUTXEYFnSSXoiXWm1SHsN62b+Lzs5aKA3aWTjTUmYIoK93kDAMPkYpulSv8jcbH4Hwew==} + '@firebase/data-connect@0.3.9': + resolution: {integrity: sha512-B5tGEh5uQrQeH0i7RvlU8kbZrKOJUmoyxVIX4zLA8qQJIN6A7D+kfBlGXtSwbPdrvyaejcRPcbOtqsDQ9HPJKw==} + peerDependencies: + '@firebase/app': 0.x - '@firebase/database-types@1.0.4': - resolution: {integrity: sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==} + '@firebase/database-compat@2.0.10': + resolution: {integrity: sha512-3sjl6oGaDDYJw/Ny0E5bO6v+KM3KoD4Qo/sAfHGdRFmcJ4QnfxOX9RbG9+ce/evI3m64mkPr24LlmTDduqMpog==} + engines: {node: '>=18.0.0'} - '@firebase/database@1.0.6': - resolution: {integrity: sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==} + '@firebase/database-types@1.0.14': + resolution: {integrity: sha512-8a0Q1GrxM0akgF0RiQHliinhmZd+UQPrxEmUv7MnQBYfVFiLtKOgs3g6ghRt/WEGJHyQNslZ+0PocIwNfoDwKw==} - '@firebase/firestore-compat@0.3.33': - resolution: {integrity: sha512-i42a2l31N95CwYEB7zmfK0FS1mrO6pwOLwxavCrwu1BCFrVVVQhUheTPIda/iGguK/2Nog0RaIR1bo7QkZEz3g==} + '@firebase/database@1.0.19': + resolution: {integrity: sha512-khE+MIYK+XlIndVn/7mAQ9F1fwG5JHrGKaG72hblCC6JAlUBDd3SirICH6SMCf2PQ0iYkruTECth+cRhauacyQ==} + engines: {node: '>=18.0.0'} + + '@firebase/firestore-compat@0.3.52': + resolution: {integrity: sha512-nzt3Sag+EBdm1Jkw/FnnKBPk0LpUUxOlMHMADPBXYhhXrLszxn1+vb64nJsbgRIHfsCn+rg8gyGrb+8frzXrjg==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/firestore-types@3.0.2': - resolution: {integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==} + '@firebase/firestore-types@3.0.3': + resolution: {integrity: sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/firestore@4.6.4': - resolution: {integrity: sha512-vk2MoH5HxYEhiNg1l+yBXq1Fkhue/11bFg4HdlTv6BJHcTnnAj2a+/afPpatcW4MOdYA3Tv+d5nGzWbbOC1SHw==} - engines: {node: '>=10.10.0'} + '@firebase/firestore@4.7.17': + resolution: {integrity: sha512-YhXWA7HlSnekExhZ5u4i0e+kpPxsh/qMrzeNDgsAva71JXK8OOuOx+yLyYBFhmu3Hr5JJDO2fsZA/wrWoQYHDg==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/functions-compat@0.3.12': - resolution: {integrity: sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==} + '@firebase/functions-compat@0.3.25': + resolution: {integrity: sha512-V0JKUw5W/7aznXf9BQ8LIYHCX6zVCM8Hdw7XUQ/LU1Y9TVP8WKRCnPB/qdPJ0xGjWWn7fhtwIYbgEw/syH4yTQ==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/functions-types@0.6.2': - resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} + '@firebase/functions-types@0.6.3': + resolution: {integrity: sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==} - '@firebase/functions@0.11.6': - resolution: {integrity: sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==} + '@firebase/functions@0.12.8': + resolution: {integrity: sha512-p+ft6dQW0CJ3BLLxeDb5Hwk9ARw01kHTZjLqiUdPRzycR6w7Z75ThkegNmL6gCss3S0JEpldgvehgZ3kHybVhA==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/installations-compat@0.2.8': - resolution: {integrity: sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==} + '@firebase/installations-compat@0.2.17': + resolution: {integrity: sha512-J7afeCXB7yq25FrrJAgbx8mn1nG1lZEubOLvYgG7ZHvyoOCK00sis5rj7TgDrLYJgdj/SJiGaO1BD3BAp55TeA==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/installations-types@0.5.2': - resolution: {integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==} + '@firebase/installations-types@0.5.3': + resolution: {integrity: sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==} peerDependencies: '@firebase/app-types': 0.x - '@firebase/installations@0.6.8': - resolution: {integrity: sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==} + '@firebase/installations@0.6.17': + resolution: {integrity: sha512-zfhqCNJZRe12KyADtRrtOj+SeSbD1H/K8J24oQAJVv/u02eQajEGlhZtcx9Qk7vhGWF5z9dvIygVDYqLL4o1XQ==} peerDependencies: '@firebase/app': 0.x - '@firebase/logger@0.4.2': - resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} + '@firebase/logger@0.4.4': + resolution: {integrity: sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==} + engines: {node: '>=18.0.0'} - '@firebase/messaging-compat@0.2.10': - resolution: {integrity: sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==} + '@firebase/messaging-compat@0.2.21': + resolution: {integrity: sha512-1yMne+4BGLbHbtyu/VyXWcLiefUE1+K3ZGfVTyKM4BH4ZwDFRGoWUGhhx+tKRX4Tu9z7+8JN67SjnwacyNWK5g==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/messaging-interop-types@0.2.2': - resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} + '@firebase/messaging-interop-types@0.2.3': + resolution: {integrity: sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==} - '@firebase/messaging@0.12.10': - resolution: {integrity: sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==} + '@firebase/messaging@0.12.21': + resolution: {integrity: sha512-bYJ2Evj167Z+lJ1ach6UglXz5dUKY1zrJZd15GagBUJSR7d9KfiM1W8dsyL0lDxcmhmA/sLaBYAAhF1uilwN0g==} peerDependencies: '@firebase/app': 0.x - '@firebase/performance-compat@0.2.8': - resolution: {integrity: sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==} + '@firebase/performance-compat@0.2.19': + resolution: {integrity: sha512-4cU0T0BJ+LZK/E/UwFcvpBCVdkStgBMQwBztM9fJPT6udrEUk3ugF5/HT+E2Z22FCXtIaXDukJbYkE/c3c6IHw==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/performance-types@0.2.2': - resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} + '@firebase/performance-types@0.2.3': + resolution: {integrity: sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==} - '@firebase/performance@0.6.8': - resolution: {integrity: sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==} + '@firebase/performance@0.7.6': + resolution: {integrity: sha512-AsOz74dSTlyQGlnnbLWXiHFAsrxhpssPOsFFi4HgOJ5DjzkK7ZdZ/E9uMPrwFoXJyMVoybGRuqsL/wkIbFITsA==} peerDependencies: '@firebase/app': 0.x - '@firebase/remote-config-compat@0.2.8': - resolution: {integrity: sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==} + '@firebase/remote-config-compat@0.2.17': + resolution: {integrity: sha512-KelsBD0sXSC0u3esr/r6sJYGRN6pzn3bYuI/6pTvvmZbjBlxQkRabHAVH6d+YhLcjUXKIAYIjZszczd1QJtOyA==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/remote-config-types@0.3.2': - resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} + '@firebase/remote-config-types@0.4.0': + resolution: {integrity: sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==} - '@firebase/remote-config@0.4.8': - resolution: {integrity: sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==} + '@firebase/remote-config@0.6.4': + resolution: {integrity: sha512-ZyLJRT46wtycyz2+opEkGaoFUOqRQjt/0NX1WfUISOMCI/PuVoyDjqGpq24uK+e8D5NknyTpiXCVq5dowhScmg==} peerDependencies: '@firebase/app': 0.x - '@firebase/storage-compat@0.3.9': - resolution: {integrity: sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==} + '@firebase/storage-compat@0.3.22': + resolution: {integrity: sha512-29j6JgXTjQ76sOIkxmTNHQfYA/hDTeV9qGbn0jolynPXSg/AmzCB0CpCoCYrS0ja0Flgmy1hkA3XYDZ/eiV1Cg==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/storage-types@0.8.2': - resolution: {integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==} + '@firebase/storage-types@0.8.3': + resolution: {integrity: sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/storage@0.12.6': - resolution: {integrity: sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==} + '@firebase/storage@0.13.12': + resolution: {integrity: sha512-5JmoFS01MYjW1XMQa5F5rD/kvMwBN10QF03bmcuJWq4lg+BJ3nRgL3sscWnyJPhwM/ZCyv2eRwcfzESVmsYkdQ==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/util@1.9.7': - resolution: {integrity: sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==} - - '@firebase/vertexai-preview@0.0.3': - resolution: {integrity: sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==} + '@firebase/util@1.12.0': + resolution: {integrity: sha512-Z4rK23xBCwgKDqmzGVMef+Vb4xso2j5Q8OG0vVL4m4fA5ZjPMYQazu8OJJC3vtQRC3SQ/Pgx/6TPNVsCd70QRw==} engines: {node: '>=18.0.0'} - peerDependencies: - '@firebase/app': 0.x - '@firebase/app-types': 0.x - '@firebase/webchannel-wrapper@1.0.1': - resolution: {integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==} + '@firebase/webchannel-wrapper@1.0.3': + resolution: {integrity: sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==} '@floating-ui/core@1.6.0': resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} @@ -2122,8 +2167,8 @@ packages: '@fullcalendar/core': ~6.1.11 vue: ^3.0.11 - '@google-cloud/firestore@7.9.0': - resolution: {integrity: sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==} + '@google-cloud/firestore@7.11.1': + resolution: {integrity: sha512-ZxOdH8Wr01hBDvKCQfMWqwUcfNcN3JY19k1LtS1fTFhEyorYPLsbWN+VxIRL46pOYGHTPkU3Or5HbT/SLQM5nA==} engines: {node: '>=14.0.0'} '@google-cloud/paginator@5.0.2': @@ -2138,8 +2183,8 @@ packages: resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} engines: {node: '>=14'} - '@google-cloud/storage@7.12.0': - resolution: {integrity: sha512-122Ui67bhnf8MkRnxQAC5lf7wPGkPP5hL3+J5s9HHDw2J9RpaMmnV8iahn+RUn9BH70W6uRe6nMZLXiRaJM/3g==} + '@google-cloud/storage@7.16.0': + resolution: {integrity: sha512-7/5LRgykyOfQENcm6hDKP8SX/u9XxE5YOiWOkgkwcoO+cG8xT/cyOvp9wwN3IxfdYgpHs8CE7Nq2PKX2lNaEXw==} engines: {node: '>=14'} '@grpc/grpc-js@1.11.1': @@ -2349,6 +2394,9 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + '@mongodb-js/saslprep@1.2.2': + resolution: {integrity: sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==} + '@netlify/functions@2.8.1': resolution: {integrity: sha512-+6wtYdoz0yE06dSa9XkP47tw5zm6g13QMeCwM3MmHx1vn8hzwFa51JtmfraprdkL7amvb7gaNM+OOhQU1h6T8A==} engines: {node: '>=14.0.0'} @@ -2763,6 +2811,9 @@ packages: '@payos/node@1.0.10': resolution: {integrity: sha512-dY+WHd6pLa558a1G8yv6oKfVe5QLTNyYnQBaSQtwvMAm/p0faKAnfXt04LNIwO9/4buas4ES+sDxc1bfX/mVbQ==} + '@petamoriken/float16@3.9.2': + resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + '@pinia/nuxt@0.5.1': resolution: {integrity: sha512-6wT6TqY81n+7/x3Yhf0yfaJVKkZU42AGqOR0T3+UvChcaOJhSma7OWPN64v+ptYlznat+fS1VTwNAcbi2lzHnw==} @@ -3622,6 +3673,9 @@ packages: '@types/node@20.12.7': resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/node@22.15.30': + resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} + '@types/nodemailer@6.4.16': resolution: {integrity: sha512-uz6hN6Pp0upXMcilM61CoKyjT7sskBoOWpptkjjJp8jIMlTdc3xG01U7proKkXzruMS4hS0zqtHNkNPFB20rKQ==} @@ -3691,6 +3745,12 @@ packages: '@types/webfontloader@1.6.38': resolution: {integrity: sha512-kUaF72Fv202suFx6yBrwXqeVRMx7hGtJTesyESZgn9sEPCUeDXm2p0SiyS1MTqW74nQP4p7JyrOCwZ7pNFns4w==} + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -3983,6 +4043,9 @@ packages: peerDependencies: vue: '>=2.7 || >=3' + '@upstash/redis@1.35.0': + resolution: {integrity: sha512-WUm0Jz1xN4DBDGeJIi2Y0kVsolWRB2tsVds4SExaiLg4wBdHFMB+8IfZtBWr+BP0FvhuBr5G1/VLrJ9xzIWHsg==} + '@vercel/nft@0.26.5': resolution: {integrity: sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==} engines: {node: '>=16'} @@ -4415,6 +4478,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -4555,6 +4622,10 @@ packages: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -4766,6 +4837,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crossws@0.2.4: resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} peerDependencies: @@ -4948,6 +5023,9 @@ packages: destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -5015,18 +5093,19 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - drizzle-kit@0.23.2: - resolution: {integrity: sha512-NWkQ7GD2OTbQ7HzcjsaCOf3n0tlFPSEAF38fvDpwDj8jRbGWGFtN2cD8I8wp4lU+5Os/oyP2xycTKGLHdPipUw==} + drizzle-kit@0.30.6: + resolution: {integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==} hasBin: true - drizzle-orm@0.32.2: - resolution: {integrity: sha512-3fXKzPzrgZIcnWCSLiERKN5Opf9Iagrag75snfFlKeKSYB1nlgPBshzW3Zn6dQymkyiib+xc4nIz0t8U+Xdpuw==} + drizzle-orm@0.40.1: + resolution: {integrity: sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=3' - '@electric-sql/pglite': '>=0.1.1' - '@libsql/client': '*' - '@neondatabase/serverless': '>=0.1' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' '@op-engineering/op-sqlite': '>=2' '@opentelemetry/api': ^1.4.1 '@planetscale/database': '>=1' @@ -5034,20 +5113,19 @@ packages: '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' '@types/pg': '*' - '@types/react': '>=18' '@types/sql.js': '*' '@vercel/postgres': '>=0.8.0' '@xata.io/client': '*' better-sqlite3: '>=7' bun-types: '*' - expo-sqlite: '>=13.2.0' + expo-sqlite: '>=14.0.0' + gel: '>=2' knex: '*' kysely: '*' mysql2: '>=2' pg: '>=8' postgres: '>=3' prisma: '*' - react: '>=18' sql.js: '>=1' sqlite3: '>=5' peerDependenciesMeta: @@ -5059,6 +5137,8 @@ packages: optional: true '@libsql/client': optional: true + '@libsql/client-wasm': + optional: true '@neondatabase/serverless': optional: true '@op-engineering/op-sqlite': @@ -5075,8 +5155,6 @@ packages: optional: true '@types/pg': optional: true - '@types/react': - optional: true '@types/sql.js': optional: true '@vercel/postgres': @@ -5089,6 +5167,8 @@ packages: optional: true expo-sqlite: optional: true + gel: + optional: true knex: optional: true kysely: @@ -5101,18 +5181,16 @@ packages: optional: true prisma: optional: true - react: - optional: true sql.js: optional: true sqlite3: optional: true - drizzle-zod@0.5.1: - resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} + drizzle-zod@0.7.1: + resolution: {integrity: sha512-nZzALOdz44/AL2U005UlmMqaQ1qe5JfanvLujiTHiiT8+vZJTBFhj3pY4Vk+L6UWyKFfNmLhk602Hn4kCTynKQ==} peerDependencies: - drizzle-orm: '>=0.23.13' - zod: '*' + drizzle-orm: '>=0.36.0' + zod: '>=3.0.0' duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -5169,6 +5247,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -5617,8 +5699,8 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.3.0: - resolution: {integrity: sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==} + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} engines: {node: ^18.19.0 || >=20.5.0} express@4.19.2: @@ -5749,9 +5831,9 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} - firebase-admin@12.2.0: - resolution: {integrity: sha512-R9xxENvPA/19XJ3mv0Kxfbz9kPXd9/HrM4083LZWOO0qAQGheRzcCQamYRe+JSrV2cdKXP3ZsfFGTYMrFM0pJg==} - engines: {node: '>=14'} + firebase-admin@13.4.0: + resolution: {integrity: sha512-Y8DcyKK+4pl4B93ooiy1G8qvdyRMkcNFfBSh+8rbVcw4cW8dgG0VXCCTp5NUwub8sn9vSPsOwpb9tE2OuFmcfQ==} + engines: {node: '>=18'} firebase-functions@5.0.1: resolution: {integrity: sha512-1m+crtgAR8Tl36gjpM02KCY5zduAejFmDSXvih/DB93apg39f0U/WwRgT7sitGIRqyCcIpktNUbXJv7Y9JOF4A==} @@ -5760,8 +5842,8 @@ packages: peerDependencies: firebase-admin: ^11.10.0 || ^12.0.0 - firebase@10.12.4: - resolution: {integrity: sha512-SQz49NMpwG4MLTPZ9C8jBp7IyS2haTvsIvjclgu+v/jvzNtjZoxIcoF6A13EIfBHmJ5eiuVlvttxElOf7LnJew==} + firebase@11.9.0: + resolution: {integrity: sha512-7uIGhxKtTNfDcoMKWn0G8G0Z1Zj5VeW8uzImAcUmI31PaYQdVWi2rVVig7thWB3vPianESPrLEKim2Fw7U8fiA==} flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} @@ -5856,6 +5938,11 @@ packages: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} + gel@2.1.0: + resolution: {integrity: sha512-HCeRqInCt6BjbMmeghJ6BKeYwOj7WJT5Db6IWWAA3IMUUa7or7zJfTUEkUWCxiOtoXnwnm96sFK9Fr47Yh2hOA==} + engines: {node: '>= 18.0.0'} + hasBin: true + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -5990,8 +6077,8 @@ packages: globjoin@0.1.4: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - google-auth-library@9.11.0: - resolution: {integrity: sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==} + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} engines: {node: '>=14'} google-gax@4.3.8: @@ -6108,8 +6195,8 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - human-signals@7.0.0: - resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} iconv-lite@0.4.24: @@ -6185,8 +6272,8 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ioredis@5.4.1: - resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + ioredis@5.6.1: + resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} engines: {node: '>=12.22.0'} ipaddr.js@1.9.1: @@ -6345,6 +6432,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -6361,10 +6452,6 @@ packages: resolution: {integrity: sha512-pmfRbVRs/7khFrSAYnSiJ8C0D5GvzkE4Ey2pAvUcJsw1ly/p+7ut27jbJrjY79BpAJQJ4gXYFtK6d1Aub+9baQ==} hasBin: true - jiti@2.4.0: - resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==} - hasBin: true - jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -6632,10 +6719,6 @@ packages: long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -6729,6 +6812,9 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} @@ -6879,6 +6965,36 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} + + mongodb@6.17.0: + resolution: {integrity: sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + mpd-parser@1.3.0: resolution: {integrity: sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==} hasBin: true @@ -6918,8 +7034,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.7: - resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} engines: {node: ^18 || >=20} hasBin: true @@ -6956,6 +7072,9 @@ packages: node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -6976,8 +7095,8 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - nodemailer@6.9.15: - resolution: {integrity: sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==} + nodemailer@6.10.1: + resolution: {integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==} engines: {node: '>=6.0.0'} nopt@5.0.0: @@ -7004,6 +7123,10 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. @@ -7090,6 +7213,9 @@ packages: ofetch@1.3.4: resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + ohash@1.1.4: resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} @@ -7645,8 +7771,8 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} - pretty-ms@9.1.0: - resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} prismjs@1.29.0: @@ -7795,10 +7921,6 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -7980,9 +8102,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - safevalues@0.6.0: - resolution: {integrity: sha512-MZ7DcTOcIoPXN36/UONVE9BT0pmwlCr9WcS7Pj/q4FxOwr33FkWC0CUWj/THQXYWxf/F7urbhaHaOeFPSqGqHA==} - sass@1.75.0: resolution: {integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==} engines: {node: '>=14.0.0'} @@ -8131,6 +8250,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -8513,6 +8635,10 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} @@ -8607,6 +8733,9 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} @@ -8637,6 +8766,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -8657,6 +8789,10 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unimport@3.12.0: resolution: {integrity: sha512-5y8dSvNvyevsnw4TBQkIQR1Rjdbb+XjVSwQwxltpnVZrStBvvPkMPcZrh1kg5kY77kpx6+D4Ztd3W6FOBH/y2Q==} @@ -8717,22 +8853,27 @@ packages: resolution: {integrity: sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==} engines: {node: '>=18.12.0'} - unstorage@1.12.0: - resolution: {integrity: sha512-ARZYTXiC+e8z3lRM7/qY9oyaOkaozCeNd2xoz7sYK9fv7OLGhVsf+BZbmASqiK/HTZ7T6eAlnVq9JynZppyk3w==} - peerDependencies: - '@azure/app-configuration': ^1.7.0 - '@azure/cosmos': ^4.1.1 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.4.1 - '@azure/keyvault-secrets': ^4.8.0 - '@azure/storage-blob': ^12.24.0 - '@capacitor/preferences': ^6.0.2 - '@netlify/blobs': ^6.5.0 || ^7.0.0 + unstorage@1.16.0: + resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.34.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' idb-keyval: ^6.2.1 - ioredis: ^5.4.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -8748,18 +8889,28 @@ packages: optional: true '@capacitor/preferences': optional: true + '@deno/kv': + optional: true '@netlify/blobs': optional: true '@planetscale/database': optional: true '@upstash/redis': optional: true + '@vercel/blob': + optional: true '@vercel/kv': optional: true + aws4fetch: + optional: true + db0: + optional: true idb-keyval: optional: true ioredis: optional: true + uploadthing: + optional: true untun@0.1.3: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} @@ -8819,6 +8970,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -9182,9 +9337,16 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + web-vitals@4.2.4: + resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -9203,6 +9365,10 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -9220,6 +9386,11 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -9411,7 +9582,7 @@ snapshots: - supports-color - typescript - '@antfu/eslint-config@2.22.0(@vue/compiler-sfc@3.5.8)(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))': + '@antfu/eslint-config@2.22.0(@vue/compiler-sfc@3.5.8)(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4))': dependencies: '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 @@ -9436,7 +9607,7 @@ snapshots: eslint-plugin-toml: 0.11.1(eslint@8.57.0) eslint-plugin-unicorn: 54.0.0(eslint@8.57.0) eslint-plugin-unused-imports: 4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4)) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4)) eslint-plugin-vue: 9.28.0(eslint@8.57.0) eslint-plugin-yml: 1.14.0(eslint@8.57.0) eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.8)(eslint@8.57.0) @@ -10382,7 +10553,7 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@drizzle-team/brocli@0.8.2': {} + '@drizzle-team/brocli@0.10.2': {} '@es-joy/jsdoccomment@0.41.0': dependencies: @@ -10916,320 +11087,327 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@firebase/analytics-compat@0.2.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7)': + '@fastify/busboy@3.1.1': {} + + '@firebase/ai@1.4.0(@firebase/app-types@0.9.3)(@firebase/app@0.13.1)': + dependencies: + '@firebase/app': 0.13.1 + '@firebase/app-check-interop-types': 0.3.3 + '@firebase/app-types': 0.9.3 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 + tslib: 2.7.0 + + '@firebase/analytics-compat@0.2.22(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1)': dependencies: - '@firebase/analytics': 0.10.6(@firebase/app@0.10.7) - '@firebase/analytics-types': 0.8.2 - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/util': 1.9.7 + '@firebase/analytics': 0.10.16(@firebase/app@0.13.1) + '@firebase/analytics-types': 0.8.3 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/analytics-types@0.8.2': {} + '@firebase/analytics-types@0.8.3': {} - '@firebase/analytics@0.10.6(@firebase/app@0.10.7)': + '@firebase/analytics@0.10.16(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 - safevalues: 0.6.0 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/installations': 0.6.17(@firebase/app@0.13.1) + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 - '@firebase/app-check-compat@0.3.13(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7)': + '@firebase/app-check-compat@0.3.25(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-check': 0.8.6(@firebase/app@0.10.7) - '@firebase/app-check-types': 0.5.2 - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/app-check': 0.10.0(@firebase/app@0.13.1) + '@firebase/app-check-types': 0.5.3 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-check-interop-types@0.3.2': {} + '@firebase/app-check-interop-types@0.3.3': {} - '@firebase/app-check-types@0.5.2': {} + '@firebase/app-check-types@0.5.3': {} - '@firebase/app-check@0.8.6(@firebase/app@0.10.7)': + '@firebase/app-check@0.10.0(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 - safevalues: 0.6.0 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 - '@firebase/app-compat@0.2.37': + '@firebase/app-compat@0.4.1': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 '@firebase/app-types@0.9.2': {} - '@firebase/app@0.10.7': + '@firebase/app-types@0.9.3': {} + + '@firebase/app@0.13.1': dependencies: - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 idb: 7.1.1 tslib: 2.7.0 - '@firebase/auth-compat@0.5.10(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7)': + '@firebase/auth-compat@0.5.26(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/auth': 1.7.5(@firebase/app@0.10.7) - '@firebase/auth-types': 0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) - '@firebase/component': 0.6.8 - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/auth': 1.10.6(@firebase/app@0.13.1) + '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.12.0) + '@firebase/component': 0.6.17 + '@firebase/util': 1.12.0 tslib: 2.7.0 - undici: 5.28.4 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@react-native-async-storage/async-storage' - '@firebase/auth-interop-types@0.2.3': {} + '@firebase/auth-interop-types@0.2.4': {} - '@firebase/auth-types@0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)': + '@firebase/auth-types@0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.12.0)': dependencies: - '@firebase/app-types': 0.9.2 - '@firebase/util': 1.9.7 + '@firebase/app-types': 0.9.3 + '@firebase/util': 1.12.0 - '@firebase/auth@1.7.5(@firebase/app@0.10.7)': + '@firebase/auth@1.10.6(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 - undici: 5.28.4 - '@firebase/component@0.6.8': + '@firebase/component@0.6.17': dependencies: - '@firebase/util': 1.9.7 + '@firebase/util': 1.12.0 tslib: 2.7.0 - '@firebase/database-compat@1.0.6': + '@firebase/data-connect@0.3.9(@firebase/app@0.13.1)': dependencies: - '@firebase/component': 0.6.8 - '@firebase/database': 1.0.6 - '@firebase/database-types': 1.0.4 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/auth-interop-types': 0.2.4 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 - '@firebase/database-types@1.0.4': + '@firebase/database-compat@2.0.10': dependencies: - '@firebase/app-types': 0.9.2 - '@firebase/util': 1.9.7 + '@firebase/component': 0.6.17 + '@firebase/database': 1.0.19 + '@firebase/database-types': 1.0.14 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 + tslib: 2.7.0 + + '@firebase/database-types@1.0.14': + dependencies: + '@firebase/app-types': 0.9.3 + '@firebase/util': 1.12.0 - '@firebase/database@1.0.6': + '@firebase/database@1.0.19': dependencies: - '@firebase/app-check-interop-types': 0.3.2 - '@firebase/auth-interop-types': 0.2.3 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/app-check-interop-types': 0.3.3 + '@firebase/auth-interop-types': 0.2.4 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 faye-websocket: 0.11.4 tslib: 2.7.0 - '@firebase/firestore-compat@0.3.33(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7)': + '@firebase/firestore-compat@0.3.52(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/firestore': 4.6.4(@firebase/app@0.10.7) - '@firebase/firestore-types': 3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/firestore': 4.7.17(@firebase/app@0.13.1) + '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.0) + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/firestore-types@3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)': + '@firebase/firestore-types@3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.0)': dependencies: - '@firebase/app-types': 0.9.2 - '@firebase/util': 1.9.7 + '@firebase/app-types': 0.9.3 + '@firebase/util': 1.12.0 - '@firebase/firestore@4.6.4(@firebase/app@0.10.7)': + '@firebase/firestore@4.7.17(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 - '@firebase/webchannel-wrapper': 1.0.1 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 + '@firebase/webchannel-wrapper': 1.0.3 '@grpc/grpc-js': 1.9.15 '@grpc/proto-loader': 0.7.13 tslib: 2.7.0 - undici: 5.28.4 - '@firebase/functions-compat@0.3.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7)': + '@firebase/functions-compat@0.3.25(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/functions': 0.11.6(@firebase/app@0.10.7) - '@firebase/functions-types': 0.6.2 - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/functions': 0.12.8(@firebase/app@0.13.1) + '@firebase/functions-types': 0.6.3 + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/functions-types@0.6.2': {} + '@firebase/functions-types@0.6.3': {} - '@firebase/functions@0.11.6(@firebase/app@0.10.7)': + '@firebase/functions@0.12.8(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/app-check-interop-types': 0.3.2 - '@firebase/auth-interop-types': 0.2.3 - '@firebase/component': 0.6.8 - '@firebase/messaging-interop-types': 0.2.2 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/app-check-interop-types': 0.3.3 + '@firebase/auth-interop-types': 0.2.4 + '@firebase/component': 0.6.17 + '@firebase/messaging-interop-types': 0.2.3 + '@firebase/util': 1.12.0 tslib: 2.7.0 - undici: 5.28.4 - '@firebase/installations-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7)': + '@firebase/installations-compat@0.2.17(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) - '@firebase/installations-types': 0.5.2(@firebase/app-types@0.9.2) - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/installations': 0.6.17(@firebase/app@0.13.1) + '@firebase/installations-types': 0.5.3(@firebase/app-types@0.9.3) + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/installations-types@0.5.2(@firebase/app-types@0.9.2)': + '@firebase/installations-types@0.5.3(@firebase/app-types@0.9.3)': dependencies: - '@firebase/app-types': 0.9.2 + '@firebase/app-types': 0.9.3 - '@firebase/installations@0.6.8(@firebase/app@0.10.7)': + '@firebase/installations@0.6.17(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/util': 1.12.0 idb: 7.1.1 tslib: 2.7.0 - '@firebase/logger@0.4.2': + '@firebase/logger@0.4.4': dependencies: tslib: 2.7.0 - '@firebase/messaging-compat@0.2.10(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7)': + '@firebase/messaging-compat@0.2.21(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/messaging': 0.12.10(@firebase/app@0.10.7) - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/messaging': 0.12.21(@firebase/app@0.13.1) + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/messaging-interop-types@0.2.2': {} + '@firebase/messaging-interop-types@0.2.3': {} - '@firebase/messaging@0.12.10(@firebase/app@0.10.7)': + '@firebase/messaging@0.12.21(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) - '@firebase/messaging-interop-types': 0.2.2 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/installations': 0.6.17(@firebase/app@0.13.1) + '@firebase/messaging-interop-types': 0.2.3 + '@firebase/util': 1.12.0 idb: 7.1.1 tslib: 2.7.0 - '@firebase/performance-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7)': + '@firebase/performance-compat@0.2.19(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/performance': 0.6.8(@firebase/app@0.10.7) - '@firebase/performance-types': 0.2.2 - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/performance': 0.7.6(@firebase/app@0.13.1) + '@firebase/performance-types': 0.2.3 + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/performance-types@0.2.2': {} + '@firebase/performance-types@0.2.3': {} - '@firebase/performance@0.6.8(@firebase/app@0.10.7)': + '@firebase/performance@0.7.6(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/installations': 0.6.17(@firebase/app@0.13.1) + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 + web-vitals: 4.2.4 - '@firebase/remote-config-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7)': + '@firebase/remote-config-compat@0.2.17(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/remote-config': 0.4.8(@firebase/app@0.10.7) - '@firebase/remote-config-types': 0.3.2 - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/logger': 0.4.4 + '@firebase/remote-config': 0.6.4(@firebase/app@0.13.1) + '@firebase/remote-config-types': 0.4.0 + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/remote-config-types@0.3.2': {} + '@firebase/remote-config-types@0.4.0': {} - '@firebase/remote-config@0.4.8(@firebase/app@0.10.7)': + '@firebase/remote-config@0.6.4(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/installations': 0.6.17(@firebase/app@0.13.1) + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.0 tslib: 2.7.0 - '@firebase/storage-compat@0.3.9(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7)': + '@firebase/storage-compat@0.3.22(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1)': dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/component': 0.6.8 - '@firebase/storage': 0.12.6(@firebase/app@0.10.7) - '@firebase/storage-types': 0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) - '@firebase/util': 1.9.7 + '@firebase/app-compat': 0.4.1 + '@firebase/component': 0.6.17 + '@firebase/storage': 0.13.12(@firebase/app@0.13.1) + '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.0) + '@firebase/util': 1.12.0 tslib: 2.7.0 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/storage-types@0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)': + '@firebase/storage-types@0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.0)': dependencies: - '@firebase/app-types': 0.9.2 - '@firebase/util': 1.9.7 + '@firebase/app-types': 0.9.3 + '@firebase/util': 1.12.0 - '@firebase/storage@0.12.6(@firebase/app@0.10.7)': + '@firebase/storage@0.13.12(@firebase/app@0.13.1)': dependencies: - '@firebase/app': 0.10.7 - '@firebase/component': 0.6.8 - '@firebase/util': 1.9.7 + '@firebase/app': 0.13.1 + '@firebase/component': 0.6.17 + '@firebase/util': 1.12.0 tslib: 2.7.0 - undici: 5.28.4 - '@firebase/util@1.9.7': + '@firebase/util@1.12.0': dependencies: tslib: 2.7.0 - '@firebase/vertexai-preview@0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.7)': - dependencies: - '@firebase/app': 0.10.7 - '@firebase/app-check-interop-types': 0.3.2 - '@firebase/app-types': 0.9.2 - '@firebase/component': 0.6.8 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.9.7 - tslib: 2.7.0 - - '@firebase/webchannel-wrapper@1.0.1': {} + '@firebase/webchannel-wrapper@1.0.3': {} '@floating-ui/core@1.6.0': dependencies: @@ -11295,8 +11473,9 @@ snapshots: '@fullcalendar/core': 6.1.11 vue: 3.5.8(typescript@5.4.5) - '@google-cloud/firestore@7.9.0(encoding@0.1.13)': + '@google-cloud/firestore@7.11.1(encoding@0.1.13)': dependencies: + '@opentelemetry/api': 1.9.0 fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 google-gax: 4.3.8(encoding@0.1.13) @@ -11318,7 +11497,7 @@ snapshots: '@google-cloud/promisify@4.0.0': optional: true - '@google-cloud/storage@7.12.0(encoding@0.1.13)': + '@google-cloud/storage@7.16.0(encoding@0.1.13)': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/projectify': 4.0.0 @@ -11328,7 +11507,7 @@ snapshots: duplexify: 4.1.3 fast-xml-parser: 4.4.1 gaxios: 6.7.0(encoding@0.1.13) - google-auth-library: 9.11.0(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) html-entities: 2.5.2 mime: 3.0.0 p-limit: 3.1.0 @@ -11528,7 +11707,7 @@ snapshots: '@jsdevtools/ez-spawn@3.0.4': dependencies: call-me-maybe: 1.0.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 string-argv: 0.3.2 type-detect: 4.0.8 @@ -11614,6 +11793,10 @@ snapshots: json5: 2.2.3 rollup: 3.29.5 + '@mongodb-js/saslprep@1.2.2': + dependencies: + sparse-bitfield: 3.0.3 + '@netlify/functions@2.8.1': dependencies: '@netlify/serverless-functions-api': 1.19.1 @@ -11788,7 +11971,7 @@ snapshots: - vite - webpack-sources - '@nuxt/fonts@0.9.2(encoding@0.1.13)(ioredis@5.4.1)(magicast@0.3.5)(rollup@3.29.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3)': + '@nuxt/fonts@0.9.2(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(encoding@0.1.13)(ioredis@5.6.1)(magicast@0.3.5)(rollup@3.29.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3)': dependencies: '@nuxt/devtools-kit': 1.5.1(magicast@0.3.5)(rollup@3.29.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) @@ -11808,7 +11991,7 @@ snapshots: tinyglobby: 0.2.9 ufo: 1.5.4 unplugin: 1.14.1(webpack-sources@3.2.3) - unstorage: 1.12.0(ioredis@5.4.1) + unstorage: 1.16.0(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(ioredis@5.6.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11817,10 +12000,14 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch + - db0 - encoding - idb-keyval - ioredis @@ -11828,6 +12015,7 @@ snapshots: - rollup - supports-color - uWebSockets.js + - uploadthing - vite - webpack-sources @@ -11869,7 +12057,7 @@ snapshots: globby: 14.0.2 hash-sum: 2.0.0 ignore: 6.0.2 - jiti: 2.4.0 + jiti: 2.4.2 klona: 2.0.6 knitwork: 1.1.0 mlly: 1.7.3 @@ -11965,7 +12153,7 @@ snapshots: is-docker: 3.0.0 jiti: 1.21.6 mri: 1.2.0 - nanoid: 5.0.7 + nanoid: 5.1.5 ofetch: 1.3.4 package-manager-detector: 0.2.0 parse-git-config: 3.0.0 @@ -12418,6 +12606,8 @@ snapshots: transitivePeerDependencies: - debug + '@petamoriken/float16@3.9.2': {} + '@pinia/nuxt@0.5.1(magicast@0.3.5)(rollup@3.29.5)(typescript@5.4.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) @@ -12800,7 +12990,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@sentry/nuxt@8.37.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)(encoding@0.1.13)(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3))(pinia@2.1.7(typescript@5.4.5)(vue@3.5.8(typescript@5.4.5)))(rollup@3.29.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3)': + '@sentry/nuxt@8.37.0(bd6072b168615c8ea944b69150988573)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) '@sentry/browser': 8.37.0 @@ -12812,7 +13002,7 @@ snapshots: '@sentry/utils': 8.37.0 '@sentry/vite-plugin': 2.22.6(encoding@0.1.13) '@sentry/vue': 8.37.0(pinia@2.1.7(typescript@5.4.5)(vue@3.5.8(typescript@5.4.5)))(vue@3.5.8(typescript@5.4.5)) - nuxt: 3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) + nuxt: 3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/core' @@ -13461,6 +13651,7 @@ snapshots: '@types/cors@2.8.17': dependencies: '@types/node': 20.12.7 + optional: true '@types/eslint@8.56.10': dependencies: @@ -13488,6 +13679,7 @@ snapshots: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.19.5 '@types/serve-static': 1.15.7 + optional: true '@types/geojson@7946.0.14': {} @@ -13530,6 +13722,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.15.30': + dependencies: + undici-types: 6.21.0 + '@types/nodemailer@6.4.16': dependencies: '@types/node': 20.12.7 @@ -13610,6 +13806,12 @@ snapshots: '@types/webfontloader@1.6.38': {} + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + '@types/yauzl@2.10.3': dependencies: '@types/node': 20.12.7 @@ -14036,6 +14238,10 @@ snapshots: unhead: 1.11.6 vue: 3.5.8(typescript@5.4.5) + '@upstash/redis@1.35.0': + dependencies: + uncrypto: 0.1.3 + '@vercel/nft@0.26.5(encoding@0.1.13)': dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) @@ -14330,13 +14536,13 @@ snapshots: '@vueuse/metadata@10.9.0': {} - '@vueuse/nuxt@10.11.0(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3))(rollup@3.29.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3)': + '@vueuse/nuxt@10.11.0(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3))(rollup@3.29.5)(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) '@vueuse/core': 10.11.0(vue@3.5.8(typescript@5.4.5)) '@vueuse/metadata': 10.11.0 local-pkg: 0.5.0 - nuxt: 3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) + nuxt: 3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3) vue-demi: 0.14.10(vue@3.5.8(typescript@5.4.5)) transitivePeerDependencies: - '@vue/composition-api' @@ -14374,6 +14580,7 @@ snapshots: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 + optional: true acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: @@ -14405,7 +14612,6 @@ snapshots: debug: 4.3.7 transitivePeerDependencies: - supports-color - optional: true ajv@6.12.6: dependencies: @@ -14489,7 +14695,8 @@ snapshots: argparse@2.0.1: {} - array-flatten@1.1.1: {} + array-flatten@1.1.1: + optional: true array-union@2.1.0: {} @@ -14569,8 +14776,7 @@ snapshots: - encoding - supports-color - bignumber.js@9.1.2: - optional: true + bignumber.js@9.1.2: {} binary-extensions@2.3.0: {} @@ -14598,6 +14804,7 @@ snapshots: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + optional: true boolbase@1.0.0: {} @@ -14634,6 +14841,8 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) + bson@6.10.4: {} + buffer-crc32@0.2.13: {} buffer-crc32@1.0.0: {} @@ -14667,7 +14876,8 @@ snapshots: esbuild: 0.23.1 load-tsconfig: 0.2.5 - bytes@3.1.2: {} + bytes@3.1.2: + optional: true c12@1.11.2(magicast@0.3.5): dependencies: @@ -14693,7 +14903,7 @@ snapshots: defu: 6.1.4 dotenv: 16.4.5 giget: 1.2.3 - jiti: 2.4.0 + jiti: 2.4.2 mlly: 1.7.3 ohash: 1.1.4 pathe: 1.1.2 @@ -14809,6 +15019,10 @@ snapshots: dependencies: readdirp: 4.0.2 + chokidar@4.0.3: + dependencies: + readdirp: 4.0.2 + chownr@2.0.0: {} ci-info@3.9.0: {} @@ -14921,8 +15135,10 @@ snapshots: content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 + optional: true - content-type@1.0.5: {} + content-type@1.0.5: + optional: true convert-source-map@2.0.0: {} @@ -14930,9 +15146,11 @@ snapshots: cookie-es@1.2.2: {} - cookie-signature@1.0.6: {} + cookie-signature@1.0.6: + optional: true - cookie@0.6.0: {} + cookie@0.6.0: + optional: true copy-anything@3.0.5: dependencies: @@ -14948,6 +15166,7 @@ snapshots: dependencies: object-assign: 4.1.1 vary: 1.1.2 + optional: true cosmiconfig@9.0.0(typescript@5.4.5): dependencies: @@ -14985,6 +15204,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crossws@0.2.4: {} crypto-js@4.2.0: {} @@ -15080,9 +15305,9 @@ snapshots: date-fns@4.1.0: {} - db0@0.1.4(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0)): + db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)): optionalDependencies: - drizzle-orm: 0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0) + drizzle-orm: 0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4) debug@2.6.9: dependencies: @@ -15146,6 +15371,8 @@ snapshots: destr@2.0.3: {} + destr@2.0.5: {} + destroy@1.2.0: {} detect-libc@1.0.3: {} @@ -15174,7 +15401,7 @@ snapshots: dependencies: '@types/node': 20.12.7 jszip: 3.10.1 - nanoid: 5.0.7 + nanoid: 5.1.5 xml: 1.0.1 xml-js: 1.6.11 @@ -15209,27 +15436,28 @@ snapshots: dotenv@16.4.5: {} - drizzle-kit@0.23.2: + drizzle-kit@0.30.6: dependencies: - '@drizzle-team/brocli': 0.8.2 + '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 esbuild: 0.19.12 esbuild-register: 3.6.0(esbuild@0.19.12) + gel: 2.1.0 transitivePeerDependencies: - supports-color - drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0): + drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4): optionalDependencies: '@opentelemetry/api': 1.9.0 '@prisma/client': 5.19.1 '@types/pg': 8.11.8 + gel: 2.1.0 pg: 8.12.0 postgres: 3.4.4 - react: 18.2.0 - drizzle-zod@0.5.1(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(zod@3.23.8): + drizzle-zod@0.7.1(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8): dependencies: - drizzle-orm: 0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0) + drizzle-orm: 0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4) zod: 3.23.8 duplexer@0.1.2: {} @@ -15282,6 +15510,8 @@ snapshots: env-paths@2.2.1: {} + env-paths@3.0.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -15840,13 +16070,13 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4)): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4)): dependencies: '@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - vitest: 2.1.1(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4) + vitest: 2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4) transitivePeerDependencies: - supports-color - typescript @@ -16014,7 +16244,7 @@ snapshots: execa@7.2.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 4.3.1 is-stream: 3.0.0 @@ -16026,7 +16256,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -16036,17 +16266,17 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.3.0: + execa@9.6.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 - human-signals: 7.0.0 + human-signals: 8.0.1 is-plain-obj: 4.1.0 is-stream: 4.0.1 - npm-run-path: 5.3.0 - pretty-ms: 9.1.0 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 yoctocolors: 2.1.1 @@ -16086,11 +16316,11 @@ snapshots: vary: 1.1.2 transitivePeerDependencies: - supports-color + optional: true exsolve@1.0.1: {} - extend@3.0.2: - optional: true + extend@3.0.2: {} externality@1.0.2: dependencies: @@ -16194,6 +16424,7 @@ snapshots: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + optional: true find-up-simple@1.0.0: {} @@ -16213,65 +16444,67 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 - firebase-admin@12.2.0(encoding@0.1.13): + firebase-admin@13.4.0(encoding@0.1.13): dependencies: - '@fastify/busboy': 2.1.1 - '@firebase/database-compat': 1.0.6 - '@firebase/database-types': 1.0.4 - '@types/node': 20.12.7 + '@fastify/busboy': 3.1.1 + '@firebase/database-compat': 2.0.10 + '@firebase/database-types': 1.0.14 + '@types/node': 22.15.30 farmhash-modern: 1.1.0 + google-auth-library: 9.15.1(encoding@0.1.13) jsonwebtoken: 9.0.2 jwks-rsa: 3.1.0 - long: 5.2.3 node-forge: 1.3.1 - uuid: 10.0.0 + uuid: 11.1.0 optionalDependencies: - '@google-cloud/firestore': 7.9.0(encoding@0.1.13) - '@google-cloud/storage': 7.12.0(encoding@0.1.13) + '@google-cloud/firestore': 7.11.1(encoding@0.1.13) + '@google-cloud/storage': 7.16.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - firebase-functions@5.0.1(firebase-admin@12.2.0(encoding@0.1.13)): + firebase-functions@5.0.1(firebase-admin@13.4.0(encoding@0.1.13)): dependencies: '@types/cors': 2.8.17 '@types/express': 4.17.3 cors: 2.8.5 express: 4.19.2 - firebase-admin: 12.2.0(encoding@0.1.13) + firebase-admin: 13.4.0(encoding@0.1.13) protobufjs: 7.3.2 transitivePeerDependencies: - supports-color + optional: true - firebase@10.12.4: - dependencies: - '@firebase/analytics': 0.10.6(@firebase/app@0.10.7) - '@firebase/analytics-compat': 0.2.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/app': 0.10.7 - '@firebase/app-check': 0.8.6(@firebase/app@0.10.7) - '@firebase/app-check-compat': 0.3.13(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/app-compat': 0.2.37 - '@firebase/app-types': 0.9.2 - '@firebase/auth': 1.7.5(@firebase/app@0.10.7) - '@firebase/auth-compat': 0.5.10(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) - '@firebase/database': 1.0.6 - '@firebase/database-compat': 1.0.6 - '@firebase/firestore': 4.6.4(@firebase/app@0.10.7) - '@firebase/firestore-compat': 0.3.33(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) - '@firebase/functions': 0.11.6(@firebase/app@0.10.7) - '@firebase/functions-compat': 0.3.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) - '@firebase/installations-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) - '@firebase/messaging': 0.12.10(@firebase/app@0.10.7) - '@firebase/messaging-compat': 0.2.10(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/performance': 0.6.8(@firebase/app@0.10.7) - '@firebase/performance-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/remote-config': 0.4.8(@firebase/app@0.10.7) - '@firebase/remote-config-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/storage': 0.12.6(@firebase/app@0.10.7) - '@firebase/storage-compat': 0.3.9(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) - '@firebase/util': 1.9.7 - '@firebase/vertexai-preview': 0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) + firebase@11.9.0: + dependencies: + '@firebase/ai': 1.4.0(@firebase/app-types@0.9.3)(@firebase/app@0.13.1) + '@firebase/analytics': 0.10.16(@firebase/app@0.13.1) + '@firebase/analytics-compat': 0.2.22(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1) + '@firebase/app': 0.13.1 + '@firebase/app-check': 0.10.0(@firebase/app@0.13.1) + '@firebase/app-check-compat': 0.3.25(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1) + '@firebase/app-compat': 0.4.1 + '@firebase/app-types': 0.9.3 + '@firebase/auth': 1.10.6(@firebase/app@0.13.1) + '@firebase/auth-compat': 0.5.26(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1) + '@firebase/data-connect': 0.3.9(@firebase/app@0.13.1) + '@firebase/database': 1.0.19 + '@firebase/database-compat': 2.0.10 + '@firebase/firestore': 4.7.17(@firebase/app@0.13.1) + '@firebase/firestore-compat': 0.3.52(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1) + '@firebase/functions': 0.12.8(@firebase/app@0.13.1) + '@firebase/functions-compat': 0.3.25(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1) + '@firebase/installations': 0.6.17(@firebase/app@0.13.1) + '@firebase/installations-compat': 0.2.17(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1) + '@firebase/messaging': 0.12.21(@firebase/app@0.13.1) + '@firebase/messaging-compat': 0.2.21(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1) + '@firebase/performance': 0.7.6(@firebase/app@0.13.1) + '@firebase/performance-compat': 0.2.19(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1) + '@firebase/remote-config': 0.6.4(@firebase/app@0.13.1) + '@firebase/remote-config-compat': 0.2.17(@firebase/app-compat@0.4.1)(@firebase/app@0.13.1) + '@firebase/storage': 0.13.12(@firebase/app@0.13.1) + '@firebase/storage-compat': 0.3.22(@firebase/app-compat@0.4.1)(@firebase/app-types@0.9.3)(@firebase/app@0.13.1) + '@firebase/util': 1.12.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -16321,7 +16554,7 @@ snapshots: foreground-child@3.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 form-data@2.5.1: @@ -16337,7 +16570,8 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - forwarded@0.2.0: {} + forwarded@0.2.0: + optional: true fraction.js@4.3.7: {} @@ -16387,7 +16621,6 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true gcp-metadata@6.1.0(encoding@0.1.13): dependencies: @@ -16396,7 +16629,17 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true + + gel@2.1.0: + dependencies: + '@petamoriken/float16': 3.9.2 + debug: 4.3.7 + env-paths: 3.0.0 + semver: 7.6.3 + shell-quote: 1.8.1 + which: 4.0.0 + transitivePeerDependencies: + - supports-color gensync@1.0.0-beta.2: {} @@ -16563,7 +16806,7 @@ snapshots: globjoin@0.1.4: {} - google-auth-library@9.11.0(encoding@0.1.13): + google-auth-library@9.15.1(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 @@ -16574,7 +16817,6 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true google-gax@4.3.8(encoding@0.1.13): dependencies: @@ -16583,7 +16825,7 @@ snapshots: '@types/long': 4.0.2 abort-controller: 3.0.0 duplexify: 4.1.3 - google-auth-library: 9.11.0(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) node-fetch: 2.7.0(encoding@0.1.13) object-hash: 3.0.0 proto3-json-serializer: 2.0.2 @@ -16612,7 +16854,6 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true gzip-size@7.0.0: dependencies: @@ -16707,7 +16948,6 @@ snapshots: debug: 4.3.7 transitivePeerDependencies: - supports-color - optional: true httpxy@0.1.5: {} @@ -16717,11 +16957,12 @@ snapshots: human-signals@5.0.0: {} - human-signals@7.0.0: {} + human-signals@8.0.1: {} iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + optional: true iconv-lite@0.6.3: dependencies: @@ -16795,7 +17036,7 @@ snapshots: ini@4.1.1: {} - ioredis@5.4.1: + ioredis@5.6.1: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 @@ -16809,7 +17050,8 @@ snapshots: transitivePeerDependencies: - supports-color - ipaddr.js@1.9.1: {} + ipaddr.js@1.9.1: + optional: true iron-webcrypto@1.2.1: {} @@ -16927,6 +17169,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 @@ -16943,8 +17187,6 @@ snapshots: jiti@2.0.0-beta.3: {} - jiti@2.4.0: {} - jiti@2.4.2: {} jose@4.15.5: {} @@ -16978,7 +17220,6 @@ snapshots: json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 - optional: true json-buffer@3.0.1: {} @@ -17041,7 +17282,6 @@ snapshots: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - optional: true jwks-rsa@3.1.0: dependencies: @@ -17063,7 +17303,6 @@ snapshots: dependencies: jwa: 2.0.0 safe-buffer: 5.2.1 - optional: true kdbush@4.0.2: {} @@ -17219,11 +17458,6 @@ snapshots: long@5.2.3: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - optional: true - loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -17365,17 +17599,22 @@ snapshots: mdurl@2.0.0: {} - media-typer@0.3.0: {} + media-typer@0.3.0: + optional: true + + memory-pager@1.5.0: {} meow@13.2.0: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.1: + optional: true merge-stream@2.0.0: {} merge2@1.4.1: {} - methods@1.1.2: {} + methods@1.1.2: + optional: true micromark@2.11.4: dependencies: @@ -17504,6 +17743,17 @@ snapshots: moment@2.30.1: {} + mongodb-connection-string-url@3.0.2: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 14.2.0 + + mongodb@6.17.0: + dependencies: + '@mongodb-js/saslprep': 1.2.2 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 + mpd-parser@1.3.0: dependencies: '@babel/runtime': 7.24.4 @@ -17539,7 +17789,7 @@ snapshots: nanoid@3.3.7: {} - nanoid@5.0.7: {} + nanoid@5.1.5: {} nanotar@0.1.1: {} @@ -17547,9 +17797,10 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: {} + negotiator@0.6.3: + optional: true - nitropack@2.9.7(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3): + nitropack@2.9.7(@upstash/redis@1.35.0)(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 '@netlify/functions': 2.8.1 @@ -17572,7 +17823,7 @@ snapshots: cookie-es: 1.1.0 croner: 8.0.2 crossws: 0.2.4 - db0: 0.1.4(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0)) + db0: 0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)) defu: 6.1.4 destr: 2.0.3 dot-prop: 8.0.2 @@ -17585,7 +17836,7 @@ snapshots: h3: 1.13.0 hookable: 5.5.3 httpxy: 0.1.5 - ioredis: 5.4.1 + ioredis: 5.6.1 jiti: 1.21.6 klona: 2.0.6 knitwork: 1.1.0 @@ -17615,7 +17866,7 @@ snapshots: unctx: 2.3.1(webpack-sources@3.2.3) unenv: 1.10.0 unimport: 3.12.0(rollup@4.22.4)(webpack-sources@3.2.3) - unstorage: 1.12.0(ioredis@5.4.1) + unstorage: 1.16.0(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(ioredis@5.6.1) unwasm: 0.3.9 transitivePeerDependencies: - '@azure/app-configuration' @@ -17625,11 +17876,14 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@libsql/client' - '@netlify/blobs' - '@planetscale/database' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch - better-sqlite3 - drizzle-orm - encoding @@ -17637,6 +17891,7 @@ snapshots: - magicast - supports-color - uWebSockets.js + - uploadthing - webpack-sources node-addon-api@5.1.0: {} @@ -17645,6 +17900,8 @@ snapshots: node-fetch-native@1.6.4: {} + node-fetch-native@1.6.6: {} + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -17657,7 +17914,7 @@ snapshots: node-releases@2.0.18: {} - nodemailer@6.9.15: {} + nodemailer@6.10.1: {} nopt@5.0.0: dependencies: @@ -17682,6 +17939,11 @@ snapshots: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 @@ -17720,10 +17982,10 @@ snapshots: - supports-color - webpack-sources - nuxt-nodemailer@1.1.2(magicast@0.3.5)(nodemailer@6.9.15)(rollup@3.29.5)(webpack-sources@3.2.3): + nuxt-nodemailer@1.1.2(magicast@0.3.5)(nodemailer@6.10.1)(rollup@3.29.5)(webpack-sources@3.2.3): dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) - nodemailer: 6.9.15 + nodemailer: 6.10.1 transitivePeerDependencies: - magicast - rollup @@ -17745,25 +18007,25 @@ snapshots: - supports-color - webpack-sources - nuxt-vuefire@1.0.3(@firebase/app-types@0.9.2)(firebase-admin@12.2.0(encoding@0.1.13))(firebase-functions@5.0.1(firebase-admin@12.2.0(encoding@0.1.13)))(firebase@10.12.4)(magicast@0.3.5)(rollup@3.29.5)(vuefire@3.1.24(consola@3.4.0)(firebase@10.12.4)(vue@3.5.8(typescript@5.4.5)))(webpack-sources@3.2.3): + nuxt-vuefire@1.0.3(@firebase/app-types@0.9.2)(firebase-admin@13.4.0(encoding@0.1.13))(firebase-functions@5.0.1(firebase-admin@13.4.0(encoding@0.1.13)))(firebase@11.9.0)(magicast@0.3.5)(rollup@3.29.5)(vuefire@3.1.24(consola@3.4.0)(firebase@11.9.0)(vue@3.5.8(typescript@5.4.5)))(webpack-sources@3.2.3): dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@3.29.5)(webpack-sources@3.2.3) '@posva/lru-cache': 10.0.1 - firebase: 10.12.4 + firebase: 11.9.0 lodash-es: 4.17.21 strip-json-comments: 5.0.1 - vuefire: 3.1.24(consola@3.4.0)(firebase@10.12.4)(vue@3.5.8(typescript@5.4.5)) + vuefire: 3.1.24(consola@3.4.0)(firebase@11.9.0)(vue@3.5.8(typescript@5.4.5)) optionalDependencies: '@firebase/app-types': 0.9.2 - firebase-admin: 12.2.0(encoding@0.1.13) - firebase-functions: 5.0.1(firebase-admin@12.2.0(encoding@0.1.13)) + firebase-admin: 13.4.0(encoding@0.1.13) + firebase-functions: 5.0.1(firebase-admin@13.4.0(encoding@0.1.13)) transitivePeerDependencies: - magicast - rollup - supports-color - webpack-sources - nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3): + nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.5)(sass@1.75.0)(stylelint@16.2.1(typescript@5.4.5))(terser@5.30.4)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(webpack-sources@3.2.3): dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/devtools': 1.5.1(rollup@3.29.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) @@ -17800,7 +18062,7 @@ snapshots: magic-string: 0.30.11 mlly: 1.7.1 nanotar: 0.1.1 - nitropack: 2.9.7(drizzle-orm@0.32.2(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4)(react@18.2.0))(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3) + nitropack: 2.9.7(@upstash/redis@1.35.0)(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4))(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3) nuxi: 3.13.2 nypm: 0.3.11 ofetch: 1.3.4 @@ -17823,7 +18085,7 @@ snapshots: unimport: 3.12.0(rollup@3.29.5)(webpack-sources@3.2.3) unplugin: 1.14.1(webpack-sources@3.2.3) unplugin-vue-router: 0.10.8(rollup@3.29.5)(vue-router@4.4.5(vue@3.5.8(typescript@5.4.5)))(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3) - unstorage: 1.12.0(ioredis@5.4.1) + unstorage: 1.16.0(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(ioredis@5.6.1) untyped: 1.4.2 vue: 3.5.8(typescript@5.4.5) vue-bundle-renderer: 2.1.0 @@ -17841,13 +18103,17 @@ snapshots: - '@azure/storage-blob' - '@biomejs/biome' - '@capacitor/preferences' + - '@deno/kv' - '@libsql/client' - '@netlify/blobs' - '@planetscale/database' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch - better-sqlite3 - bufferutil + - db0 - drizzle-orm - encoding - eslint @@ -17868,6 +18134,7 @@ snapshots: - terser - typescript - uWebSockets.js + - uploadthing - utf-8-validate - vite - vls @@ -17906,6 +18173,12 @@ snapshots: node-fetch-native: 1.6.4 ufo: 1.5.3 + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + ohash@1.1.4: {} on-finished@2.4.1: @@ -18072,7 +18345,8 @@ snapshots: lru-cache: 11.0.1 minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.7: + optional: true path-type@4.0.0: {} @@ -18429,7 +18703,7 @@ snapshots: pretty-bytes@6.1.1: {} - pretty-ms@9.1.0: + pretty-ms@9.2.0: dependencies: parse-ms: 4.0.0 @@ -18576,6 +18850,7 @@ snapshots: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + optional: true proxy-from-env@1.1.0: {} @@ -18616,17 +18891,13 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + optional: true rc9@2.1.2: dependencies: defu: 6.1.4 destr: 2.0.3 - react@18.2.0: - dependencies: - loose-envify: 1.4.0 - optional: true - read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -18840,8 +19111,6 @@ snapshots: safer-buffer@2.1.2: {} - safevalues@0.6.0: {} - sass@1.75.0: dependencies: chokidar: 3.6.0 @@ -19000,6 +19269,10 @@ snapshots: source-map@0.7.4: {} + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -19420,6 +19693,10 @@ snapshots: tr46@0.0.3: {} + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + triple-beam@1.4.1: {} ts-api-utils@1.3.0(typescript@5.4.5): @@ -19477,6 +19754,7 @@ snapshots: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + optional: true type-level-regexp@0.1.17: {} @@ -19488,6 +19766,8 @@ snapshots: ufo@1.5.4: {} + ufo@1.6.1: {} + ultrahtml@1.5.3: {} unbuild@2.0.0(sass@1.75.0)(typescript@5.4.5): @@ -19553,6 +19833,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.21.0: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -19584,6 +19866,8 @@ snapshots: unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} + unimport@3.12.0(rollup@3.29.5)(webpack-sources@3.2.3): dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.5) @@ -19663,7 +19947,8 @@ snapshots: universalify@2.0.1: {} - unpipe@1.0.0: {} + unpipe@1.0.0: + optional: true unplugin-remove@1.0.3(rollup@3.29.5): dependencies: @@ -19740,20 +20025,20 @@ snapshots: acorn: 8.14.0 webpack-virtual-modules: 0.6.2 - unstorage@1.12.0(ioredis@5.4.1): + unstorage@1.16.0(@upstash/redis@1.35.0)(db0@0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)))(ioredis@5.6.1): dependencies: anymatch: 3.1.3 - chokidar: 3.6.0 - destr: 2.0.3 + chokidar: 4.0.3 + destr: 2.0.5 h3: 1.13.0 - listhen: 1.7.2 lru-cache: 10.4.3 - mri: 1.2.0 - node-fetch-native: 1.6.4 - ofetch: 1.3.4 - ufo: 1.5.4 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ufo: 1.6.1 optionalDependencies: - ioredis: 5.4.1 + '@upstash/redis': 1.35.0 + db0: 0.1.4(drizzle-orm@0.40.1(@opentelemetry/api@1.9.0)(@prisma/client@5.19.1)(@types/pg@8.11.8)(gel@2.1.0)(pg@8.12.0)(postgres@3.4.4)) + ioredis: 5.6.1 transitivePeerDependencies: - uWebSockets.js @@ -19781,7 +20066,7 @@ snapshots: '@babel/standalone': 7.26.2 '@babel/types': 7.26.0 defu: 6.1.4 - jiti: 2.4.0 + jiti: 2.4.2 mri: 1.2.0 scule: 1.3.0 transitivePeerDependencies: @@ -19835,10 +20120,13 @@ snapshots: util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} + utils-merge@1.0.1: + optional: true uuid@10.0.0: {} + uuid@11.1.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -19848,7 +20136,8 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vary@1.1.2: {} + vary@1.1.2: + optional: true video.js@8.6.0: dependencies: @@ -19898,6 +20187,23 @@ snapshots: - supports-color - terser + vite-node@2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4): + dependencies: + cac: 6.7.14 + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.2.10(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + optional: true + vite-plugin-checker@0.8.0(eslint@8.57.0)(optionator@0.9.3)(stylelint@16.2.1(typescript@5.4.5))(typescript@5.4.5)(vite@5.4.7(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4)): dependencies: '@babel/code-frame': 7.24.7 @@ -19992,6 +20298,18 @@ snapshots: sass: 1.75.0 terser: 5.30.4 + vite@5.2.10(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.22.4 + optionalDependencies: + '@types/node': 22.15.30 + fsevents: 2.3.3 + sass: 1.75.0 + terser: 5.30.4 + optional: true + vite@5.4.7(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4): dependencies: esbuild: 0.21.5 @@ -20036,6 +20354,40 @@ snapshots: - supports-color - terser + vitest@2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4): + dependencies: + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + debug: 4.3.7 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.2.10(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4) + vite-node: 2.1.1(@types/node@22.15.30)(sass@1.75.0)(terser@5.30.4) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.15.30 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - stylus + - sugarss + - supports-color + - terser + optional: true + vnpay@1.6.0: dependencies: moment-timezone: 0.5.46 @@ -20153,13 +20505,13 @@ snapshots: optionalDependencies: typescript: 5.4.5 - vuefire@3.1.24(consola@3.4.0)(firebase@10.12.4)(vue@3.5.8(typescript@5.4.5)): + vuefire@3.1.24(consola@3.4.0)(firebase@11.9.0)(vue@3.5.8(typescript@5.4.5)): dependencies: vue: 3.5.8(typescript@5.4.5) vue-demi: 0.14.10(vue@3.5.8(typescript@5.4.5)) optionalDependencies: consola: 3.4.0 - firebase: 10.12.4 + firebase: 11.9.0 vuetify-nuxt-module@0.18.3(magicast@0.3.5)(rollup@3.29.5)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.4))(vue@3.5.8(typescript@5.4.5))(webpack-sources@3.2.3): dependencies: @@ -20201,8 +20553,12 @@ snapshots: w3c-keyname@2.2.8: {} + web-vitals@4.2.4: {} + webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} + webpack-sources@3.2.3: {} webpack-virtual-modules@0.5.0: {} @@ -20217,6 +20573,11 @@ snapshots: websocket-extensions@0.1.4: {} + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -20234,6 +20595,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 diff --git a/server/api/notifications.ts b/server/api/notifications.ts deleted file mode 100644 index af85fb05..00000000 --- a/server/api/notifications.ts +++ /dev/null @@ -1,256 +0,0 @@ -import { sub } from 'date-fns' - -const notifications = [{ - id: 1, - unread: true, - sender: { - name: 'Jordan Brown', - email: 'jordan.brown@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=2', - }, - }, - body: 'sent you a message', - date: sub(new Date(), { minutes: 7 }).toISOString(), -}, { - id: 2, - sender: { - name: 'Lindsay Walton', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { hours: 1 }).toISOString(), -}, { - id: 3, - unread: true, - sender: { - name: 'Taylor Green', - email: 'taylor.green@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=3', - }, - }, - body: 'sent you a message', - date: sub(new Date(), { hours: 3 }).toISOString(), -}, { - id: 4, - sender: { - name: 'Courtney Henry', - avatar: { - src: 'https://i.pravatar.cc/128?u=4', - }, - }, - body: 'added you to a project', - date: sub(new Date(), { hours: 3 }).toISOString(), -}, { - id: 5, - sender: { - name: 'Tom Cook', - avatar: { - src: 'https://i.pravatar.cc/128?u=5', - }, - }, - body: 'abandonned cart', - date: sub(new Date(), { hours: 7 }).toISOString(), -}, { - id: 6, - sender: { - name: 'Casey Thomas', - avatar: { - src: 'https://i.pravatar.cc/128?u=6', - }, - }, - body: 'purchased your product', - date: sub(new Date(), { days: 1, hours: 3 }).toISOString(), -}, { - id: 7, - unread: true, - sender: { - name: 'Kelly Wilson', - email: 'kelly.wilson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=8', - }, - }, - body: 'sent you a message', - date: sub(new Date(), { days: 2 }).toISOString(), -}, { - id: 8, - sender: { - name: 'Jamie Johnson', - email: 'jamie.johnson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=9', - }, - }, - body: 'requested a refund', - date: sub(new Date(), { days: 5, hours: 4 }).toISOString(), -}, { - id: 9, - unread: true, - sender: { - name: 'Morgan Anderson', - email: 'morgan.anderson@example.com', - }, - body: 'sent you a message', - date: sub(new Date(), { days: 6 }).toISOString(), -}, { - id: 10, - sender: { - name: 'Drew Moore', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 6 }).toISOString(), -}, { - id: 11, - sender: { - name: 'Riley Davis', - }, - body: 'abandonned cart', - date: sub(new Date(), { days: 7 }).toISOString(), -}, { - id: 12, - sender: { - name: 'Jordan Taylor', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 9 }).toISOString(), -}, { - id: 13, - sender: { - name: 'Kelly Wilson', - email: 'kelly.wilson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=8', - }, - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 10 }).toISOString(), -}, { - id: 14, - sender: { - name: 'Jamie Johnson', - email: 'jamie.johnson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=9', - }, - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 11 }).toISOString(), -}, { - id: 15, - sender: { - name: 'Morgan Anderson', - }, - body: 'purchased your product', - date: sub(new Date(), { days: 12 }).toISOString(), -}, { - id: 16, - sender: { - name: 'Drew Moore', - avatar: { - src: 'https://i.pravatar.cc/128?u=16', - }, - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 13 }).toISOString(), -}, { - id: 17, - sender: { - name: 'Riley Davis', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 14 }).toISOString(), -}, { - id: 18, - sender: { - name: 'Jordan Taylor', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 15 }).toISOString(), -}, { - id: 19, - sender: { - name: 'Kelly Wilson', - email: 'kelly.wilson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=8', - }, - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 16 }).toISOString(), -}, { - id: 20, - sender: { - name: 'Jamie Johnson', - email: 'jamie.johnson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=9', - }, - }, - body: 'purchased your product', - date: sub(new Date(), { days: 17 }).toISOString(), -}, { - id: 21, - sender: { - name: 'Morgan Anderson', - }, - body: 'abandonned cart', - date: sub(new Date(), { days: 17 }).toISOString(), -}, { - id: 22, - sender: { - name: 'Drew Moore', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 18 }).toISOString(), -}, { - id: 23, - sender: { - name: 'Riley Davis', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 19 }).toISOString(), -}, { - id: 24, - sender: { - name: 'Jordan Taylor', - avatar: { - src: 'https://i.pravatar.cc/128?u=24', - }, - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 20 }).toISOString(), -}, { - id: 25, - sender: { - name: 'Kelly Wilson', - email: 'kelly.wilson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=8', - }, - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 20 }).toISOString(), -}, { - id: 26, - sender: { - name: 'Jamie Johnson', - email: 'jamie.johnson@example.com', - avatar: { - src: 'https://i.pravatar.cc/128?u=9', - }, - }, - body: 'abandonned cart', - date: sub(new Date(), { days: 21 }).toISOString(), -}, { - id: 27, - sender: { - name: 'Morgan Anderson', - }, - body: 'subscribed to your email list', - date: sub(new Date(), { days: 22 }).toISOString(), -}] - -export default eventHandler(async () => { - return notifications -}) From f6568be6720cc042da36f345e164a2a73b76549b Mon Sep 17 00:00:00 2001 From: Nguyen Huu Nguyen Y Date: Mon, 9 Jun 2025 00:43:09 +0700 Subject: [PATCH 07/24] fix: auth redirect --- .gitignore | 3 --- app/middleware/02.authentication.global.ts | 10 +++++----- docker/.gitkeep | 1 - package.json | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 docker/.gitkeep diff --git a/.gitignore b/.gitignore index b6b09a0e..7d9e3dfa 100644 --- a/.gitignore +++ b/.gitignore @@ -53,9 +53,6 @@ public/mockServiceWorker.js # Ignore the build directory public/firebase-config.json -docker/postgres -docker/redis - server/db/schemas/cjs server/db/schemas/mjs diff --git a/app/middleware/02.authentication.global.ts b/app/middleware/02.authentication.global.ts index 77c22e55..22d1cc7b 100644 --- a/app/middleware/02.authentication.global.ts +++ b/app/middleware/02.authentication.global.ts @@ -4,16 +4,16 @@ export default defineNuxtRouteMiddleware(async (to) => { const authStore = useAuthStore() + try { + await authStore.fetchProfile() + } + catch {} + if (to.meta.unauthenticatedOnly && authStore.currentUser) { return navigateTo({ path: '/dashboard' }) } if (to.meta.auth || to.meta.auth === undefined) { - try { - await authStore.fetchProfile() - } - catch {} - if (!authStore.currentUser) { return navigateTo({ path: '/auth/login' }) } diff --git a/docker/.gitkeep b/docker/.gitkeep deleted file mode 100644 index 0190c2bc..00000000 --- a/docker/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -backup.sql diff --git a/package.json b/package.json index 13ec83ec..11aa3f5b 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", "db:seed": "jiti ./server/db/seeds/index.ts", - "docker:clear": "rimraf ./docker/postgres ./docker/redis ./docker/mondodb", + "docker:clear": "rimraf ./docker", "docker:start": "docker compose -f docker-compose.service.yml up -d --force-recreate", "docker:stop": "docker-compose -f docker-compose.service.yml down", "docker:reset": "pnpm docker:stop && pnpm docker:clear && pnpm docker:start --force-recreate", From e753e2b0fab8d9159b8ce851fa5da51dc76fb28f Mon Sep 17 00:00:00 2001 From: Nguyen Huu Nguyen Y Date: Mon, 9 Jun 2025 18:30:11 +0700 Subject: [PATCH 08/24] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 11aa3f5b..589d9b6d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@thecodeorigin/nuxt", "type": "module", - "version": "1.11.4", + "version": "1.12.0-rc.1", "publishConfig": { "registry": "https://registry.npmjs.org", "access": "public" From 57c9a05b783c350a1f5284cc39e9609618c79529 Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Mon, 9 Jun 2025 20:28:26 +0700 Subject: [PATCH 09/24] fix: account settings page --- .../AccountSettingsAccount.vue | 195 ++---------------- 1 file changed, 17 insertions(+), 178 deletions(-) diff --git a/app/components/account-settings/AccountSettingsAccount.vue b/app/components/account-settings/AccountSettingsAccount.vue index 366b405d..3b39770b 100644 --- a/app/components/account-settings/AccountSettingsAccount.vue +++ b/app/components/account-settings/AccountSettingsAccount.vue @@ -11,33 +11,15 @@ const authStore = useAuthStore() const formFile = ref(null) const formData = ref({ - avatar_url: authStore.currentUser?.avatar_url || '', - full_name: authStore.currentUser?.full_name || '', - email: authStore.currentUser?.email || '', - organization: authStore.currentUser?.organization || '', - phone: authStore.currentUser?.phone || '', - address: authStore.currentUser?.address || '', - city: authStore.currentUser?.city || '', - postcode: authStore.currentUser?.postcode || '', - country: authStore.currentUser?.country || null, - language: authStore.currentUser?.language || null, -}) - -watch(locale, (value) => { - formData.value.language = value + avatar: authStore.currentUser?.avatar || '', + full_name: authStore.currentUser?.name || '', + email: authStore.currentUser?.primary_email || '' }) function resetForm() { - formData.value.avatar_url = authStore.currentUser?.avatar_url || '' - formData.value.full_name = authStore.currentUser?.full_name || '' - formData.value.email = authStore.currentUser?.email || '' - formData.value.organization = authStore.currentUser?.organization || '' - formData.value.phone = authStore.currentUser?.phone || '' - formData.value.address = authStore.currentUser?.address || '' - formData.value.city = authStore.currentUser?.city || '' - formData.value.postcode = authStore.currentUser?.postcode || '' - formData.value.country = authStore.currentUser?.country || null - formData.value.language = authStore.currentUser?.language || null + formData.value.avatar = authStore.currentUser?.avatar || '' + formData.value.full_name = authStore.currentUser?.name || '' + formData.value.email = authStore.currentUser?.primary_email || '' } function changeAvatar(file: Event) { @@ -46,7 +28,7 @@ function changeAvatar(file: Event) { fileReader.onload = () => { if (typeof fileReader.result === 'string') - formData.value.avatar_url = fileReader.result + formData.value.avatar = fileReader.result } if (files && files.length) { @@ -56,48 +38,15 @@ function changeAvatar(file: Event) { } function resetAvatar() { - formData.value.avatar_url = authStore.currentUser?.avatar_url || '' -} -interface Country { - name: string - flag: string - iso2: string - iso3: string -} - -interface City { - name: string - state_code: string + formData.value.avatar = authStore.currentUser?.avatar || '' } -type CountryList = Array - -type CityList = Array - -const { data: countryList } = await $fetch<{ data: CountryList }>('https://countriesnow.space/api/v0.1/countries/flag/images') - -const cityList = ref([]) -async function fetchCities() { - const { data } = await $fetch<{ data: Country & { states: CityList } }>('https://countriesnow.space/api/v0.1/countries/states', { - method: 'POST', - body: { - country: formData.value.country, - }, - }) - - cityList.value = data.states || [] -} - -watch(() => formData.value.country, (value) => { - if (value) - fetchCities() -}, { immediate: true }) async function handleSubmit() { try { - let avatarUrl = authStore.currentUser?.picture || '' + let avatarUrl = authStore.currentUser?.avatar || '' if (formFile.value && authStore.currentUser) - avatarUrl = await uploadToS3(formFile.value, authStore.currentUser.sub) + avatarUrl = await uploadToS3(formFile.value, formFile.value.name) await authApi.updateProfile({ ...formData.value, @@ -128,8 +77,8 @@ async function handleSubmit() { @click="inputFileRef?.click()" > -
+ @@ -189,6 +138,7 @@ async function handleSubmit() { > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -339,7 +178,7 @@ async function handleSubmit() { > {{ $t('Reset') }} - + --> From f820ff166ac6c2ec736f89e0a94c48b499db4f41 Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Mon, 9 Jun 2025 19:41:59 +0700 Subject: [PATCH 10/24] feat: fix notifications API and UI integration --- .../components/NavBarNotifications.vue | 32 ++++++++++++------- .../layout/DefaultLayoutWithVerticalNav.vue | 2 +- app/api/notification.ts | 4 +-- server/api/notifications/index.get.ts | 3 +- server/api/notifications/unread.get.ts | 4 +-- server/composables/useNotification.ts | 20 ++++++++++++ 6 files changed, 47 insertions(+), 18 deletions(-) diff --git a/app/@layouts/components/NavBarNotifications.vue b/app/@layouts/components/NavBarNotifications.vue index 2f4543b2..947f325f 100644 --- a/app/@layouts/components/NavBarNotifications.vue +++ b/app/@layouts/components/NavBarNotifications.vue @@ -1,9 +1,10 @@ + + diff --git a/app/pages/checkout.vue b/app/pages/checkout.vue new file mode 100644 index 00000000..b59776a6 --- /dev/null +++ b/app/pages/checkout.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/app/pages/settings/[tab].vue b/app/pages/settings/[tab].vue index cd8be895..8f5545ad 100644 --- a/app/pages/settings/[tab].vue +++ b/app/pages/settings/[tab].vue @@ -60,7 +60,7 @@ definePageMeta({ - + diff --git a/server/utils/payment/vn/index.ts b/server/utils/payment/vn/index.ts index 159c4b6e..a0fd5224 100644 --- a/server/utils/payment/vn/index.ts +++ b/server/utils/payment/vn/index.ts @@ -1,5 +1,6 @@ import type { User } from '@base/server/types/models' import { customAlphabet } from 'nanoid' +import { createSePayCheckout } from './sepay' export * from './payos' From f7386f9d972f4ed9a4a6dc34a7dbe48b6f4da709 Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Thu, 12 Jun 2025 13:19:00 +0700 Subject: [PATCH 13/24] chore: bump version to 1.12.0-rc.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3d9598f3..735d14a8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@thecodeorigin/nuxt", "type": "module", - "version": "1.12.0-rc.2", + "version": "1.12.0-rc.3", "publishConfig": { "registry": "https://registry.npmjs.org", "access": "public" From 983baa8eb38fd65eeff2ffde2d66b07f7ccc1fe8 Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Thu, 12 Jun 2025 18:35:33 +0700 Subject: [PATCH 14/24] feat: add reference logic --- app/@layouts/components/UserProfile.vue | 3 + app/api/ref.ts | 11 +++ app/assets/locale/en.json | 5 +- app/assets/locale/vi.json | 4 +- .../AccountSettingsAccount.vue | 47 ++++++++++- server/api/logto/webhook.post.ts | 8 +- server/api/ref/[referCode].get.ts | 11 ++- server/api/ref/unused.get.ts | 14 ++++ server/composables/useReference.ts | 79 ++++++++++++++++++- 9 files changed, 173 insertions(+), 9 deletions(-) create mode 100644 app/api/ref.ts create mode 100644 server/api/ref/unused.get.ts diff --git a/app/@layouts/components/UserProfile.vue b/app/@layouts/components/UserProfile.vue index 9f00cd98..8c5c804b 100644 --- a/app/@layouts/components/UserProfile.vue +++ b/app/@layouts/components/UserProfile.vue @@ -10,6 +10,9 @@ const userFullname = computed(() => authStore.currentUser?.name) async function logout() { try { + const referCode = useCookie('referCode') + referCode.value = null + await navigateTo({ path: '/sign-out' }, { external: true }) navigateTo({ name: 'auth-login' }) diff --git a/app/api/ref.ts b/app/api/ref.ts new file mode 100644 index 00000000..8b7f037c --- /dev/null +++ b/app/api/ref.ts @@ -0,0 +1,11 @@ +export function useApiReference() { + function fetchUnusedReferences() { + return $api(`/api/ref/unused`, { + method: 'GET', + }) + } + + return { + fetchUnusedReferences + } +} diff --git a/app/assets/locale/en.json b/app/assets/locale/en.json index bc9a5388..ae44ce86 100644 --- a/app/assets/locale/en.json +++ b/app/assets/locale/en.json @@ -153,6 +153,7 @@ "Amount": "Amount", "Description": "Description", "Please scan the QR code or transfer the amount to the bank account to complete the payment.": "Please scan the QR code or transfer the amount to the bank account to complete the payment.", - "Confirm Payment": "Confirm Payment" - + "Confirm Payment": "Confirm Payment", + "Available referral code links.": "Available referral code links.", + "No reference links available.": "No reference links available." } diff --git a/app/assets/locale/vi.json b/app/assets/locale/vi.json index 47eafd57..21dccdd9 100644 --- a/app/assets/locale/vi.json +++ b/app/assets/locale/vi.json @@ -153,5 +153,7 @@ "Amount": "Số tiền", "Description": "Mô tả", "Please scan the QR code or transfer the amount to the bank account to complete the payment.": "Vui lòng quét mã QR hoặc chuyển khoản số tiền vào tài khoản ngân hàng để hoàn tất thanh toán.", - "Confirm Payment": "Xác nhận thanh toán" + "Confirm Payment": "Xác nhận thanh toán", + "Available referral code links": "Liên kết mã giới thiệu khả dụng.", + "No reference links available": "Không có liên kết giới thiệu nào khả dụng." } diff --git a/app/components/account-settings/AccountSettingsAccount.vue b/app/components/account-settings/AccountSettingsAccount.vue index 3b39770b..2cd3e6e6 100644 --- a/app/components/account-settings/AccountSettingsAccount.vue +++ b/app/components/account-settings/AccountSettingsAccount.vue @@ -6,10 +6,12 @@ const config = useRuntimeConfig() const inputFileRef = ref() const authApi = useApiAuth() - +const { fetchUnusedReferences } = useApiReference() const authStore = useAuthStore() const formFile = ref(null) +const { data: references } = await useAsyncData('unused-reference', () => fetchUnusedReferences()) + const formData = ref({ avatar: authStore.currentUser?.avatar || '', full_name: authStore.currentUser?.name || '', @@ -61,6 +63,16 @@ async function handleSubmit() { console.error(error) } } + +function copyToClipboard(text: string) { + navigator.clipboard.writeText(text) + .then(() => { + notifySuccess({ content: t('Copied to clipboard!') }) + }) + .catch(err => { + console.error('Copy failed:', err) + }) +} diff --git a/server/api/logto/webhook.post.ts b/server/api/logto/webhook.post.ts index 1a99ccf2..2cd7b8a4 100644 --- a/server/api/logto/webhook.post.ts +++ b/server/api/logto/webhook.post.ts @@ -150,6 +150,9 @@ export default defineEventHandler(async (event) => { const { upsertUser, updateLastSignIn, updateSuspensionStatus, deleteUser } = useUser() const { deleteIdentitiesByUserId } = useIdentity() + // Get reference composables + const { createReference, deleteReferenceByUserId } = useReference() + // Handle different event types switch (eventType) { case 'PostSignIn': { @@ -181,7 +184,7 @@ export default defineEventHandler(async (event) => { // Create or update user const createdUser = await upsertUser(data.id, mapLogtoUserToUserInput(data)) - + await createReference({ userId: createdUser.id, percentage: 5, amount: 0, quantity: 1 }); // Process any identity information await processIdentities(createdUser.id, data.identities) break @@ -208,6 +211,9 @@ export default defineEventHandler(async (event) => { // Then delete the user await deleteUser(user.id) + + // Finally, delete any references associated with the user + await deleteReferenceByUserId(user.id) } break } diff --git a/server/api/ref/[referCode].get.ts b/server/api/ref/[referCode].get.ts index 174164e2..3eeedb12 100644 --- a/server/api/ref/[referCode].get.ts +++ b/server/api/ref/[referCode].get.ts @@ -3,10 +3,15 @@ import { withQuery } from 'ufo' export default defineEventHandler(async (event) => { try { const { referCode } = await defineEventOptions(event, { params: [REFERENCE_CODE_COOKIE_NAME] }) + const { session } = await defineEventOptions(event, { auth: true }) - setCookie(event, REFERENCE_CODE_COOKIE_NAME, referCode, { - httpOnly: true, - }) + const { isReferenceUsableByUser } = useReference() + const flag = await isReferenceUsableByUser(referCode, session.id) + if(flag) { + setCookie(event, REFERENCE_CODE_COOKIE_NAME, referCode, { + httpOnly: false + }) + } return sendRedirect(event, withQuery('/pricing', { referCode }), 301) } diff --git a/server/api/ref/unused.get.ts b/server/api/ref/unused.get.ts new file mode 100644 index 00000000..502f9e90 --- /dev/null +++ b/server/api/ref/unused.get.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + try { + const { session } = await defineEventOptions(event, { auth: true }) + + const { getUnusedReferencesByUserId } = useReference() + + return getUnusedReferencesByUserId(session.id) + } + catch (error: any) { + logger.error('[Reference API] Error fetching unused references:', error) + + throw parseError(error) + } +}) diff --git a/server/composables/useReference.ts b/server/composables/useReference.ts index 1afe6def..1a60bd20 100644 --- a/server/composables/useReference.ts +++ b/server/composables/useReference.ts @@ -1,4 +1,4 @@ -import { eq, sql } from 'drizzle-orm' +import { eq, sql, and, isNull } from 'drizzle-orm' import { referenceTable, referenceUsageTable } from '../db/schemas' export const REFERENCE_CODE_COOKIE_NAME = 'referCode' @@ -81,10 +81,87 @@ export function useReference() { return referenceUsage[0] } + async function createReference({ + userId, + percentage, + amount, + quantity, + }: { + userId: string + percentage?: number + amount?: number + quantity?: number | null + }) { + + const reference = await db.insert(referenceTable).values({ + user_id: userId, + percentage: percentage, + amount: amount, + quantity: quantity ?? null, + }).returning() + + return reference[0] + } + + async function deleteReferenceByUserId(userId: string) { + const deletedReferences = await db + .delete(referenceTable) + .where(eq(referenceTable.user_id, userId)) + .returning(); + + return deletedReferences; + } + + async function getUnusedReferencesByUserId(userId: string) { + const references = await db.select({ + reference: referenceTable, + }) + .from(referenceTable) + .leftJoin(referenceUsageTable, eq(referenceTable.id, referenceUsageTable.reference_id)) + .where(and( + eq(referenceTable.user_id, userId), + isNull(referenceUsageTable.id) + )) + + return references.map((row) => row.reference) + } + + async function isReferenceUsableByUser(refCode: string, userId: string): Promise { + const reference = await db.query.referenceTable.findFirst({ + where(schema, { eq }) { + return eq(schema.code, refCode) + }, + }) + + if (!reference) return false + + const isUsed = await db.query.referenceUsageTable.findFirst({ + where(schema, { eq }) { + return eq(schema.reference_id, reference.id) + }, + }) + + if (isUsed) return false + + const userUsedAnyRef = await db.query.referenceUsageTable.findFirst({ + where(schema, { eq }) { + return eq(schema.user_id, userId) + }, + }) + + if (userUsedAnyRef) return false + + return true + } + return { getReferenceById, getUserReferenceUsage, getUserBestPrice, createReferenceUsage, + createReference, + deleteReferenceByUserId, + getUnusedReferencesByUserId, + isReferenceUsableByUser } } From 921b618e1dbf73c5358be10907cca34d997daccd Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Thu, 12 Jun 2025 19:02:05 +0700 Subject: [PATCH 15/24] fix: change logic isReferenceUsableByUser base on quantity of ref --- server/api/logto/webhook.post.ts | 2 +- server/api/ref/[referCode].get.ts | 4 ++-- server/composables/useReference.ts | 21 ++++++++++++--------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/server/api/logto/webhook.post.ts b/server/api/logto/webhook.post.ts index 2cd7b8a4..ec17b1ff 100644 --- a/server/api/logto/webhook.post.ts +++ b/server/api/logto/webhook.post.ts @@ -184,7 +184,7 @@ export default defineEventHandler(async (event) => { // Create or update user const createdUser = await upsertUser(data.id, mapLogtoUserToUserInput(data)) - await createReference({ userId: createdUser.id, percentage: 5, amount: 0, quantity: 1 }); + await createReference({ userId: createdUser.id, percentage: 5, amount: 0}); // Process any identity information await processIdentities(createdUser.id, data.identities) break diff --git a/server/api/ref/[referCode].get.ts b/server/api/ref/[referCode].get.ts index 3eeedb12..e993ac1a 100644 --- a/server/api/ref/[referCode].get.ts +++ b/server/api/ref/[referCode].get.ts @@ -6,8 +6,8 @@ export default defineEventHandler(async (event) => { const { session } = await defineEventOptions(event, { auth: true }) const { isReferenceUsableByUser } = useReference() - const flag = await isReferenceUsableByUser(referCode, session.id) - if(flag) { + const isUseable = await isReferenceUsableByUser(referCode, session.id) + if(isUseable) { setCookie(event, REFERENCE_CODE_COOKIE_NAME, referCode, { httpOnly: false }) diff --git a/server/composables/useReference.ts b/server/composables/useReference.ts index 1a60bd20..96370072 100644 --- a/server/composables/useReference.ts +++ b/server/composables/useReference.ts @@ -1,4 +1,4 @@ -import { eq, sql, and, isNull } from 'drizzle-orm' +import { eq, sql, and, isNull, count } from 'drizzle-orm' import { referenceTable, referenceUsageTable } from '../db/schemas' export const REFERENCE_CODE_COOKIE_NAME = 'referCode' @@ -135,14 +135,6 @@ export function useReference() { if (!reference) return false - const isUsed = await db.query.referenceUsageTable.findFirst({ - where(schema, { eq }) { - return eq(schema.reference_id, reference.id) - }, - }) - - if (isUsed) return false - const userUsedAnyRef = await db.query.referenceUsageTable.findFirst({ where(schema, { eq }) { return eq(schema.user_id, userId) @@ -151,6 +143,17 @@ export function useReference() { if (userUsedAnyRef) return false + const [{ count: usedCount }] = await db + .select({ count: count() }) + .from(referenceUsageTable) + .where(eq(referenceUsageTable.reference_id, reference.id)) + + const quantity = reference.quantity + + if (quantity === null) return true + + if (usedCount >= quantity) return false + return true } From 68ff09ad5a55320a5c1cd36fa1cb8f940891013a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=E1=BB=8Bnh=20Huy=20Nam?= <38585889+huynamboz@users.noreply.github.com> Date: Thu, 12 Jun 2025 21:49:15 +0700 Subject: [PATCH 16/24] fix: using wrong toast (#67) Co-authored-by: huynam-dana --- app/pages/checkout.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/pages/checkout.vue b/app/pages/checkout.vue index b59776a6..6f01993c 100644 --- a/app/pages/checkout.vue +++ b/app/pages/checkout.vue @@ -24,7 +24,7 @@ const formattedAmount = computed(() => async function handleCheckout() { const { data } = await checkStatus('sepay', paymentInfo.value.description) if (data.status === 'resolved') { - notifyError({ + notifySuccess({ content: t('Payment successful'), }) router.push('/settings/credit') From 2d03b3efea3472b62badb9371641bf64329d1cb9 Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Thu, 12 Jun 2025 23:04:10 +0700 Subject: [PATCH 17/24] feat: add reference to order --- package.json | 2 +- server/composables/useReference.ts | 3 ++- server/utils/payment/vn/index.ts | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 735d14a8..a82c4ec8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@thecodeorigin/nuxt", "type": "module", - "version": "1.12.0-rc.3", + "version": "1.12.0-rc.5", "publishConfig": { "registry": "https://registry.npmjs.org", "access": "public" diff --git a/server/composables/useReference.ts b/server/composables/useReference.ts index 96370072..5806829b 100644 --- a/server/composables/useReference.ts +++ b/server/composables/useReference.ts @@ -165,6 +165,7 @@ export function useReference() { createReference, deleteReferenceByUserId, getUnusedReferencesByUserId, - isReferenceUsableByUser + isReferenceUsableByUser, + getReferenceByCode } } diff --git a/server/utils/payment/vn/index.ts b/server/utils/payment/vn/index.ts index a0fd5224..45734ab7 100644 --- a/server/utils/payment/vn/index.ts +++ b/server/utils/payment/vn/index.ts @@ -25,6 +25,7 @@ export async function createPaymentCheckout( const { createOrder, createPayment, createProviderTransaction } = usePayment() const { getProductByProductId } = useProduct() + const { getReferenceByCode } = useReference() switch (productType) { case 'credit': @@ -51,7 +52,8 @@ export async function createPaymentCheckout( const price = await getUserBestPrice(payload.user.id, productInfo.price, productInfo.price_discount, referCode) - const userOrder = await createOrder(productId, payload.user.id) + var reference = await getReferenceByCode(referCode || '') + const userOrder = await createOrder(productId, payload.user.id, reference?.id) const userPayment = await createPayment( userOrder.id, From 81607b313a3ca9078c3bfe33b3e7f86b86470cbe Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Fri, 13 Jun 2025 11:35:51 +0700 Subject: [PATCH 18/24] fix: change from get unused to get available ref --- app/api/ref.ts | 6 +++--- .../AccountSettingsAccount.vue | 4 ++-- .../ref/{unused.get.ts => available.get.ts} | 6 +++--- server/composables/useReference.ts | 19 ++++++++++--------- 4 files changed, 18 insertions(+), 17 deletions(-) rename server/api/ref/{unused.get.ts => available.get.ts} (50%) diff --git a/app/api/ref.ts b/app/api/ref.ts index 8b7f037c..e22e88ca 100644 --- a/app/api/ref.ts +++ b/app/api/ref.ts @@ -1,11 +1,11 @@ export function useApiReference() { - function fetchUnusedReferences() { - return $api(`/api/ref/unused`, { + function fetchAvailableReferences() { + return $api(`/api/ref/available`, { method: 'GET', }) } return { - fetchUnusedReferences + fetchAvailableReferences } } diff --git a/app/components/account-settings/AccountSettingsAccount.vue b/app/components/account-settings/AccountSettingsAccount.vue index 2cd3e6e6..e89b3b3b 100644 --- a/app/components/account-settings/AccountSettingsAccount.vue +++ b/app/components/account-settings/AccountSettingsAccount.vue @@ -6,11 +6,11 @@ const config = useRuntimeConfig() const inputFileRef = ref() const authApi = useApiAuth() -const { fetchUnusedReferences } = useApiReference() +const { fetchAvailableReferences } = useApiReference() const authStore = useAuthStore() const formFile = ref(null) -const { data: references } = await useAsyncData('unused-reference', () => fetchUnusedReferences()) +const { data: references } = await useAsyncData('available-reference', () => fetchAvailableReferences()) const formData = ref({ avatar: authStore.currentUser?.avatar || '', diff --git a/server/api/ref/unused.get.ts b/server/api/ref/available.get.ts similarity index 50% rename from server/api/ref/unused.get.ts rename to server/api/ref/available.get.ts index 502f9e90..78c4da22 100644 --- a/server/api/ref/unused.get.ts +++ b/server/api/ref/available.get.ts @@ -2,12 +2,12 @@ export default defineEventHandler(async (event) => { try { const { session } = await defineEventOptions(event, { auth: true }) - const { getUnusedReferencesByUserId } = useReference() + const { getAvailableReferencesByUserId } = useReference() - return getUnusedReferencesByUserId(session.id) + return getAvailableReferencesByUserId(session.id) } catch (error: any) { - logger.error('[Reference API] Error fetching unused references:', error) + logger.error('[Reference API] Error fetching available references:', error) throw parseError(error) } diff --git a/server/composables/useReference.ts b/server/composables/useReference.ts index 5806829b..68d686a5 100644 --- a/server/composables/useReference.ts +++ b/server/composables/useReference.ts @@ -1,4 +1,4 @@ -import { eq, sql, and, isNull, count } from 'drizzle-orm' +import { eq, sql, and, isNull, count, or, gt } from 'drizzle-orm' import { referenceTable, referenceUsageTable } from '../db/schemas' export const REFERENCE_CODE_COOKIE_NAME = 'referCode' @@ -112,18 +112,19 @@ export function useReference() { return deletedReferences; } - async function getUnusedReferencesByUserId(userId: string) { - const references = await db.select({ - reference: referenceTable, - }) + async function getAvailableReferencesByUserId(userId: string) { + const references = await db + .select() .from(referenceTable) - .leftJoin(referenceUsageTable, eq(referenceTable.id, referenceUsageTable.reference_id)) .where(and( eq(referenceTable.user_id, userId), - isNull(referenceUsageTable.id) + or( + isNull(referenceTable.quantity), + gt(referenceTable.quantity, 0) + ) )) - return references.map((row) => row.reference) + return references } async function isReferenceUsableByUser(refCode: string, userId: string): Promise { @@ -164,7 +165,7 @@ export function useReference() { createReferenceUsage, createReference, deleteReferenceByUserId, - getUnusedReferencesByUserId, + getAvailableReferencesByUserId, isReferenceUsableByUser, getReferenceByCode } From 0b34da6c4b57af64fc9da441fe5d25831d4246a1 Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Fri, 13 Jun 2025 11:39:28 +0700 Subject: [PATCH 19/24] chore: bump version to 1.12.0-rc.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a82c4ec8..fd014a31 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@thecodeorigin/nuxt", "type": "module", - "version": "1.12.0-rc.5", + "version": "1.12.0-rc.6", "publishConfig": { "registry": "https://registry.npmjs.org", "access": "public" From fd74718c51695f9c05a012dfca49ba894248004d Mon Sep 17 00:00:00 2001 From: TuanAnh1003 Date: Sat, 14 Jun 2025 15:54:57 +0700 Subject: [PATCH 20/24] feat: references usage history UI and affiliate share --- app/api/ref.ts | 21 +++- .../AccountSettingsAccount.vue | 106 ++++++++++++++++-- server/api/payments/sepay/webhook.post.ts | 13 ++- .../apply.get.ts} | 0 server/api/ref/[referCode]/index.get.ts | 15 +++ server/api/ref/history.get.ts | 14 +++ server/composables/useOrder.ts | 35 ++++++ server/composables/useReference.ts | 59 +++++++++- 8 files changed, 247 insertions(+), 16 deletions(-) rename server/api/ref/{[referCode].get.ts => [referCode]/apply.get.ts} (100%) create mode 100644 server/api/ref/[referCode]/index.get.ts create mode 100644 server/api/ref/history.get.ts create mode 100644 server/composables/useOrder.ts diff --git a/app/api/ref.ts b/app/api/ref.ts index e22e88ca..83f94e33 100644 --- a/app/api/ref.ts +++ b/app/api/ref.ts @@ -1,11 +1,28 @@ +import type { ParsedFilterQuery } from '@base/server/utils/filter' + export function useApiReference() { function fetchAvailableReferences() { return $api(`/api/ref/available`, { method: 'GET', - }) + }) + } + + function fetchUsageHistoryReferences(query?: Partial) { + return $api(`/api/ref/history`, { + method: 'GET', + query, + }) + } + + function fetchReferenceByCode(referCode: string) { + return $api(`/api/ref/${referCode}`, { + method: 'GET' + }) } return { - fetchAvailableReferences + fetchAvailableReferences, + fetchUsageHistoryReferences, + fetchReferenceByCode } } diff --git a/app/components/account-settings/AccountSettingsAccount.vue b/app/components/account-settings/AccountSettingsAccount.vue index e89b3b3b..70497264 100644 --- a/app/components/account-settings/AccountSettingsAccount.vue +++ b/app/components/account-settings/AccountSettingsAccount.vue @@ -1,16 +1,57 @@ -