diff --git a/apps/api/src/auth/csrf/csrf.middleware.ts b/apps/api/src/features/auth/csrf/csrf.middleware.ts similarity index 100% rename from apps/api/src/auth/csrf/csrf.middleware.ts rename to apps/api/src/features/auth/csrf/csrf.middleware.ts diff --git a/apps/api/src/auth/google/google-oidc.routes.test.ts b/apps/api/src/features/auth/google/google-oidc.routes.test.ts similarity index 99% rename from apps/api/src/auth/google/google-oidc.routes.test.ts rename to apps/api/src/features/auth/google/google-oidc.routes.test.ts index 14a65f6..0a7eb83 100644 --- a/apps/api/src/auth/google/google-oidc.routes.test.ts +++ b/apps/api/src/features/auth/google/google-oidc.routes.test.ts @@ -12,7 +12,7 @@ import { validateReturnTo, } from './google-oidc.routes.js'; import { createSessionMiddleware } from '../session/session.middleware.js'; -import { testSessionConfiguration } from '../../test/fixtures/session-configuration.fixture.js'; +import { testSessionConfiguration } from '../../../test/fixtures/session-configuration.fixture.js'; const redirectUri = 'http://localhost:3000/auth/google/callback'; type TestContextOptions = { diff --git a/apps/api/src/auth/google/google-oidc.routes.ts b/apps/api/src/features/auth/google/google-oidc.routes.ts similarity index 99% rename from apps/api/src/auth/google/google-oidc.routes.ts rename to apps/api/src/features/auth/google/google-oidc.routes.ts index ed8f146..45c3faf 100644 --- a/apps/api/src/auth/google/google-oidc.routes.ts +++ b/apps/api/src/features/auth/google/google-oidc.routes.ts @@ -12,7 +12,7 @@ import { } from 'openid-client'; import { z } from 'zod'; -import type { Env } from '../../config/env-schema.js'; +import type { Env } from '../../../config/env-schema.js'; import type { GoogleUserProfile } from './google-user.service.js'; const GOOGLE_ISSUER = new URL('https://accounts.google.com'); diff --git a/apps/api/src/auth/google/google-user.service.test.ts b/apps/api/src/features/auth/google/google-user.service.test.ts similarity index 100% rename from apps/api/src/auth/google/google-user.service.test.ts rename to apps/api/src/features/auth/google/google-user.service.test.ts diff --git a/apps/api/src/auth/google/google-user.service.ts b/apps/api/src/features/auth/google/google-user.service.ts similarity index 95% rename from apps/api/src/auth/google/google-user.service.ts rename to apps/api/src/features/auth/google/google-user.service.ts index f58edc3..448ffe1 100644 --- a/apps/api/src/auth/google/google-user.service.ts +++ b/apps/api/src/features/auth/google/google-user.service.ts @@ -1,7 +1,7 @@ /** Atomically provisions or updates a user identified by Google's stable subject. */ import type { NodePgDatabase } from 'drizzle-orm/node-postgres'; -import { users } from '../../db/schema/index.js'; +import { users } from '../../../db/schema/index.js'; export type GoogleUserProfile = { avatarUrl?: string; diff --git a/apps/api/src/auth/guards/authentication.middleware.ts b/apps/api/src/features/auth/guards/authentication.middleware.ts similarity index 100% rename from apps/api/src/auth/guards/authentication.middleware.ts rename to apps/api/src/features/auth/guards/authentication.middleware.ts diff --git a/apps/api/src/auth/guards/authorization.middleware.test.ts b/apps/api/src/features/auth/guards/authorization.middleware.test.ts similarity index 96% rename from apps/api/src/auth/guards/authorization.middleware.test.ts rename to apps/api/src/features/auth/guards/authorization.middleware.test.ts index 1a3fc7e..4d15222 100644 --- a/apps/api/src/auth/guards/authorization.middleware.test.ts +++ b/apps/api/src/features/auth/guards/authorization.middleware.test.ts @@ -8,8 +8,8 @@ import { createSessionMiddleware } from '../session/session.middleware.js'; import { establishAuthenticatedTestSession, withAuthenticatedTestUser, -} from '../../test/authenticated-session.test-helper.js'; -import { testSessionConfiguration } from '../../test/fixtures/session-configuration.fixture.js'; +} from '../../../test/authenticated-session.test-helper.js'; +import { testSessionConfiguration } from '../../../test/fixtures/session-configuration.fixture.js'; import { getAuthenticatedUserId, requireAuthentication, diff --git a/apps/api/src/auth/guards/authorization.middleware.ts b/apps/api/src/features/auth/guards/authorization.middleware.ts similarity index 100% rename from apps/api/src/auth/guards/authorization.middleware.ts rename to apps/api/src/features/auth/guards/authorization.middleware.ts diff --git a/apps/api/src/auth/session/session.middleware.test.ts b/apps/api/src/features/auth/session/session.middleware.test.ts similarity index 96% rename from apps/api/src/auth/session/session.middleware.test.ts rename to apps/api/src/features/auth/session/session.middleware.test.ts index 410406a..a6d87f3 100644 --- a/apps/api/src/auth/session/session.middleware.test.ts +++ b/apps/api/src/features/auth/session/session.middleware.test.ts @@ -4,7 +4,7 @@ import session from 'express-session'; import request from 'supertest'; import { describe, expect, it } from 'vitest'; -import { testSessionConfiguration } from '../../test/fixtures/session-configuration.fixture.js'; +import { testSessionConfiguration } from '../../../test/fixtures/session-configuration.fixture.js'; import { createSessionMiddleware } from './session.middleware.js'; function createSessionTestApp(store: session.MemoryStore) { diff --git a/apps/api/src/auth/session/session.middleware.ts b/apps/api/src/features/auth/session/session.middleware.ts similarity index 96% rename from apps/api/src/auth/session/session.middleware.ts rename to apps/api/src/features/auth/session/session.middleware.ts index e67c23c..80460d3 100644 --- a/apps/api/src/auth/session/session.middleware.ts +++ b/apps/api/src/features/auth/session/session.middleware.ts @@ -3,7 +3,7 @@ import connectPgSimple from 'connect-pg-simple'; import session, { type Store } from 'express-session'; import type { Pool } from 'pg'; -import type { Env } from '../../config/env-schema.js'; +import type { Env } from '../../../config/env-schema.js'; declare module 'express-session' { interface SessionData { diff --git a/apps/api/src/auth/session/session.routes.test.ts b/apps/api/src/features/auth/session/session.routes.test.ts similarity index 96% rename from apps/api/src/auth/session/session.routes.test.ts rename to apps/api/src/features/auth/session/session.routes.test.ts index 706b02e..f49c313 100644 --- a/apps/api/src/auth/session/session.routes.test.ts +++ b/apps/api/src/features/auth/session/session.routes.test.ts @@ -5,8 +5,8 @@ import request from 'supertest'; import { describe, expect, it, vi } from 'vitest'; import { z } from 'zod'; -import { createPublicUser } from '../../test/fixtures/public-user.fixture.js'; -import { testSessionConfiguration } from '../../test/fixtures/session-configuration.fixture.js'; +import { createPublicUser } from '../../../test/fixtures/public-user.fixture.js'; +import { testSessionConfiguration } from '../../../test/fixtures/session-configuration.fixture.js'; import { csrfErrorHandler, csrfProtection } from '../csrf/csrf.middleware.js'; import { createSessionMiddleware } from './session.middleware.js'; import { createSessionRouter } from './session.routes.js'; diff --git a/apps/api/src/auth/session/session.routes.ts b/apps/api/src/features/auth/session/session.routes.ts similarity index 100% rename from apps/api/src/auth/session/session.routes.ts rename to apps/api/src/features/auth/session/session.routes.ts diff --git a/apps/api/src/auth/user/current-user.service.test.ts b/apps/api/src/features/auth/user/current-user.service.test.ts similarity index 90% rename from apps/api/src/auth/user/current-user.service.test.ts rename to apps/api/src/features/auth/user/current-user.service.test.ts index f2be08b..673b2c2 100644 --- a/apps/api/src/auth/user/current-user.service.test.ts +++ b/apps/api/src/features/auth/user/current-user.service.test.ts @@ -2,8 +2,8 @@ import type { NodePgDatabase } from 'drizzle-orm/node-postgres'; import { describe, expect, it, vi } from 'vitest'; -import { users } from '../../db/schema/index.js'; -import { createPublicUser } from '../../test/fixtures/public-user.fixture.js'; +import { users } from '../../../db/schema/index.js'; +import { createPublicUser } from '../../../test/fixtures/public-user.fixture.js'; import { findPublicUserById } from './current-user.service.js'; describe('findPublicUserById', () => { diff --git a/apps/api/src/auth/user/current-user.service.ts b/apps/api/src/features/auth/user/current-user.service.ts similarity index 92% rename from apps/api/src/auth/user/current-user.service.ts rename to apps/api/src/features/auth/user/current-user.service.ts index f681863..3c6b99c 100644 --- a/apps/api/src/auth/user/current-user.service.ts +++ b/apps/api/src/features/auth/user/current-user.service.ts @@ -3,7 +3,7 @@ import type { PublicUser } from '@goforlift/contracts'; import { eq } from 'drizzle-orm'; import type { NodePgDatabase } from 'drizzle-orm/node-postgres'; -import { users } from '../../db/schema/index.js'; +import { users } from '../../../db/schema/index.js'; export async function findPublicUserById( database: NodePgDatabase, diff --git a/apps/api/src/exercises/exercise.routes.test.ts b/apps/api/src/features/exercises/exercise.routes.test.ts similarity index 90% rename from apps/api/src/exercises/exercise.routes.test.ts rename to apps/api/src/features/exercises/exercise.routes.test.ts index dd56374..91f11e8 100644 --- a/apps/api/src/exercises/exercise.routes.test.ts +++ b/apps/api/src/features/exercises/exercise.routes.test.ts @@ -5,8 +5,8 @@ import request from 'supertest'; import { describe, expect, it, vi } from 'vitest'; import { createSessionMiddleware } from '../auth/session/session.middleware.js'; -import { establishAuthenticatedTestSession } from '../test/authenticated-session.test-helper.js'; -import { testSessionConfiguration } from '../test/fixtures/session-configuration.fixture.js'; +import { establishAuthenticatedTestSession } from '../../test/authenticated-session.test-helper.js'; +import { testSessionConfiguration } from '../../test/fixtures/session-configuration.fixture.js'; import { createExerciseRouter } from './exercise.routes.js'; const userId = '26d34dc0-8e4c-4bd0-9e3b-7b839b44e486'; diff --git a/apps/api/src/exercises/exercise.routes.ts b/apps/api/src/features/exercises/exercise.routes.ts similarity index 100% rename from apps/api/src/exercises/exercise.routes.ts rename to apps/api/src/features/exercises/exercise.routes.ts diff --git a/apps/api/src/exercises/exercise.service.test.ts b/apps/api/src/features/exercises/exercise.service.test.ts similarity index 97% rename from apps/api/src/exercises/exercise.service.test.ts rename to apps/api/src/features/exercises/exercise.service.test.ts index c2d2ed6..5a370cd 100644 --- a/apps/api/src/exercises/exercise.service.test.ts +++ b/apps/api/src/features/exercises/exercise.service.test.ts @@ -2,7 +2,7 @@ import type { NodePgDatabase } from 'drizzle-orm/node-postgres'; import { describe, expect, it, vi } from 'vitest'; -import { exercises } from '../db/schema/index.js'; +import { exercises } from '../../db/schema/index.js'; import { listExercisesForUser } from './exercise.service.js'; describe('listExercisesForUser', () => { diff --git a/apps/api/src/exercises/exercise.service.ts b/apps/api/src/features/exercises/exercise.service.ts similarity index 93% rename from apps/api/src/exercises/exercise.service.ts rename to apps/api/src/features/exercises/exercise.service.ts index 13b801b..169d54f 100644 --- a/apps/api/src/exercises/exercise.service.ts +++ b/apps/api/src/features/exercises/exercise.service.ts @@ -3,7 +3,7 @@ import type { ExerciseSummary } from '@goforlift/contracts'; import { asc, eq, isNull, or } from 'drizzle-orm'; import type { NodePgDatabase } from 'drizzle-orm/node-postgres'; -import { exercises } from '../db/schema/index.js'; +import { exercises } from '../../db/schema/index.js'; export async function listExercisesForUser( database: NodePgDatabase, diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index b79740b..95556c3 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -6,19 +6,19 @@ import { createApp } from './app.js'; import { csrfErrorHandler, csrfProtection, -} from './auth/csrf/csrf.middleware.js'; +} from './features/auth/csrf/csrf.middleware.js'; import { createGoogleOidcRouter, discoverGoogleOidc, -} from './auth/google/google-oidc.routes.js'; -import { provisionGoogleUser } from './auth/google/google-user.service.js'; -import { createPostgresSession } from './auth/session/session.middleware.js'; -import { createSessionRouter } from './auth/session/session.routes.js'; -import { findPublicUserById } from './auth/user/current-user.service.js'; +} from './features/auth/google/google-oidc.routes.js'; +import { provisionGoogleUser } from './features/auth/google/google-user.service.js'; +import { createPostgresSession } from './features/auth/session/session.middleware.js'; +import { createSessionRouter } from './features/auth/session/session.routes.js'; +import { findPublicUserById } from './features/auth/user/current-user.service.js'; import { env } from './config/env.js'; import { createDatabase } from './db/client.js'; -import { createExerciseRouter } from './exercises/exercise.routes.js'; -import { listExercisesForUser } from './exercises/exercise.service.js'; +import { createExerciseRouter } from './features/exercises/exercise.routes.js'; +import { listExercisesForUser } from './features/exercises/exercise.service.js'; const { db, pool } = createDatabase(env.DATABASE_URL); const { middleware: sessionMiddleware, store: sessionStore } =