Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 18 additions & 10 deletions packages/backend/MIGRATION_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,19 @@ Node.js HTTP Server

---

## Phase 2: REST API Reimplementation (TODO)
## Phase 2: REST API Reimplementation (IN PROGRESS)

Reimplement Next.js REST APIs as GraphQL queries/mutations. Only endpoints that query our database - Aurora proxy routes stay in Next.js.

### 2.1 Board Configuration Queries (High Priority)

| REST Endpoint | GraphQL Operation | Status |
|---------------|-------------------|--------|
| `GET /api/v1/grades/[board_name]` | `Query.grades(boardName: String!)` | TODO |
| `GET /api/v1/angles/[board_name]/[layout_id]` | `Query.angles(boardName: String!, layoutId: Int!)` | TODO |
| `GET /api/v1/grades/[board_name]` | `Query.grades(boardName: String!)` | ✅ DONE |
| `GET /api/v1/angles/[board_name]/[layout_id]` | `Query.angles(boardName: String!, layoutId: Int!)` | ✅ DONE |
| N/A | `Query.layouts(boardName: String!)` | ✅ DONE |
| N/A | `Query.sizes(boardName: String!, layoutId: Int!)` | ✅ DONE |
| N/A | `Query.sets(boardName: String!, layoutId: Int!, sizeId: Int!)` | ✅ DONE |
| `GET /api/v1/[board_name]/[layout_id]/[size_id]/[set_ids]/details` | `Query.boardDetails(...)` | TODO |

**Source files:**
Expand All @@ -66,8 +69,8 @@ Reimplement Next.js REST APIs as GraphQL queries/mutations. Only endpoints that

| REST Endpoint | GraphQL Operation | Status |
|---------------|-------------------|--------|
| `GET /api/v1/[board_name]/.../search` | `Query.searchClimbs(input: ClimbSearchInput!)` | TODO |
| `GET /api/v1/[board_name]/.../[climb_uuid]` | `Query.climb(...)` | TODO |
| `GET /api/v1/[board_name]/.../search` | `Query.searchClimbs(input: ClimbSearchInput!)` | ✅ DONE |
| `GET /api/v1/[board_name]/.../[climb_uuid]` | `Query.climb(...)` | ✅ DONE |

**Medium Priority:**

Expand Down Expand Up @@ -120,10 +123,14 @@ Reimplement Next.js REST APIs as GraphQL queries/mutations. Only endpoints that

---

## Phase 3: Type Sharing (TODO)
## Phase 3: Type Sharing (PARTIAL)

Add new GraphQL types to `packages/shared-schema/src/schema.ts` and corresponding TypeScript types to `packages/shared-schema/src/types.ts`.

### Implemented Types
- `Grade`, `BoardAngle`, `Layout`, `Size`, `Set` - Board configuration types
- `ClimbSearchInput`, `ClimbSearchResult` - Climb search types

### New Types Needed

```graphql
Expand Down Expand Up @@ -176,10 +183,11 @@ type Favorite { climbUuid: String!, angle: Int! }
- [x] Verify WebSocket subscriptions work
- [x] Remove Express dependency

### Milestone 2: Core Queries (High Priority)
- [ ] Add new types to shared-schema
- [ ] Implement `grades`, `angles`, `boardDetails` queries
- [ ] Implement `searchClimbs`, `climb` queries
### Milestone 2: Core Queries (High Priority) - IN PROGRESS
- [x] Add new types to shared-schema
- [x] Implement `grades`, `angles`, `layouts`, `sizes`, `sets` queries
- [x] Implement `searchClimbs`, `climb` queries
- [ ] Implement `boardDetails` query (complex - requires hold/LED data)
- [ ] Implement `profile` query and `updateProfile` mutation
- [ ] Implement `auroraCredentials` queries/mutations

Expand Down
91 changes: 91 additions & 0 deletions packages/backend/src/db/tables.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// Table selection utility for backend
// Similar to packages/web/app/lib/db/queries/util/table-select.ts
import {
kilterClimbs,
kilterClimbStats,
kilterDifficultyGrades,
kilterProductSizes,
kilterLayouts,
kilterSets,
kilterProductSizesLayoutsSets,
kilterHoles,
kilterPlacements,
kilterLeds,
kilterProducts,
tensionClimbs,
tensionClimbStats,
tensionDifficultyGrades,
tensionProductSizes,
tensionLayouts,
tensionSets,
tensionProductSizesLayoutsSets,
tensionHoles,
tensionPlacements,
tensionLeds,
tensionProducts,
} from '@boardsesh/db/schema';

export type BoardName = 'kilter' | 'tension';

// Define the table structure
export type TableSet = {
climbs: typeof kilterClimbs | typeof tensionClimbs;
climbStats: typeof kilterClimbStats | typeof tensionClimbStats;
difficultyGrades: typeof kilterDifficultyGrades | typeof tensionDifficultyGrades;
productSizes: typeof kilterProductSizes | typeof tensionProductSizes;
layouts: typeof kilterLayouts | typeof tensionLayouts;
sets: typeof kilterSets | typeof tensionSets;
productSizesLayoutsSets: typeof kilterProductSizesLayoutsSets | typeof tensionProductSizesLayoutsSets;
holes: typeof kilterHoles | typeof tensionHoles;
placements: typeof kilterPlacements | typeof tensionPlacements;
leds: typeof kilterLeds | typeof tensionLeds;
products: typeof kilterProducts | typeof tensionProducts;
};

// Create a complete mapping of all tables
const BOARD_TABLES: Record<BoardName, TableSet> = {
kilter: {
climbs: kilterClimbs,
climbStats: kilterClimbStats,
difficultyGrades: kilterDifficultyGrades,
productSizes: kilterProductSizes,
layouts: kilterLayouts,
sets: kilterSets,
productSizesLayoutsSets: kilterProductSizesLayoutsSets,
holes: kilterHoles,
placements: kilterPlacements,
leds: kilterLeds,
products: kilterProducts,
},
tension: {
climbs: tensionClimbs,
climbStats: tensionClimbStats,
difficultyGrades: tensionDifficultyGrades,
productSizes: tensionProductSizes,
layouts: tensionLayouts,
sets: tensionSets,
productSizesLayoutsSets: tensionProductSizesLayoutsSets,
holes: tensionHoles,
placements: tensionPlacements,
leds: tensionLeds,
products: tensionProducts,
},
} as const;

/**
* Get all tables for a specific board
* @param boardName The board (kilter or tension)
* @returns All tables for the specified board
*/
export function getBoardTables(boardName: BoardName): TableSet {
return BOARD_TABLES[boardName];
}

/**
* Helper function to check if a board name is valid
* @param boardName The name to check
* @returns True if the board name is valid
*/
export function isValidBoardName(boardName: string): boardName is BoardName {
return boardName === 'kilter' || boardName === 'tension';
}
Loading
Loading