From 1855b374b5539a42da5e0601d18048e195fa022c Mon Sep 17 00:00:00 2001 From: Hugh Hackman Date: Sat, 2 May 2026 21:21:42 +0000 Subject: [PATCH] refactor: inline packages/db and packages/types into api package Phase 2 extraction: groombook/api from groombook/app monorepo. Changes: - Move packages/db content to apps/api/src/db/ - Move packages/types content to apps/api/src/types/ - Inline database schema and migrations into api package - Update Dockerfile to build single package - Update CI workflow for single-package structure - Fix vitest.config.ts aliases Co-Authored-By: Paperclip --- .github/workflows/ci.yml | 7 +-- Dockerfile | 21 +++----- apps/api/Dockerfile | 53 ------------------- {packages/db => apps/api}/drizzle.config.ts | 0 .../migrations/0000_colossal_colossus.sql | 0 .../migrations/0001_pet_health_alerts.sql | 0 .../api}/migrations/0002_invoices.sql | 0 .../api}/migrations/0003_recurring_series.sql | 0 .../api}/migrations/0004_reminder_logs.sql | 0 .../migrations/0005_appointment_groups.sql | 0 .../0006_pet_profile_attributes.sql | 0 .../api}/migrations/0007_tip_splitting.sql | 0 .../migrations/0008_business_settings.sql | 0 .../migrations/0009_client_soft_delete.sql | 0 .../0010_impersonation_sessions.sql | 0 .../migrations/0011_impersonation_indexes.sql | 0 .../api}/migrations/0012_pet_photo.sql | 0 .../0013_appointment_confirmation.sql | 0 .../api}/migrations/0014_customer_notes.sql | 0 .../api}/migrations/0015_waitlist.sql | 0 .../api}/migrations/0016_ical_token.sql | 0 .../migrations/0017_better_auth_tables.sql | 0 .../0018_backfill_staff_user_id.sql | 0 .../migrations/0019_concerned_sunfire.sql | 0 .../0020_typical_daimon_hellstrom.sql | 0 .../api}/migrations/0021_pet_image.sql | 0 .../api}/migrations/0022_logo_key.sql | 0 .../migrations/0023_auth_provider_config.sql | 0 .../api}/migrations/0024_invoice_indexes.sql | 0 .../api}/migrations/0025_rate_limit.sql | 0 .../api}/migrations/0026_stripe_payment.sql | 0 .../api}/migrations/0027_refunds.sql | 0 .../api}/migrations/0028_sms_reminders.sql | 0 .../0029_db_indexes_constraints.sql | 0 .../api}/migrations/meta/0000_snapshot.json | 0 .../api}/migrations/meta/0011_snapshot.json | 0 .../api}/migrations/meta/0019_snapshot.json | 0 .../api}/migrations/meta/0020_snapshot.json | 0 .../api}/migrations/meta/0021_snapshot.json | 0 .../api}/migrations/meta/0022_snapshot.json | 0 .../api}/migrations/meta/0023_snapshot.json | 0 .../api}/migrations/meta/0024_snapshot.json | 0 .../api}/migrations/meta/0026_snapshot.json | 0 .../api}/migrations/meta/_journal.json | 0 apps/api/package.json | 13 +++-- apps/api/src/__tests__/auth.test.ts | 4 +- apps/api/src/__tests__/authProvider.test.ts | 2 +- apps/api/src/__tests__/clients.test.ts | 2 +- apps/api/src/__tests__/confirmation.test.ts | 2 +- apps/api/src/__tests__/crypto.test.ts | 2 +- apps/api/src/__tests__/factories.test.ts | 2 +- apps/api/src/__tests__/impersonation.test.ts | 4 +- apps/api/src/__tests__/petPhotos.test.ts | 2 +- apps/api/src/__tests__/portal.test.ts | 2 +- apps/api/src/__tests__/rbac.test.ts | 2 +- apps/api/src/__tests__/search.test.ts | 2 +- apps/api/src/__tests__/setup.test.ts | 2 +- apps/api/src/__tests__/waitlist.test.ts | 2 +- .../db/src => apps/api/src/db}/crypto.ts | 0 .../db/src => apps/api/src/db}/factories.ts | 2 +- {packages/db/src => apps/api/src/db}/index.ts | 0 {packages/db/src => apps/api/src/db}/reset.ts | 0 .../db/src => apps/api/src/db}/schema.ts | 0 {packages/db/src => apps/api/src/db}/seed.ts | 0 apps/api/src/index.ts | 2 +- apps/api/src/lib/auth.ts | 4 +- apps/api/src/middleware/portalAudit.ts | 2 +- apps/api/src/middleware/portalSession.ts | 2 +- apps/api/src/middleware/rbac.ts | 2 +- apps/api/src/routes/admin/seed.ts | 2 +- apps/api/src/routes/appointmentGroups.ts | 2 +- apps/api/src/routes/appointments.ts | 2 +- apps/api/src/routes/authProvider.ts | 2 +- apps/api/src/routes/book.ts | 2 +- apps/api/src/routes/calendar.ts | 2 +- apps/api/src/routes/clients.ts | 2 +- apps/api/src/routes/dev.ts | 2 +- apps/api/src/routes/groomingLogs.ts | 2 +- apps/api/src/routes/impersonation.ts | 2 +- apps/api/src/routes/invoices.ts | 2 +- apps/api/src/routes/pets.ts | 2 +- apps/api/src/routes/portal.ts | 4 +- apps/api/src/routes/reports.ts | 2 +- apps/api/src/routes/search.ts | 2 +- apps/api/src/routes/services.ts | 2 +- apps/api/src/routes/settings.ts | 2 +- apps/api/src/routes/setup.ts | 2 +- apps/api/src/routes/staff.ts | 2 +- apps/api/src/routes/stripe-webhooks.ts | 2 +- apps/api/src/routes/waitlist.ts | 2 +- apps/api/src/services/payment.ts | 2 +- apps/api/src/services/reminders.ts | 2 +- apps/api/src/services/waitlistNotify.ts | 2 +- .../types/src => apps/api/src/types}/index.ts | 0 apps/api/vitest.config.ts | 7 --- packages/db/package.json | 38 ------------- packages/db/tsconfig.json | 13 ----- packages/types/package.json | 22 -------- packages/types/tsconfig.json | 13 ----- 99 files changed, 64 insertions(+), 217 deletions(-) delete mode 100644 apps/api/Dockerfile rename {packages/db => apps/api}/drizzle.config.ts (100%) rename {packages/db => apps/api}/migrations/0000_colossal_colossus.sql (100%) rename {packages/db => apps/api}/migrations/0001_pet_health_alerts.sql (100%) rename {packages/db => apps/api}/migrations/0002_invoices.sql (100%) rename {packages/db => apps/api}/migrations/0003_recurring_series.sql (100%) rename {packages/db => apps/api}/migrations/0004_reminder_logs.sql (100%) rename {packages/db => apps/api}/migrations/0005_appointment_groups.sql (100%) rename {packages/db => apps/api}/migrations/0006_pet_profile_attributes.sql (100%) rename {packages/db => apps/api}/migrations/0007_tip_splitting.sql (100%) rename {packages/db => apps/api}/migrations/0008_business_settings.sql (100%) rename {packages/db => apps/api}/migrations/0009_client_soft_delete.sql (100%) rename {packages/db => apps/api}/migrations/0010_impersonation_sessions.sql (100%) rename {packages/db => apps/api}/migrations/0011_impersonation_indexes.sql (100%) rename {packages/db => apps/api}/migrations/0012_pet_photo.sql (100%) rename {packages/db => apps/api}/migrations/0013_appointment_confirmation.sql (100%) rename {packages/db => apps/api}/migrations/0014_customer_notes.sql (100%) rename {packages/db => apps/api}/migrations/0015_waitlist.sql (100%) rename {packages/db => apps/api}/migrations/0016_ical_token.sql (100%) rename {packages/db => apps/api}/migrations/0017_better_auth_tables.sql (100%) rename {packages/db => apps/api}/migrations/0018_backfill_staff_user_id.sql (100%) rename {packages/db => apps/api}/migrations/0019_concerned_sunfire.sql (100%) rename {packages/db => apps/api}/migrations/0020_typical_daimon_hellstrom.sql (100%) rename {packages/db => apps/api}/migrations/0021_pet_image.sql (100%) rename {packages/db => apps/api}/migrations/0022_logo_key.sql (100%) rename {packages/db => apps/api}/migrations/0023_auth_provider_config.sql (100%) rename {packages/db => apps/api}/migrations/0024_invoice_indexes.sql (100%) rename {packages/db => apps/api}/migrations/0025_rate_limit.sql (100%) rename {packages/db => apps/api}/migrations/0026_stripe_payment.sql (100%) rename {packages/db => apps/api}/migrations/0027_refunds.sql (100%) rename {packages/db => apps/api}/migrations/0028_sms_reminders.sql (100%) rename {packages/db => apps/api}/migrations/0029_db_indexes_constraints.sql (100%) rename {packages/db => apps/api}/migrations/meta/0000_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0011_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0019_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0020_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0021_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0022_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0023_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0024_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/0026_snapshot.json (100%) rename {packages/db => apps/api}/migrations/meta/_journal.json (100%) rename {packages/db/src => apps/api/src/db}/crypto.ts (100%) rename {packages/db/src => apps/api/src/db}/factories.ts (98%) rename {packages/db/src => apps/api/src/db}/index.ts (100%) rename {packages/db/src => apps/api/src/db}/reset.ts (100%) rename {packages/db/src => apps/api/src/db}/schema.ts (100%) rename {packages/db/src => apps/api/src/db}/seed.ts (100%) rename {packages/types/src => apps/api/src/types}/index.ts (100%) delete mode 100644 packages/db/package.json delete mode 100644 packages/db/tsconfig.json delete mode 100644 packages/types/package.json delete mode 100644 packages/types/tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 87b1d53..158c282 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,11 +77,8 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Build packages - run: | - pnpm --filter @groombook/types build - pnpm --filter @groombook/db build - pnpm --filter @groombook/api build + - name: Build + run: pnpm --filter @groombook/api build docker: name: Build & Push Docker Images diff --git a/Dockerfile b/Dockerfile index 335ef00..3a031e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,32 +3,23 @@ RUN corepack enable && corepack prepare pnpm@9.15.4 --activate WORKDIR /app FROM base AS deps -COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./ +COPY package.json pnpm-lock.yaml ./ COPY apps/api/package.json apps/api/ -COPY packages/db/package.json packages/db/ -COPY packages/types/package.json packages/types/ RUN pnpm install --frozen-lockfile FROM deps AS builder RUN mkdir -p /home/node/.cache/node/corepack -COPY packages/ packages/ COPY apps/api/ apps/api/ -RUN pnpm --filter @groombook/types build && \ - pnpm --filter @groombook/db build && \ - pnpm --filter @groombook/api build +RUN pnpm --filter @groombook/api build FROM node:20-alpine AS runner RUN corepack enable && corepack prepare pnpm@9.15.4 --activate WORKDIR /app ENV NODE_ENV=production -COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./ +COPY package.json pnpm-lock.yaml ./ COPY --from=builder /app/apps/api/package.json apps/api/ COPY --from=builder /app/apps/api/dist apps/api/dist -COPY --from=builder /app/packages/db/package.json packages/db/ -COPY --from=builder /app/packages/db/dist packages/db/dist -COPY --from=builder /app/packages/types/package.json packages/types/ -COPY --from=builder /app/packages/types/dist packages/types/dist RUN pnpm install --frozen-lockfile --prod EXPOSE 3000 @@ -38,10 +29,10 @@ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD ["node", "apps/api/dist/index.js"] FROM builder AS migrate -CMD ["pnpm", "--filter", "@groombook/db", "db:migrate"] +CMD ["pnpm", "--filter", "@groombook/api", "db:migrate"] FROM builder AS seed -CMD ["pnpm", "--filter", "@groombook/db", "db:seed"] +CMD ["pnpm", "--filter", "@groombook/api", "db:seed"] FROM builder AS reset -CMD ["pnpm", "--filter", "@groombook/db", "db:reset"] +CMD ["pnpm", "--filter", "@groombook/api", "db:reset"] diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile deleted file mode 100644 index 23ab29e..0000000 --- a/apps/api/Dockerfile +++ /dev/null @@ -1,53 +0,0 @@ -FROM node:20-alpine AS base -RUN corepack enable && corepack prepare pnpm@9.15.4 --activate -WORKDIR /app - -# Install deps -FROM base AS deps -COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./ -COPY apps/api/package.json apps/api/ -COPY packages/db/package.json packages/db/ -COPY packages/types/package.json packages/types/ -RUN pnpm install --frozen-lockfile - -# Build -FROM deps AS builder -RUN mkdir -p /home/node/.cache/node/corepack -COPY packages/ packages/ -COPY apps/api/ apps/api/ -RUN pnpm --filter @groombook/types build && \ - pnpm --filter @groombook/db build && \ - pnpm --filter @groombook/api build - -# Runtime -FROM node:20-alpine AS runner -RUN corepack enable && corepack prepare pnpm@9.15.4 --activate -WORKDIR /app -ENV NODE_ENV=production - -COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./ -COPY --from=builder /app/apps/api/package.json apps/api/ -COPY --from=builder /app/apps/api/dist apps/api/dist -COPY --from=builder /app/packages/db/package.json packages/db/ -COPY --from=builder /app/packages/db/dist packages/db/dist -COPY --from=builder /app/packages/types/package.json packages/types/ -COPY --from=builder /app/packages/types/dist packages/types/dist -RUN pnpm install --frozen-lockfile --prod - -EXPOSE 3000 -RUN apk add --no-cache curl -HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ - CMD curl -f http://localhost:3000/health || exit 1 -CMD ["node", "apps/api/dist/index.js"] - -# Migrate stage — runs drizzle-kit migrate against the database -FROM builder AS migrate -CMD ["pnpm", "db:migrate"] - -# Seed stage — populates the database with test data -FROM builder AS seed -CMD ["pnpm", "db:seed"] - -# Reset stage — drops all tables, re-runs migrations, and re-seeds -FROM builder AS reset -CMD ["pnpm", "db:reset"] \ No newline at end of file diff --git a/packages/db/drizzle.config.ts b/apps/api/drizzle.config.ts similarity index 100% rename from packages/db/drizzle.config.ts rename to apps/api/drizzle.config.ts diff --git a/packages/db/migrations/0000_colossal_colossus.sql b/apps/api/migrations/0000_colossal_colossus.sql similarity index 100% rename from packages/db/migrations/0000_colossal_colossus.sql rename to apps/api/migrations/0000_colossal_colossus.sql diff --git a/packages/db/migrations/0001_pet_health_alerts.sql b/apps/api/migrations/0001_pet_health_alerts.sql similarity index 100% rename from packages/db/migrations/0001_pet_health_alerts.sql rename to apps/api/migrations/0001_pet_health_alerts.sql diff --git a/packages/db/migrations/0002_invoices.sql b/apps/api/migrations/0002_invoices.sql similarity index 100% rename from packages/db/migrations/0002_invoices.sql rename to apps/api/migrations/0002_invoices.sql diff --git a/packages/db/migrations/0003_recurring_series.sql b/apps/api/migrations/0003_recurring_series.sql similarity index 100% rename from packages/db/migrations/0003_recurring_series.sql rename to apps/api/migrations/0003_recurring_series.sql diff --git a/packages/db/migrations/0004_reminder_logs.sql b/apps/api/migrations/0004_reminder_logs.sql similarity index 100% rename from packages/db/migrations/0004_reminder_logs.sql rename to apps/api/migrations/0004_reminder_logs.sql diff --git a/packages/db/migrations/0005_appointment_groups.sql b/apps/api/migrations/0005_appointment_groups.sql similarity index 100% rename from packages/db/migrations/0005_appointment_groups.sql rename to apps/api/migrations/0005_appointment_groups.sql diff --git a/packages/db/migrations/0006_pet_profile_attributes.sql b/apps/api/migrations/0006_pet_profile_attributes.sql similarity index 100% rename from packages/db/migrations/0006_pet_profile_attributes.sql rename to apps/api/migrations/0006_pet_profile_attributes.sql diff --git a/packages/db/migrations/0007_tip_splitting.sql b/apps/api/migrations/0007_tip_splitting.sql similarity index 100% rename from packages/db/migrations/0007_tip_splitting.sql rename to apps/api/migrations/0007_tip_splitting.sql diff --git a/packages/db/migrations/0008_business_settings.sql b/apps/api/migrations/0008_business_settings.sql similarity index 100% rename from packages/db/migrations/0008_business_settings.sql rename to apps/api/migrations/0008_business_settings.sql diff --git a/packages/db/migrations/0009_client_soft_delete.sql b/apps/api/migrations/0009_client_soft_delete.sql similarity index 100% rename from packages/db/migrations/0009_client_soft_delete.sql rename to apps/api/migrations/0009_client_soft_delete.sql diff --git a/packages/db/migrations/0010_impersonation_sessions.sql b/apps/api/migrations/0010_impersonation_sessions.sql similarity index 100% rename from packages/db/migrations/0010_impersonation_sessions.sql rename to apps/api/migrations/0010_impersonation_sessions.sql diff --git a/packages/db/migrations/0011_impersonation_indexes.sql b/apps/api/migrations/0011_impersonation_indexes.sql similarity index 100% rename from packages/db/migrations/0011_impersonation_indexes.sql rename to apps/api/migrations/0011_impersonation_indexes.sql diff --git a/packages/db/migrations/0012_pet_photo.sql b/apps/api/migrations/0012_pet_photo.sql similarity index 100% rename from packages/db/migrations/0012_pet_photo.sql rename to apps/api/migrations/0012_pet_photo.sql diff --git a/packages/db/migrations/0013_appointment_confirmation.sql b/apps/api/migrations/0013_appointment_confirmation.sql similarity index 100% rename from packages/db/migrations/0013_appointment_confirmation.sql rename to apps/api/migrations/0013_appointment_confirmation.sql diff --git a/packages/db/migrations/0014_customer_notes.sql b/apps/api/migrations/0014_customer_notes.sql similarity index 100% rename from packages/db/migrations/0014_customer_notes.sql rename to apps/api/migrations/0014_customer_notes.sql diff --git a/packages/db/migrations/0015_waitlist.sql b/apps/api/migrations/0015_waitlist.sql similarity index 100% rename from packages/db/migrations/0015_waitlist.sql rename to apps/api/migrations/0015_waitlist.sql diff --git a/packages/db/migrations/0016_ical_token.sql b/apps/api/migrations/0016_ical_token.sql similarity index 100% rename from packages/db/migrations/0016_ical_token.sql rename to apps/api/migrations/0016_ical_token.sql diff --git a/packages/db/migrations/0017_better_auth_tables.sql b/apps/api/migrations/0017_better_auth_tables.sql similarity index 100% rename from packages/db/migrations/0017_better_auth_tables.sql rename to apps/api/migrations/0017_better_auth_tables.sql diff --git a/packages/db/migrations/0018_backfill_staff_user_id.sql b/apps/api/migrations/0018_backfill_staff_user_id.sql similarity index 100% rename from packages/db/migrations/0018_backfill_staff_user_id.sql rename to apps/api/migrations/0018_backfill_staff_user_id.sql diff --git a/packages/db/migrations/0019_concerned_sunfire.sql b/apps/api/migrations/0019_concerned_sunfire.sql similarity index 100% rename from packages/db/migrations/0019_concerned_sunfire.sql rename to apps/api/migrations/0019_concerned_sunfire.sql diff --git a/packages/db/migrations/0020_typical_daimon_hellstrom.sql b/apps/api/migrations/0020_typical_daimon_hellstrom.sql similarity index 100% rename from packages/db/migrations/0020_typical_daimon_hellstrom.sql rename to apps/api/migrations/0020_typical_daimon_hellstrom.sql diff --git a/packages/db/migrations/0021_pet_image.sql b/apps/api/migrations/0021_pet_image.sql similarity index 100% rename from packages/db/migrations/0021_pet_image.sql rename to apps/api/migrations/0021_pet_image.sql diff --git a/packages/db/migrations/0022_logo_key.sql b/apps/api/migrations/0022_logo_key.sql similarity index 100% rename from packages/db/migrations/0022_logo_key.sql rename to apps/api/migrations/0022_logo_key.sql diff --git a/packages/db/migrations/0023_auth_provider_config.sql b/apps/api/migrations/0023_auth_provider_config.sql similarity index 100% rename from packages/db/migrations/0023_auth_provider_config.sql rename to apps/api/migrations/0023_auth_provider_config.sql diff --git a/packages/db/migrations/0024_invoice_indexes.sql b/apps/api/migrations/0024_invoice_indexes.sql similarity index 100% rename from packages/db/migrations/0024_invoice_indexes.sql rename to apps/api/migrations/0024_invoice_indexes.sql diff --git a/packages/db/migrations/0025_rate_limit.sql b/apps/api/migrations/0025_rate_limit.sql similarity index 100% rename from packages/db/migrations/0025_rate_limit.sql rename to apps/api/migrations/0025_rate_limit.sql diff --git a/packages/db/migrations/0026_stripe_payment.sql b/apps/api/migrations/0026_stripe_payment.sql similarity index 100% rename from packages/db/migrations/0026_stripe_payment.sql rename to apps/api/migrations/0026_stripe_payment.sql diff --git a/packages/db/migrations/0027_refunds.sql b/apps/api/migrations/0027_refunds.sql similarity index 100% rename from packages/db/migrations/0027_refunds.sql rename to apps/api/migrations/0027_refunds.sql diff --git a/packages/db/migrations/0028_sms_reminders.sql b/apps/api/migrations/0028_sms_reminders.sql similarity index 100% rename from packages/db/migrations/0028_sms_reminders.sql rename to apps/api/migrations/0028_sms_reminders.sql diff --git a/packages/db/migrations/0029_db_indexes_constraints.sql b/apps/api/migrations/0029_db_indexes_constraints.sql similarity index 100% rename from packages/db/migrations/0029_db_indexes_constraints.sql rename to apps/api/migrations/0029_db_indexes_constraints.sql diff --git a/packages/db/migrations/meta/0000_snapshot.json b/apps/api/migrations/meta/0000_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0000_snapshot.json rename to apps/api/migrations/meta/0000_snapshot.json diff --git a/packages/db/migrations/meta/0011_snapshot.json b/apps/api/migrations/meta/0011_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0011_snapshot.json rename to apps/api/migrations/meta/0011_snapshot.json diff --git a/packages/db/migrations/meta/0019_snapshot.json b/apps/api/migrations/meta/0019_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0019_snapshot.json rename to apps/api/migrations/meta/0019_snapshot.json diff --git a/packages/db/migrations/meta/0020_snapshot.json b/apps/api/migrations/meta/0020_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0020_snapshot.json rename to apps/api/migrations/meta/0020_snapshot.json diff --git a/packages/db/migrations/meta/0021_snapshot.json b/apps/api/migrations/meta/0021_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0021_snapshot.json rename to apps/api/migrations/meta/0021_snapshot.json diff --git a/packages/db/migrations/meta/0022_snapshot.json b/apps/api/migrations/meta/0022_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0022_snapshot.json rename to apps/api/migrations/meta/0022_snapshot.json diff --git a/packages/db/migrations/meta/0023_snapshot.json b/apps/api/migrations/meta/0023_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0023_snapshot.json rename to apps/api/migrations/meta/0023_snapshot.json diff --git a/packages/db/migrations/meta/0024_snapshot.json b/apps/api/migrations/meta/0024_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0024_snapshot.json rename to apps/api/migrations/meta/0024_snapshot.json diff --git a/packages/db/migrations/meta/0026_snapshot.json b/apps/api/migrations/meta/0026_snapshot.json similarity index 100% rename from packages/db/migrations/meta/0026_snapshot.json rename to apps/api/migrations/meta/0026_snapshot.json diff --git a/packages/db/migrations/meta/_journal.json b/apps/api/migrations/meta/_journal.json similarity index 100% rename from packages/db/migrations/meta/_journal.json rename to apps/api/migrations/meta/_journal.json diff --git a/apps/api/package.json b/apps/api/package.json index e8d4488..cb340f4 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -9,22 +9,26 @@ "start": "node dist/index.js", "lint": "eslint src --ext .ts", "typecheck": "tsc --noEmit", - "test": "vitest run" + "test": "vitest run", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:seed": "tsx src/db/seed.ts", + "db:reset": "tsx src/db/reset.ts && drizzle-kit migrate && tsx src/db/seed.ts", + "db:studio": "drizzle-kit studio" }, "dependencies": { "@aws-sdk/client-s3": "^3.800.0", "@aws-sdk/s3-request-presigner": "^3.800.0", - "@groombook/db": "workspace:*", - "@groombook/types": "workspace:*", "@hono/node-server": "^1.13.7", "@hono/zod-validator": "^0.7.6", "better-auth": "^1.5.6", + "drizzle-orm": "^0.38.4", "hono": "^4.6.17", "node-cron": "^3.0.3", "nodemailer": "^6.9.16", + "postgres": "^3.4.5", "stripe": "^22.0.0", "telnyx": "^1.23.0", - "zod": "^4.3.6" }, "devDependencies": { @@ -32,6 +36,7 @@ "@types/node-cron": "^3.0.11", "@types/nodemailer": "^6.4.17", "@vitest/coverage-v8": "^3.2.4", + "drizzle-kit": "^0.30.4", "eslint": "^9.18.0", "tsx": "^4.19.2", "typescript": "^5.7.3", diff --git a/apps/api/src/__tests__/auth.test.ts b/apps/api/src/__tests__/auth.test.ts index 1714301..f48a775 100644 --- a/apps/api/src/__tests__/auth.test.ts +++ b/apps/api/src/__tests__/auth.test.ts @@ -5,7 +5,7 @@ let dbSelectResult: unknown[] = []; const mockEq = vi.fn((_col: unknown, _val: unknown) => ({ col: _col, val: _val })); const mockDecryptSecret = vi.fn((s: string) => `decrypted:${s}`); -vi.mock("./packages/db", () => { +vi.mock("./db", () => { const authProviderConfig = new Proxy( { _name: "auth_provider_config" }, { @@ -40,7 +40,7 @@ vi.mock("./packages/db", () => { async function reimportAuth() { vi.resetModules(); - vi.doMock("./packages/db", () => ({ + vi.doMock("./db", () => ({ getDb: () => ({ select: () => ({ from: () => ({ diff --git a/apps/api/src/__tests__/authProvider.test.ts b/apps/api/src/__tests__/authProvider.test.ts index 43b55ac..7debf5e 100644 --- a/apps/api/src/__tests__/authProvider.test.ts +++ b/apps/api/src/__tests__/authProvider.test.ts @@ -38,7 +38,7 @@ const mockGroomer: MockStaff = { id: "staff-3", role: "groomer", isSuperUser: fa // ─── Mock db module ─────────────────────────────────────────────────────────── -vi.mock("./packages/db", () => { +vi.mock("./db", () => { const authProviderConfig = new Proxy( { _name: "auth_provider_config" }, { diff --git a/apps/api/src/__tests__/clients.test.ts b/apps/api/src/__tests__/clients.test.ts index b972359..0c8b77e 100644 --- a/apps/api/src/__tests__/clients.test.ts +++ b/apps/api/src/__tests__/clients.test.ts @@ -40,7 +40,7 @@ function resetMock() { deletedId = null; } -vi.mock("./packages/db", () => { +vi.mock("./db", () => { function makeChainable(data: unknown[]): unknown { const arr = [...data]; const chain = new Proxy(arr, { diff --git a/apps/api/src/__tests__/confirmation.test.ts b/apps/api/src/__tests__/confirmation.test.ts index 00999ad..22d6f78 100644 --- a/apps/api/src/__tests__/confirmation.test.ts +++ b/apps/api/src/__tests__/confirmation.test.ts @@ -39,7 +39,7 @@ function resetMock() { lastUpdate = {}; } -vi.mock("./packages/db", () => { +vi.mock("./db", () => { const appointments = new Proxy( { _name: "appointments" }, { get: (t, p) => (p === "_name" ? "appointments" : { table: "appointments", column: p }) } diff --git a/apps/api/src/__tests__/crypto.test.ts b/apps/api/src/__tests__/crypto.test.ts index bdafe37..7570edc 100644 --- a/apps/api/src/__tests__/crypto.test.ts +++ b/apps/api/src/__tests__/crypto.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, beforeEach, afterEach } from "vitest"; -import { encryptSecret, decryptSecret } from "./packages/db"; +import { encryptSecret, decryptSecret } from "../db/index.js"; describe("encryptSecret / decryptSecret", () => { const originalEnv = process.env.BETTER_AUTH_SECRET; diff --git a/apps/api/src/__tests__/factories.test.ts b/apps/api/src/__tests__/factories.test.ts index 952fc00..ca23e02 100644 --- a/apps/api/src/__tests__/factories.test.ts +++ b/apps/api/src/__tests__/factories.test.ts @@ -6,7 +6,7 @@ import { buildPet, buildService, buildAppointment, -} from "./packages/db/factories"; +} from "../db/factories.js"; describe("resetFactoryCounters", () => { it("resets all counters so IDs restart from 1", () => { diff --git a/apps/api/src/__tests__/impersonation.test.ts b/apps/api/src/__tests__/impersonation.test.ts index dbe0ed7..20e82c9 100644 --- a/apps/api/src/__tests__/impersonation.test.ts +++ b/apps/api/src/__tests__/impersonation.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; import { Hono } from "hono"; import type { AppEnv, StaffRow } from "../middleware/rbac.js"; -import { buildStaff } from "./packages/db/factories"; +import { buildStaff } from "../db/factories.js"; // ─── Mock data (built with factories for schema-safe defaults) ──────────────── @@ -76,7 +76,7 @@ function makeChainableResult(data: unknown[]): unknown { }); } -vi.mock("./packages/db", () => { +vi.mock("./db", () => { function makeTable(name: string) { return new Proxy( { _name: name }, diff --git a/apps/api/src/__tests__/petPhotos.test.ts b/apps/api/src/__tests__/petPhotos.test.ts index 06d52af..fba8a54 100644 --- a/apps/api/src/__tests__/petPhotos.test.ts +++ b/apps/api/src/__tests__/petPhotos.test.ts @@ -40,7 +40,7 @@ function resetDb() { // ─── Module mocks ───────────────────────────────────────────────────────────── -vi.mock("./packages/db", () => { +vi.mock("./db", () => { const pets = new Proxy( { _name: "pets" }, { get(t, p) { return p === "_name" ? "pets" : {}; } } diff --git a/apps/api/src/__tests__/portal.test.ts b/apps/api/src/__tests__/portal.test.ts index ce427ef..dd9bce7 100644 --- a/apps/api/src/__tests__/portal.test.ts +++ b/apps/api/src/__tests__/portal.test.ts @@ -47,7 +47,7 @@ function resetMock() { updatedValues = []; } -vi.mock("./packages/db", () => { +vi.mock("./db", () => { function makeChainable(data: unknown[]): unknown { const arr = [...data]; const chain = new Proxy(arr, { diff --git a/apps/api/src/__tests__/rbac.test.ts b/apps/api/src/__tests__/rbac.test.ts index c7b22ef..31943fb 100644 --- a/apps/api/src/__tests__/rbac.test.ts +++ b/apps/api/src/__tests__/rbac.test.ts @@ -46,7 +46,7 @@ const GROOMER: StaffRow = { let staffLookupResult: StaffRow | null = null; let managerFallbackResult: StaffRow | null = MANAGER; -vi.mock("./packages/db", () => { +vi.mock("./db", () => { const staff = new Proxy( { _name: "staff" }, { diff --git a/apps/api/src/__tests__/search.test.ts b/apps/api/src/__tests__/search.test.ts index bf948d1..16cf083 100644 --- a/apps/api/src/__tests__/search.test.ts +++ b/apps/api/src/__tests__/search.test.ts @@ -23,7 +23,7 @@ const PET_ROW = { let clientResults: typeof ACTIVE_CLIENT[] = []; let petResults: typeof PET_ROW[] = []; -vi.mock("./packages/db", () => { +vi.mock("./db", () => { // Proxy objects for table/column references — values don't matter for tests const tableProxy = (name: string) => new Proxy( diff --git a/apps/api/src/__tests__/setup.test.ts b/apps/api/src/__tests__/setup.test.ts index 35e2da7..3250e9a 100644 --- a/apps/api/src/__tests__/setup.test.ts +++ b/apps/api/src/__tests__/setup.test.ts @@ -39,7 +39,7 @@ function clearAuthEnv() { // ─── Mock db module ─────────────────────────────────────────────────────────── -vi.mock("./packages/db", () => { +vi.mock("./db", () => { const authProviderConfig = new Proxy( { _name: "auth_provider_config" }, { diff --git a/apps/api/src/__tests__/waitlist.test.ts b/apps/api/src/__tests__/waitlist.test.ts index 5c37a3d..7b85019 100644 --- a/apps/api/src/__tests__/waitlist.test.ts +++ b/apps/api/src/__tests__/waitlist.test.ts @@ -49,7 +49,7 @@ function resetMock() { updatedValues = []; } -vi.mock("./packages/db", () => { +vi.mock("./db", () => { function makeChainable(data: unknown[]): unknown { const arr = [...data]; const chain = new Proxy(arr, { diff --git a/packages/db/src/crypto.ts b/apps/api/src/db/crypto.ts similarity index 100% rename from packages/db/src/crypto.ts rename to apps/api/src/db/crypto.ts diff --git a/packages/db/src/factories.ts b/apps/api/src/db/factories.ts similarity index 98% rename from packages/db/src/factories.ts rename to apps/api/src/db/factories.ts index 88609f2..9f801e2 100644 --- a/packages/db/src/factories.ts +++ b/apps/api/src/db/factories.ts @@ -8,7 +8,7 @@ * readable values (e.g. "staff-1", "client-2") without needing crypto. * * Usage: - * import { buildStaff, buildClient, buildPet } from "@groombook/db/factories"; + * import { buildStaff, buildClient, buildPet } from "./db/factories"; * * const manager = buildStaff({ role: "manager" }); * const client = buildClient({ name: "Alice Smith" }); diff --git a/packages/db/src/index.ts b/apps/api/src/db/index.ts similarity index 100% rename from packages/db/src/index.ts rename to apps/api/src/db/index.ts diff --git a/packages/db/src/reset.ts b/apps/api/src/db/reset.ts similarity index 100% rename from packages/db/src/reset.ts rename to apps/api/src/db/reset.ts diff --git a/packages/db/src/schema.ts b/apps/api/src/db/schema.ts similarity index 100% rename from packages/db/src/schema.ts rename to apps/api/src/db/schema.ts diff --git a/packages/db/src/seed.ts b/apps/api/src/db/seed.ts similarity index 100% rename from packages/db/src/seed.ts rename to apps/api/src/db/seed.ts diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 5db1256..478ed17 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -22,7 +22,7 @@ import { searchRouter } from "./routes/search.js"; import { getObject } from "./lib/s3.js"; import { calendarRouter } from "./routes/calendar.js"; import { setupRouter } from "./routes/setup.js"; -import { getDb, businessSettings, eq, staff } from "./packages/db"; +import { getDb, businessSettings, eq, staff } from "./db"; import { authMiddleware } from "./middleware/auth.js"; import { resolveStaffMiddleware, requireRole, requireRoleOrSuperUser, requireSuperUser } from "./middleware/rbac.js"; import { devRouter } from "./routes/dev.js"; diff --git a/apps/api/src/lib/auth.ts b/apps/api/src/lib/auth.ts index 2ccc5cc..63163d5 100644 --- a/apps/api/src/lib/auth.ts +++ b/apps/api/src/lib/auth.ts @@ -1,8 +1,8 @@ import { betterAuth } from "better-auth"; import { drizzleAdapter } from "better-auth/adapters/drizzle"; import { genericOAuth } from "better-auth/plugins"; -import { getDb, authProviderConfig, eq } from "./packages/db"; -import { decryptSecret } from "./packages/db"; +import { getDb, authProviderConfig, eq } from "./db"; +import { decryptSecret } from "./db"; import { sendEmail } from "../services/email.js"; const BETTER_AUTH_SECRET = process.env.BETTER_AUTH_SECRET; diff --git a/apps/api/src/middleware/portalAudit.ts b/apps/api/src/middleware/portalAudit.ts index 8224c50..d76541c 100644 --- a/apps/api/src/middleware/portalAudit.ts +++ b/apps/api/src/middleware/portalAudit.ts @@ -1,5 +1,5 @@ import type { MiddlewareHandler } from "hono"; -import { getDb, impersonationAuditLogs } from "./packages/db"; +import { getDb, impersonationAuditLogs } from "../db"; import type { PortalEnv } from "./portalSession.js"; /** diff --git a/apps/api/src/middleware/portalSession.ts b/apps/api/src/middleware/portalSession.ts index 395f7b8..b5d1f53 100644 --- a/apps/api/src/middleware/portalSession.ts +++ b/apps/api/src/middleware/portalSession.ts @@ -1,5 +1,5 @@ import type { MiddlewareHandler } from "hono"; -import { and, eq, getDb, impersonationSessions } from "./packages/db"; +import { and, eq, getDb, impersonationSessions } from "../db"; export interface PortalEnv { Variables: { diff --git a/apps/api/src/middleware/rbac.ts b/apps/api/src/middleware/rbac.ts index 2c1edaa..ae105eb 100644 --- a/apps/api/src/middleware/rbac.ts +++ b/apps/api/src/middleware/rbac.ts @@ -1,5 +1,5 @@ import type { MiddlewareHandler } from "hono"; -import { and, eq, getDb, sql, staff } from "./packages/db"; +import { and, eq, getDb, sql, staff } from "../db"; export type StaffRole = "groomer" | "receptionist" | "manager"; export type StaffRow = typeof staff.$inferSelect; diff --git a/apps/api/src/routes/admin/seed.ts b/apps/api/src/routes/admin/seed.ts index ca70420..8e89748 100644 --- a/apps/api/src/routes/admin/seed.ts +++ b/apps/api/src/routes/admin/seed.ts @@ -10,7 +10,7 @@ */ import { Hono } from "hono"; -import { eq, getDb, staff, clients, pets, services } from "./packages/db"; +import { eq, getDb, staff, clients, pets, services } from "./db"; export const adminSeedRouter = new Hono(); diff --git a/apps/api/src/routes/appointmentGroups.ts b/apps/api/src/routes/appointmentGroups.ts index 2babac8..e75ec66 100644 --- a/apps/api/src/routes/appointmentGroups.ts +++ b/apps/api/src/routes/appointmentGroups.ts @@ -15,7 +15,7 @@ import { pets, services, staff, -} from "./packages/db"; +} from "../db"; import type { AppEnv } from "../middleware/rbac.js"; export const appointmentGroupsRouter = new Hono(); diff --git a/apps/api/src/routes/appointments.ts b/apps/api/src/routes/appointments.ts index 612670c..a3d29fd 100644 --- a/apps/api/src/routes/appointments.ts +++ b/apps/api/src/routes/appointments.ts @@ -18,7 +18,7 @@ import { reminderLogs, services, staff, -} from "./packages/db"; +} from "../db"; import { buildConfirmationEmail, sendEmail } from "../services/email.js"; import { notifyWaitlistForAppointment } from "../services/waitlistNotify.js"; import type { AppEnv } from "../middleware/rbac.js"; diff --git a/apps/api/src/routes/authProvider.ts b/apps/api/src/routes/authProvider.ts index e8f50b4..9bd4f2f 100644 --- a/apps/api/src/routes/authProvider.ts +++ b/apps/api/src/routes/authProvider.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { eq, getDb, authProviderConfig, encryptSecret } from "./packages/db"; +import { eq, getDb, authProviderConfig, encryptSecret } from "../db"; import { requireSuperUser } from "../middleware/rbac.js"; import { reinitAuth } from "../lib/auth.js"; diff --git a/apps/api/src/routes/book.ts b/apps/api/src/routes/book.ts index 95cfe1d..e15a131 100644 --- a/apps/api/src/routes/book.ts +++ b/apps/api/src/routes/book.ts @@ -14,7 +14,7 @@ import { appointments, clients, pets, -} from "./packages/db"; +} from "../db"; import { generateAvailableSlots, BUSINESS_START_HOUR, diff --git a/apps/api/src/routes/calendar.ts b/apps/api/src/routes/calendar.ts index 50a928a..1aba590 100644 --- a/apps/api/src/routes/calendar.ts +++ b/apps/api/src/routes/calendar.ts @@ -10,7 +10,7 @@ import { pets, services, staff, -} from "./packages/db"; +} from "../db"; export const calendarRouter = new Hono(); diff --git a/apps/api/src/routes/clients.ts b/apps/api/src/routes/clients.ts index 8a0f7fa..679d3b7 100644 --- a/apps/api/src/routes/clients.ts +++ b/apps/api/src/routes/clients.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { and, eq, exists, getDb, or, clients, appointments } from "./packages/db"; +import { and, eq, exists, getDb, or, clients, appointments } from "../db"; import type { AppEnv } from "../middleware/rbac.js"; export const clientsRouter = new Hono(); diff --git a/apps/api/src/routes/dev.ts b/apps/api/src/routes/dev.ts index 40ffa44..34e8aa5 100644 --- a/apps/api/src/routes/dev.ts +++ b/apps/api/src/routes/dev.ts @@ -1,5 +1,5 @@ import { Hono } from "hono"; -import { getDb, staff, clients, eq, sql } from "./packages/db"; +import { getDb, staff, clients, eq, sql } from "../db"; const devRouter = new Hono(); diff --git a/apps/api/src/routes/groomingLogs.ts b/apps/api/src/routes/groomingLogs.ts index ffeb1a4..8d24d53 100644 --- a/apps/api/src/routes/groomingLogs.ts +++ b/apps/api/src/routes/groomingLogs.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { and, desc, eq, getDb, groomingVisitLogs, appointments, or } from "./packages/db"; +import { and, desc, eq, getDb, groomingVisitLogs, appointments, or } from "../db"; import type { AppEnv } from "../middleware/rbac.js"; export const groomingLogsRouter = new Hono(); diff --git a/apps/api/src/routes/impersonation.ts b/apps/api/src/routes/impersonation.ts index c9a22cf..7cd98f9 100644 --- a/apps/api/src/routes/impersonation.ts +++ b/apps/api/src/routes/impersonation.ts @@ -9,7 +9,7 @@ import { impersonationAuditLogs, clients, desc, -} from "./packages/db"; +} from "../db"; import type { AppEnv } from "../middleware/rbac.js"; export const impersonationRouter = new Hono(); diff --git a/apps/api/src/routes/invoices.ts b/apps/api/src/routes/invoices.ts index 6071fb0..ca30cae 100644 --- a/apps/api/src/routes/invoices.ts +++ b/apps/api/src/routes/invoices.ts @@ -13,7 +13,7 @@ import { services, clients, sql, -} from "./packages/db"; +} from "../db"; import type { AppEnv } from "../middleware/rbac.js"; export const invoicesRouter = new Hono(); diff --git a/apps/api/src/routes/pets.ts b/apps/api/src/routes/pets.ts index 2059e44..f911d56 100644 --- a/apps/api/src/routes/pets.ts +++ b/apps/api/src/routes/pets.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { and, eq, exists, getDb, or, pets, appointments } from "./packages/db"; +import { and, eq, exists, getDb, or, pets, appointments } from "../db"; import type { AppEnv } from "../middleware/rbac.js"; import { getPresignedUploadUrl, diff --git a/apps/api/src/routes/portal.ts b/apps/api/src/routes/portal.ts index 54b2dbb..421fc6d 100644 --- a/apps/api/src/routes/portal.ts +++ b/apps/api/src/routes/portal.ts @@ -1,8 +1,8 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { eq, inArray } from "./packages/db"; -import { getDb, appointments, impersonationSessions, waitlistEntries, clients, pets, services, staff, invoices, invoiceLineItems } from "./packages/db"; +import { eq, inArray } from "../db"; +import { getDb, appointments, impersonationSessions, waitlistEntries, clients, pets, services, staff, invoices, invoiceLineItems } from "../db"; import { validatePortalSession } from "../middleware/portalSession.js"; import { portalAudit } from "../middleware/portalAudit.js"; import type { PortalEnv } from "../middleware/portalSession.js"; diff --git a/apps/api/src/routes/reports.ts b/apps/api/src/routes/reports.ts index 835607b..aeffc95 100644 --- a/apps/api/src/routes/reports.ts +++ b/apps/api/src/routes/reports.ts @@ -12,7 +12,7 @@ import { invoiceTipSplits, services, staff, -} from "./packages/db"; +} from "../db"; export const reportsRouter = new Hono(); diff --git a/apps/api/src/routes/search.ts b/apps/api/src/routes/search.ts index bd8b079..e72d700 100644 --- a/apps/api/src/routes/search.ts +++ b/apps/api/src/routes/search.ts @@ -1,5 +1,5 @@ import { Hono } from "hono"; -import { and, eq, getDb, clients, ilike, or, pets } from "./packages/db"; +import { and, eq, getDb, clients, ilike, or, pets } from "../db"; export const searchRouter = new Hono(); diff --git a/apps/api/src/routes/services.ts b/apps/api/src/routes/services.ts index a44697a..bffe6c4 100644 --- a/apps/api/src/routes/services.ts +++ b/apps/api/src/routes/services.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { eq, getDb, services } from "./packages/db"; +import { eq, getDb, services } from "../db"; export const servicesRouter = new Hono(); diff --git a/apps/api/src/routes/settings.ts b/apps/api/src/routes/settings.ts index 50af619..32c48a2 100644 --- a/apps/api/src/routes/settings.ts +++ b/apps/api/src/routes/settings.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { eq, getDb, businessSettings } from "./packages/db"; +import { eq, getDb, businessSettings } from "../db"; import { getPresignedUploadUrl, deleteObject, putObject, getObject } from "../lib/s3.js"; import { requireSuperUser } from "../middleware/rbac.js"; diff --git a/apps/api/src/routes/setup.ts b/apps/api/src/routes/setup.ts index 1c6602c..1ad4c25 100644 --- a/apps/api/src/routes/setup.ts +++ b/apps/api/src/routes/setup.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; -import { and, eq, getDb, sql, staff, businessSettings, authProviderConfig, encryptSecret } from "./packages/db"; +import { and, eq, getDb, sql, staff, businessSettings, authProviderConfig, encryptSecret } from "../db"; import type { AppEnv } from "../middleware/rbac.js"; const RATE_LIMIT_WINDOW_MS = 60_000; diff --git a/apps/api/src/routes/staff.ts b/apps/api/src/routes/staff.ts index 0bafad1..80c3262 100644 --- a/apps/api/src/routes/staff.ts +++ b/apps/api/src/routes/staff.ts @@ -2,7 +2,7 @@ import { Hono } from "hono"; import { zValidator } from "@hono/zod-validator"; import { z } from "zod/v3"; import { randomBytes } from "node:crypto"; -import { and, eq, getDb, ne, staff, appointments } from "./packages/db"; +import { and, eq, getDb, ne, staff, appointments } from "../db"; import type { AppEnv } from "../middleware/rbac.js"; export const staffRouter = new Hono(); diff --git a/apps/api/src/routes/stripe-webhooks.ts b/apps/api/src/routes/stripe-webhooks.ts index 1348cc2..e4c5238 100644 --- a/apps/api/src/routes/stripe-webhooks.ts +++ b/apps/api/src/routes/stripe-webhooks.ts @@ -1,7 +1,7 @@ import { Hono } from "hono"; import Stripe from "stripe"; import { z } from "zod/v3"; -import { eq, getDb, invoices } from "./packages/db"; +import { eq, getDb, invoices } from "../db"; import { getStripeClient } from "../services/payment.js"; export const webhooksRouter = new Hono(); diff --git a/apps/api/src/routes/waitlist.ts b/apps/api/src/routes/waitlist.ts index 279824d..897e531 100644 --- a/apps/api/src/routes/waitlist.ts +++ b/apps/api/src/routes/waitlist.ts @@ -8,7 +8,7 @@ import { clients, pets, services, -} from "./packages/db"; +} from "../db"; import type { AppEnv } from "../middleware/rbac.js"; export const waitlistRouter = new Hono(); diff --git a/apps/api/src/services/payment.ts b/apps/api/src/services/payment.ts index 67dd436..93ede92 100644 --- a/apps/api/src/services/payment.ts +++ b/apps/api/src/services/payment.ts @@ -1,5 +1,5 @@ import Stripe from "stripe"; -import { getDb, clients, eq, inArray, invoices } from "./packages/db"; +import { getDb, clients, eq, inArray, invoices } from "../db"; let _stripe: Stripe | null | undefined; diff --git a/apps/api/src/services/reminders.ts b/apps/api/src/services/reminders.ts index 06c9082..255505c 100644 --- a/apps/api/src/services/reminders.ts +++ b/apps/api/src/services/reminders.ts @@ -14,7 +14,7 @@ import { staff, reminderLogs, session, -} from "./packages/db"; +} from "../db"; import { buildReminderEmail, sendEmail, diff --git a/apps/api/src/services/waitlistNotify.ts b/apps/api/src/services/waitlistNotify.ts index 10968da..bd6f76a 100644 --- a/apps/api/src/services/waitlistNotify.ts +++ b/apps/api/src/services/waitlistNotify.ts @@ -1,4 +1,4 @@ -import { and, eq, getDb, waitlistEntries, clients, pets, services } from "./packages/db"; +import { and, eq, getDb, waitlistEntries, clients, pets, services } from "../db"; import { buildWaitlistNotificationEmail, sendEmail } from "./email.js"; export async function notifyWaitlistForAppointment( diff --git a/packages/types/src/index.ts b/apps/api/src/types/index.ts similarity index 100% rename from packages/types/src/index.ts rename to apps/api/src/types/index.ts diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts index f8e2c3a..2db11ce 100644 --- a/apps/api/vitest.config.ts +++ b/apps/api/vitest.config.ts @@ -1,13 +1,6 @@ import { defineConfig } from "vitest/config"; -import path from "path"; export default defineConfig({ - resolve: { - alias: { - "@groombook/db/factories": path.resolve(__dirname, "../../packages/db/src/factories.ts"), - "@groombook/db": path.resolve(__dirname, "../../packages/db/src/index.ts"), - }, - }, test: { coverage: { provider: "v8", diff --git a/packages/db/package.json b/packages/db/package.json deleted file mode 100644 index ff7eab4..0000000 --- a/packages/db/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "@groombook/db", - "version": "0.0.1", - "private": true, - "type": "module", - "main": "./dist/index.js", - "types": "./src/index.ts", - "exports": { - ".": { - "default": "./dist/index.js", - "types": "./src/index.ts" - }, - "./factories": { - "default": "./src/factories.ts", - "types": "./src/factories.ts" - } - }, - "scripts": { - "build": "tsc", - "generate": "drizzle-kit generate", - "migrate": "drizzle-kit migrate", - "seed": "tsx src/seed.ts", - "reset": "tsx src/reset.ts && drizzle-kit migrate && tsx src/seed.ts", - "studio": "drizzle-kit studio", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "drizzle-orm": "^0.38.4", - "postgres": "^3.4.5" - }, - "devDependencies": { - "@types/node": "^22.10.7", - "drizzle-kit": "^0.30.4", - "tsx": "^4.19.0", - "typescript": "^5.7.3" - }, - "license": "AGPL-3.0-only" -} diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json deleted file mode 100644 index 3b421a7..0000000 --- a/packages/db/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "strict": true, - "noUncheckedIndexedAccess": true, - "skipLibCheck": true, - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src"] -} diff --git a/packages/types/package.json b/packages/types/package.json deleted file mode 100644 index 5ab7066..0000000 --- a/packages/types/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@groombook/types", - "version": "0.0.1", - "private": true, - "type": "module", - "main": "./dist/index.js", - "types": "./src/index.ts", - "exports": { - ".": { - "default": "./dist/index.js", - "types": "./src/index.ts" - } - }, - "scripts": { - "build": "tsc", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "typescript": "^5.7.3" - }, - "license": "AGPL-3.0-only" -} diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json deleted file mode 100644 index 3b421a7..0000000 --- a/packages/types/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "strict": true, - "noUncheckedIndexedAccess": true, - "skipLibCheck": true, - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src"] -}