diff --git a/server/src/db/entities/Addons.entity.ts b/server/src/db/entities/Addons.entity.ts index 86a3ab240..98ee20ded 100644 --- a/server/src/db/entities/Addons.entity.ts +++ b/server/src/db/entities/Addons.entity.ts @@ -1,4 +1,5 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { AddonsRepository } from '../repositories/Addons.repository'; export interface AddonConfig { [key: string]: unknown; @@ -9,25 +10,23 @@ export class Addons { name!: string; description?: string | null; type: string & Opt = 'global'; - icon: string & Opt = 'Puzzle'; - enabled: boolean & Opt | null = false; - config: AddonConfig & Opt | null = {}; - sortOrder?: number | null = 0; + icon?: string | null = 'Puzzle'; + enabled?: boolean | null = false; + config?: AddonConfig | null; + sort_order?: number | null = 0; } -export class AddonsRepository extends EntityRepository{} - export const AddonsSchema = defineEntity({ class: Addons, repository: () => AddonsRepository, properties: { - id: p.text().primary(), + id: p.text().primary().nullable(), name: p.text(), description: p.text().nullable(), - type: p.text(), + type: p.text().default('global'), icon: p.text().nullable(), - enabled: p.boolean().nullable().default(false), - config: p.json().nullable(), - sortOrder: p.integer().nullable(), + enabled: p.boolean().nullable(), + config: p.json().nullable().default('{}'), + sort_order: p.integer().nullable(), }, }); diff --git a/server/src/db/entities/AppSettings.entity.ts b/server/src/db/entities/AppSettings.entity.ts index 930dbeea0..7baa7008a 100644 --- a/server/src/db/entities/AppSettings.entity.ts +++ b/server/src/db/entities/AppSettings.entity.ts @@ -1,4 +1,5 @@ -import { PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { AppSettingsRepository } from '../repositories/AppSettings.repository'; export class AppSettings { [PrimaryKeyProp]?: 'key'; @@ -6,8 +7,6 @@ export class AppSettings { value?: string | null; } -export class AppSettingsRepository extends EntityRepository {} - export const AppSettingsSchema = defineEntity({ class: AppSettings, repository: () => AppSettingsRepository, diff --git a/server/src/db/entities/AssignmentParticipants.entity.ts b/server/src/db/entities/AssignmentParticipants.entity.ts index e6ee66820..34f3d5916 100644 --- a/server/src/db/entities/AssignmentParticipants.entity.ts +++ b/server/src/db/entities/AssignmentParticipants.entity.ts @@ -1,21 +1,24 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { AssignmentParticipantsRepository } from '../repositories/AssignmentParticipants.repository'; import { DayAssignments } from './DayAssignments.entity'; import { Users } from './Users.entity'; export class AssignmentParticipants { - id?: number | null; + id!: number & Opt; assignment!: Ref; + assignment_id!: number; user!: Ref; + user_id!: number; } -export class AssignmentParticipantsRepository extends EntityRepository {} - export const AssignmentParticipantsSchema = defineEntity({ class: AssignmentParticipants, repository: () => AssignmentParticipantsRepository, properties: { - id: p.integer().primary().autoincrement(), - assignment: () => p.manyToOne(DayAssignments).ref().index('idx_assignment_participants_assignment'), - user: () => p.manyToOne(Users).ref(), + id: p.integer().primary(), + assignment: () => p.manyToOne(DayAssignments).ref().hidden().index('idx_assignment_participants_assignment'), + assignment_id: p.integer().persist(false).index('idx_assignment_participants_assignment'), + user: () => p.manyToOne(Users).ref().hidden(), + user_id: p.integer().persist(false), }, }); diff --git a/server/src/db/entities/AuditLog.entity.ts b/server/src/db/entities/AuditLog.entity.ts index 7c565ecda..91cd76b07 100644 --- a/server/src/db/entities/AuditLog.entity.ts +++ b/server/src/db/entities/AuditLog.entity.ts @@ -1,29 +1,27 @@ +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { AuditLogRepository } from '../repositories/AuditLog.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; -import { defineEntity, p, type Ref, EntityRepository } from '@mikro-orm/core'; export class AuditLog { - id?: number | null; - createdAt?: Date | null; + id!: number & Opt; + created_at?: string | null; user?: Ref | null; + user_id?: number | null; action!: string; resource?: string | null; details?: string | null; ip?: string | null; } -export class AuditLogRepository extends EntityRepository {} - export const AuditLogSchema = defineEntity({ class: AuditLog, repository: () => AuditLogRepository, properties: { - id: p.integer().primary().autoincrement(), - createdAt: p - .datetime() - .nullable() - .onCreate(() => new Date()) - .index('idx_audit_log_created'), - user: () => p.manyToOne(Users).ref().nullable(), + id: p.integer().primary(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`).index('idx_audit_log_created'), + user: () => p.manyToOne(Users).ref().nullable().hidden(), + user_id: p.integer().nullable().persist(false), action: p.text(), resource: p.text().nullable(), details: p.text().nullable(), diff --git a/server/src/db/entities/BucketList.entity.ts b/server/src/db/entities/BucketList.entity.ts index ca89da729..14ce30702 100644 --- a/server/src/db/entities/BucketList.entity.ts +++ b/server/src/db/entities/BucketList.entity.ts @@ -1,41 +1,43 @@ +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { BucketListRepository } from '../repositories/BucketList.repository'; +import { DbTimestampType } from '../types'; import { DawarichVisitSuggestions } from './DawarichVisitSuggestions.entity'; import { Users } from './Users.entity'; -import { Collection, defineEntity, p, type Ref, EntityRepository } from '@mikro-orm/core'; export class BucketList { - id?: number | null; + id!: number & Opt; user!: Ref; + user_id!: number; name!: string; - lat?: unknown | null; - lng?: unknown | null; - countryCode?: string | null; + lat?: number | null; + lng?: number | null; + country_code?: string | null; notes?: string | null; - createdAt?: Date | null; - targetDate?: string | null; - visitedAt?: string | null; - visitedSource?: string | null; - dawarichAcceptedBucketListItem = new Collection(this); - dawarichMatchedBucketListItem = new Collection(this); + created_at?: string | null; + target_date?: string | null; + visited_at?: string | null; + visited_source?: string | null; + dawarich_visit_suggestions_collection = new Collection(this); + dawarich_visit_suggestions_collection1 = new Collection(this); } -export class BucketListRepository extends EntityRepository {} - export const BucketListSchema = defineEntity({ class: BucketList, repository: () => BucketListRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), name: p.text(), lat: p.double().nullable(), lng: p.double().nullable(), - countryCode: p.text().nullable(), + country_code: p.text().nullable(), notes: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - targetDate: p.text().nullable(), - visitedAt: p.text().nullable(), - visitedSource: p.text().nullable(), - dawarichAcceptedBucketListItem: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('acceptedBucketListItem'), - dawarichMatchedBucketListItem: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('matchedBucketListItem'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + target_date: p.text().nullable().defaultRaw(`NULL`), + visited_at: p.text().nullable(), + visited_source: p.text().nullable(), + dawarich_visit_suggestions_collection: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('acceptedBucketListItem').hidden(), + dawarich_visit_suggestions_collection1: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('matchedBucketListItem').hidden(), }, }); diff --git a/server/src/db/entities/BudgetCategoryOrder.entity.ts b/server/src/db/entities/BudgetCategoryOrder.entity.ts index 119676ca6..a446c4a97 100644 --- a/server/src/db/entities/BudgetCategoryOrder.entity.ts +++ b/server/src/db/entities/BudgetCategoryOrder.entity.ts @@ -14,7 +14,7 @@ export const BudgetCategoryOrderSchema = defineEntity({ class: BudgetCategoryOrder, repository: () => BudgetCategoryOrderRepository, properties: { - trip: () => p.manyToOne(Trips).primary().ref().hidden().deleteRule('cascade'), + trip: () => p.manyToOne(Trips).primary().ref().deleteRule('cascade').hidden(), trip_id: p.integer().persist(false), category: p.text().primary(), sort_order: p.integer().default(0), diff --git a/server/src/db/entities/BudgetItemMembers.entity.ts b/server/src/db/entities/BudgetItemMembers.entity.ts index 537c6bf4c..72e56d513 100644 --- a/server/src/db/entities/BudgetItemMembers.entity.ts +++ b/server/src/db/entities/BudgetItemMembers.entity.ts @@ -1,25 +1,28 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { BudgetItemMembersRepository } from '../repositories/BudgetItemMembers.repository'; import { BudgetItems } from './BudgetItems.entity'; import { Users } from './Users.entity'; export class BudgetItemMembers { - id?: number | null; + id!: number & Opt; budgetItem!: Ref; + budget_item_id!: number; user!: Ref; + user_id!: number; paid: number & Opt = 0; - amount?: unknown | null; + amount?: number | null; } -export class BudgetItemMembersRepository extends EntityRepository {} - export const BudgetItemMembersSchema = defineEntity({ class: BudgetItemMembers, repository: () => BudgetItemMembersRepository, properties: { - id: p.integer().primary().autoincrement(), - budgetItem: () => p.manyToOne(BudgetItems).ref().deleteRule('cascade').index('idx_budget_item_members_item'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_budget_item_members_user'), - paid: p.integer(), + id: p.integer().primary(), + budgetItem: () => p.manyToOne(BudgetItems).ref().deleteRule('cascade').hidden().index('idx_budget_item_members_item'), + budget_item_id: p.integer().persist(false).index('idx_budget_item_members_item'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_budget_item_members_user'), + user_id: p.integer().persist(false).index('idx_budget_item_members_user'), + paid: p.integer().default(0), amount: p.double().nullable(), }, }); diff --git a/server/src/db/entities/BudgetItemPayers.entity.ts b/server/src/db/entities/BudgetItemPayers.entity.ts index b081ebc5d..89383d2cc 100644 --- a/server/src/db/entities/BudgetItemPayers.entity.ts +++ b/server/src/db/entities/BudgetItemPayers.entity.ts @@ -1,23 +1,26 @@ +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { BudgetItemPayersRepository } from '../repositories/BudgetItemPayers.repository'; import { BudgetItems } from './BudgetItems.entity'; import { Users } from './Users.entity'; -import { type Ref, defineEntity, p, Opt, EntityRepository } from '@mikro-orm/core'; export class BudgetItemPayers { - id?: number | null; + id!: number & Opt; budgetItem!: Ref; + budget_item_id!: number; user!: Ref; - amount: number & Opt = 0; + user_id!: number; + amount!: number & Opt; } -export class BudgetItemPayersRepository extends EntityRepository {} - export const BudgetItemPayersSchema = defineEntity({ class: BudgetItemPayers, repository: () => BudgetItemPayersRepository, properties: { - id: p.integer().primary().autoincrement(), - budgetItem: () => p.manyToOne(BudgetItems).ref().deleteRule('cascade').index('idx_budget_item_payers_item'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - amount: p.double().default(0), + id: p.integer().primary(), + budgetItem: () => p.manyToOne(BudgetItems).ref().deleteRule('cascade').hidden().index('idx_budget_item_payers_item'), + budget_item_id: p.integer().persist(false).index('idx_budget_item_payers_item'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + amount: p.double().defaultRaw(`0`), }, }); diff --git a/server/src/db/entities/BudgetItems.entity.ts b/server/src/db/entities/BudgetItems.entity.ts index 1a85ff13f..fa89de614 100644 --- a/server/src/db/entities/BudgetItems.entity.ts +++ b/server/src/db/entities/BudgetItems.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { BudgetItemsRepository } from '../repositories/BudgetItems.repository'; +import { DbTimestampType } from '../types'; import { BudgetItemMembers } from './BudgetItemMembers.entity'; import { BudgetItemPayers } from './BudgetItemPayers.entity'; import { FileLinks } from './FileLinks.entity'; @@ -8,53 +10,59 @@ import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class BudgetItems { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; category: string & Opt = 'Other'; name!: string; - totalPrice!: number & Opt; + total_price!: number & Opt; persons?: number | null = NaN; days?: number | null = NaN; note?: string | null; - sortOrder?: number | null = 0; - createdAt?: Date | null; + sort_order?: number | null = 0; + created_at?: string | null; paidByUser?: Ref | null; - expenseDate?: string | null; + paid_by_user_id?: number | null; + expense_date?: string | null; reservation?: Ref | null; + reservation_id?: number | null = NaN; currency?: string | null; - exchangeRate!: number & Opt; - ticketJson?: string | null; + exchange_rate!: number & Opt; + ticket_json?: string | null; place?: Ref | null; - budgetItemMembersCollection = new Collection(this); - budgetItemPayersCollection = new Collection(this); - fileLinksCollection = new Collection(this); + place_id?: number | null = NaN; + budget_item_members_collection = new Collection(this); + budget_item_payers_collection = new Collection(this); + file_links_collection = new Collection(this); } -export class BudgetItemsRepository extends EntityRepository {} - export const BudgetItemsSchema = defineEntity({ class: BudgetItems, repository: () => BudgetItemsRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_budget_items_trip_id'), - category: p.text(), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_budget_items_trip_id'), + trip_id: p.integer().persist(false).index('idx_budget_items_trip_id'), + category: p.text().default('Other'), name: p.text(), - totalPrice: p.double().default(0), - persons: p.integer().nullable(), - days: p.integer().nullable(), + total_price: p.double().defaultRaw(`0`), + persons: p.integer().nullable().defaultRaw(`NULL`), + days: p.integer().nullable().defaultRaw(`NULL`), note: p.text().nullable(), - sortOrder: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - paidByUser: () => p.manyToOne(Users).ref().nullable(), - expenseDate: p.text().nullable(), - reservation: () => p.manyToOne(Reservations).ref().nullable(), + sort_order: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + paidByUser: () => p.manyToOne(Users).ref().nullable().hidden(), + paid_by_user_id: p.integer().nullable().persist(false), + expense_date: p.text().nullable().defaultRaw(`NULL`), + reservation: () => p.manyToOne(Reservations).ref().nullable().hidden().defaultRaw(`NULL`), + reservation_id: p.integer().nullable().persist(false).defaultRaw(`NULL`), currency: p.text().nullable(), - exchangeRate: p.double().default(1), - ticketJson: p.text().nullable(), - place: () => p.manyToOne(Places).ref().nullable(), - budgetItemMembersCollection: () => p.oneToMany(BudgetItemMembers).mappedBy('budgetItem'), - budgetItemPayersCollection: () => p.oneToMany(BudgetItemPayers).mappedBy('budgetItem'), - fileLinksCollection: () => p.oneToMany(FileLinks).mappedBy('budgetItem'), + exchange_rate: p.double().defaultRaw(`1`), + ticket_json: p.text().nullable(), + place: () => p.manyToOne(Places).ref().nullable().hidden().defaultRaw(`NULL`), + place_id: p.integer().nullable().persist(false).defaultRaw(`NULL`), + budget_item_members_collection: () => p.oneToMany(BudgetItemMembers).mappedBy('budgetItem').hidden(), + budget_item_payers_collection: () => p.oneToMany(BudgetItemPayers).mappedBy('budgetItem').hidden(), + file_links_collection: () => p.oneToMany(FileLinks).mappedBy('budgetItem').hidden(), }, }); diff --git a/server/src/db/entities/BudgetSettlements.entity.ts b/server/src/db/entities/BudgetSettlements.entity.ts index 20e625cd0..4485d87e5 100644 --- a/server/src/db/entities/BudgetSettlements.entity.ts +++ b/server/src/db/entities/BudgetSettlements.entity.ts @@ -1,35 +1,43 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { BudgetSettlementsRepository } from '../repositories/BudgetSettlements.repository'; +import { DbTimestampType } from '../types'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class BudgetSettlements { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; fromUser!: Ref; + from_user_id!: number; toUser!: Ref; - amount!: number; - createdAt?: Date | null; + to_user_id!: number; + amount!: number & Opt; + created_at?: string | null; createdByUser?: Ref | null; + created_by_user_id?: number | null; currency?: string | null; - exchangeRate!: number; - settledAt?: string | null; + exchange_rate!: number & Opt; + settled_at?: string | null; } -export class BudgetSettlementsRepository extends EntityRepository {} - export const BudgetSettlementsSchema = defineEntity({ class: BudgetSettlements, repository: () => BudgetSettlementsRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_budget_settlements_trip'), - fromUser: () => p.manyToOne(Users).ref().deleteRule('cascade'), - toUser: () => p.manyToOne(Users).ref().deleteRule('cascade'), - amount: p.double().default(0), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - createdByUser: () => p.manyToOne(Users).ref().nullable(), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_budget_settlements_trip'), + trip_id: p.integer().persist(false).index('idx_budget_settlements_trip'), + fromUser: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + from_user_id: p.integer().persist(false), + toUser: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + to_user_id: p.integer().persist(false), + amount: p.double().defaultRaw(`0`), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + createdByUser: () => p.manyToOne(Users).ref().nullable().hidden(), + created_by_user_id: p.integer().nullable().persist(false), currency: p.text().nullable(), - exchangeRate: p.double().default(1), - settledAt: p.text().nullable(), + exchange_rate: p.double().defaultRaw(`1`), + settled_at: p.text().nullable(), }, }); diff --git a/server/src/db/entities/Categories.entity.ts b/server/src/db/entities/Categories.entity.ts index 5db9bc046..6c260ae11 100644 --- a/server/src/db/entities/Categories.entity.ts +++ b/server/src/db/entities/Categories.entity.ts @@ -1,32 +1,34 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CategoriesRepository } from '../repositories/Categories.repository'; +import { DbTimestampType } from '../types'; import { CollectionPlaces } from './CollectionPlaces.entity'; import { Places } from './Places.entity'; import { Users } from './Users.entity'; export class Categories { - id?: number | null; + id!: number & Opt; name!: string; color?: string | null = '#6366f1'; icon?: string | null = '📍'; user?: Ref | null; - createdAt?: Date | null; - collectionPlacesCollection = new Collection(this); - placesCollection = new Collection(this); + user_id?: number | null; + created_at?: string | null; + collection_places_collection = new Collection(this); + places_collection = new Collection(this); } -export class CategoriesRepository extends EntityRepository {} - export const CategoriesSchema = defineEntity({ class: Categories, repository: () => CategoriesRepository, properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), name: p.text(), color: p.text().nullable(), icon: p.text().nullable(), - user: () => p.manyToOne(Users).ref().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - collectionPlacesCollection: () => p.oneToMany(CollectionPlaces).mappedBy('category'), - placesCollection: () => p.oneToMany(Places).mappedBy('category'), + user: () => p.manyToOne(Users).ref().nullable().hidden(), + user_id: p.integer().nullable().persist(false), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + collection_places_collection: () => p.oneToMany(CollectionPlaces).mappedBy('category').hidden(), + places_collection: () => p.oneToMany(Places).mappedBy('category').hidden(), }, }); diff --git a/server/src/db/entities/CollabLinks.entity.ts b/server/src/db/entities/CollabLinks.entity.ts index 57754dfb7..90ed06725 100644 --- a/server/src/db/entities/CollabLinks.entity.ts +++ b/server/src/db/entities/CollabLinks.entity.ts @@ -1,31 +1,35 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollabLinksRepository } from '../repositories/CollabLinks.repository'; +import { DbTimestampType } from '../types'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class CollabLinks { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; user!: Ref; + user_id!: number; title!: string; url!: string; pinned?: number | null = 0; - createdAt?: Date | null; - updatedAt?: Date | null; + created_at?: string | null; + updated_at?: string | null; } -export class CollabLinksRepository extends EntityRepository {} - export const CollabLinksSchema = defineEntity({ class: CollabLinks, repository: () => CollabLinksRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_collab_links_trip'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_collab_links_trip'), + trip_id: p.integer().persist(false).index('idx_collab_links_trip'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), title: p.text(), url: p.text(), pinned: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/CollabMessageReactions.entity.ts b/server/src/db/entities/CollabMessageReactions.entity.ts index 0e6de0717..308253a68 100644 --- a/server/src/db/entities/CollabMessageReactions.entity.ts +++ b/server/src/db/entities/CollabMessageReactions.entity.ts @@ -1,25 +1,29 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollabMessageReactionsRepository } from '../repositories/CollabMessageReactions.repository'; +import { DbTimestampType } from '../types'; import { CollabMessages } from './CollabMessages.entity'; import { Users } from './Users.entity'; export class CollabMessageReactions { - id?: number | null; + id!: number & Opt; message!: Ref; + message_id!: number; user!: Ref; + user_id!: number; emoji!: string; - createdAt?: Date | null; + created_at?: string | null; } -export class CollabMessageReactionsRepository extends EntityRepository {} - export const CollabMessageReactionsSchema = defineEntity({ class: CollabMessageReactions, repository: () => CollabMessageReactionsRepository, properties: { - id: p.integer().primary().autoincrement(), - message: () => p.manyToOne(CollabMessages).ref().deleteRule('cascade').index('idx_collab_reactions_msg'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + message: () => p.manyToOne(CollabMessages).ref().deleteRule('cascade').hidden().index('idx_collab_reactions_msg'), + message_id: p.integer().persist(false).index('idx_collab_reactions_msg'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), emoji: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/CollabMessages.entity.ts b/server/src/db/entities/CollabMessages.entity.ts index d5a89b834..ed0570344 100644 --- a/server/src/db/entities/CollabMessages.entity.ts +++ b/server/src/db/entities/CollabMessages.entity.ts @@ -1,37 +1,43 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollabMessagesRepository } from '../repositories/CollabMessages.repository'; +import { DbTimestampType } from '../types'; import { CollabMessageReactions } from './CollabMessageReactions.entity'; import { TripFiles } from './TripFiles.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class CollabMessages { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; user!: Ref; + user_id!: number; text!: string; - replyTo?: Ref | null; - createdAt?: Date | null; + reply_to?: number | null; + created_at?: string | null; deleted?: number | null = 0; - collabMessageReactionsCollection = new Collection(this); - collabMessagesCollection = new Collection(this); - tripFilesCollection = new Collection(this); + replyToRef?: Ref | null; + collab_message_reactions_collection = new Collection(this); + collab_messages_collection = new Collection(this); + trip_files_collection = new Collection(this); } -export class CollabMessagesRepository extends EntityRepository {} - export const CollabMessagesSchema = defineEntity({ class: CollabMessages, repository: () => CollabMessagesRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_collab_messages_trip'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_collab_messages_trip'), + trip_id: p.integer().persist(false).index('idx_collab_messages_trip'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), text: p.text(), - replyTo: () => p.manyToOne(CollabMessages).ref().name('reply_to').nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + reply_to: p.integer().nullable().persist(false), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), deleted: p.integer().nullable(), - collabMessageReactionsCollection: () => p.oneToMany(CollabMessageReactions).mappedBy('message'), - collabMessagesCollection: () => p.oneToMany(CollabMessages).mappedBy('replyTo'), - tripFilesCollection: () => p.oneToMany(TripFiles).mappedBy('message'), + replyToRef: () => p.manyToOne(CollabMessages).ref().joinColumn('reply_to').nullable().hidden(), + collab_message_reactions_collection: () => p.oneToMany(CollabMessageReactions).mappedBy('message').hidden(), + collab_messages_collection: () => p.oneToMany(CollabMessages).mappedBy('replyToRef').hidden(), + trip_files_collection: () => p.oneToMany(TripFiles).mappedBy('message').hidden(), }, }); diff --git a/server/src/db/entities/CollabNotes.entity.ts b/server/src/db/entities/CollabNotes.entity.ts index b65b8ab08..6c226e047 100644 --- a/server/src/db/entities/CollabNotes.entity.ts +++ b/server/src/db/entities/CollabNotes.entity.ts @@ -1,40 +1,44 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollabNotesRepository } from '../repositories/CollabNotes.repository'; +import { DbTimestampType } from '../types'; import { TripFiles } from './TripFiles.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class CollabNotes { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; user!: Ref; + user_id!: number; category?: string | null = 'General'; title!: string; content?: string | null; color?: string | null = '#6366f1'; pinned?: number | null = 0; - createdAt?: Date | null; - updatedAt?: Date | null; + created_at?: string | null; + updated_at?: string | null; website?: string | null; - tripFilesCollection = new Collection(this); + trip_files_collection = new Collection(this); } -export class CollabNotesRepository extends EntityRepository {} - export const CollabNotesSchema = defineEntity({ class: CollabNotes, repository: () => CollabNotesRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_collab_notes_trip'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_collab_notes_trip'), + trip_id: p.integer().persist(false).index('idx_collab_notes_trip'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), category: p.text().nullable(), title: p.text(), content: p.text().nullable(), color: p.text().nullable(), pinned: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), website: p.text().nullable(), - tripFilesCollection: () => p.oneToMany(TripFiles).mappedBy('note'), + trip_files_collection: () => p.oneToMany(TripFiles).mappedBy('note').hidden(), }, }); diff --git a/server/src/db/entities/CollabPollVotes.entity.ts b/server/src/db/entities/CollabPollVotes.entity.ts index 3d6b626ef..32ad47ba2 100644 --- a/server/src/db/entities/CollabPollVotes.entity.ts +++ b/server/src/db/entities/CollabPollVotes.entity.ts @@ -1,25 +1,29 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollabPollVotesRepository } from '../repositories/CollabPollVotes.repository'; +import { DbTimestampType } from '../types'; import { CollabPolls } from './CollabPolls.entity'; import { Users } from './Users.entity'; export class CollabPollVotes { - id?: number | null; + id!: number & Opt; poll!: Ref; + poll_id!: number; user!: Ref; - optionIndex!: number; - createdAt?: Date | null; + user_id!: number; + option_index!: number; + created_at?: string | null; } -export class CollabPollVotesRepository extends EntityRepository {} - export const CollabPollVotesSchema = defineEntity({ class: CollabPollVotes, repository: () => CollabPollVotesRepository, properties: { - id: p.integer().primary().autoincrement(), - poll: () => p.manyToOne(CollabPolls).ref().deleteRule('cascade'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - optionIndex: p.integer(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + poll: () => p.manyToOne(CollabPolls).ref().deleteRule('cascade').hidden(), + poll_id: p.integer().persist(false), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + option_index: p.integer(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/CollabPolls.entity.ts b/server/src/db/entities/CollabPolls.entity.ts index a7f6d55c8..04a8dd6d5 100644 --- a/server/src/db/entities/CollabPolls.entity.ts +++ b/server/src/db/entities/CollabPolls.entity.ts @@ -1,36 +1,40 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollabPollsRepository } from '../repositories/CollabPolls.repository'; +import { DbTimestampType } from '../types'; import { CollabPollVotes } from './CollabPollVotes.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class CollabPolls { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; user!: Ref; + user_id!: number; question!: string; options!: string; multiple?: number | null = 0; closed?: number | null = 0; deadline?: string | null; - createdAt?: Date | null; - collabPollVotesCollection = new Collection(this); + created_at?: string | null; + collab_poll_votes_collection = new Collection(this); } -export class CollabPollsRepository extends EntityRepository {} - export const CollabPollsSchema = defineEntity({ class: CollabPolls, repository: () => CollabPollsRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_collab_polls_trip'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_collab_polls_trip'), + trip_id: p.integer().persist(false).index('idx_collab_polls_trip'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), question: p.text(), options: p.text(), multiple: p.integer().nullable(), closed: p.integer().nullable(), deadline: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - collabPollVotesCollection: () => p.oneToMany(CollabPollVotes).mappedBy('poll'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + collab_poll_votes_collection: () => p.oneToMany(CollabPollVotes).mappedBy('poll').hidden(), }, }); diff --git a/server/src/db/entities/CollectionLabels.entity.ts b/server/src/db/entities/CollectionLabels.entity.ts index 10bc043e6..09cd1ff94 100644 --- a/server/src/db/entities/CollectionLabels.entity.ts +++ b/server/src/db/entities/CollectionLabels.entity.ts @@ -1,29 +1,31 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollectionLabelsRepository } from '../repositories/CollectionLabels.repository'; +import { DbTimestampType } from '../types'; import { CollectionPlaces } from './CollectionPlaces.entity'; import { Collections } from './Collections.entity'; export class CollectionLabels { - id?: number | null; + id!: number & Opt; collection!: Ref; + collection_id!: number; name!: string; color?: string | null = '#6366f1'; - sortOrder?: number | null = 0; - createdAt?: Date | null; - collectionPlaceLabelsInverse = new Collection(this); + sort_order?: number | null = 0; + created_at?: string | null; + collection_place_labels_inverse = new Collection(this); } -export class CollectionLabelsRepository extends EntityRepository {} - export const CollectionLabelsSchema = defineEntity({ class: CollectionLabels, repository: () => CollectionLabelsRepository, properties: { - id: p.integer().primary().autoincrement(), - collection: () => p.manyToOne(Collections).ref().deleteRule('cascade').index('idx_collection_labels_collection'), + id: p.integer().primary(), + collection: () => p.manyToOne(Collections).ref().deleteRule('cascade').hidden().index('idx_collection_labels_collection'), + collection_id: p.integer().persist(false).index('idx_collection_labels_collection'), name: p.text(), color: p.text().nullable(), - sortOrder: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - collectionPlaceLabelsInverse: () => p.manyToMany(CollectionPlaces).mappedBy('collectionPlaceLabels'), + sort_order: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + collection_place_labels_inverse: () => p.manyToMany(CollectionPlaces).mappedBy('collection_place_labels').hidden(), }, }); diff --git a/server/src/db/entities/CollectionMembers.entity.ts b/server/src/db/entities/CollectionMembers.entity.ts index 8217e38e4..bab1a78f6 100644 --- a/server/src/db/entities/CollectionMembers.entity.ts +++ b/server/src/db/entities/CollectionMembers.entity.ts @@ -1,27 +1,31 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollectionMembersRepository } from '../repositories/CollectionMembers.repository'; +import { DbTimestampType } from '../types'; import { Collections } from './Collections.entity'; import { Users } from './Users.entity'; export class CollectionMembers { - id?: number | null; + id!: number & Opt; collection!: Ref; + collection_id!: number; user!: Ref; + user_id!: number; status: string & Opt = 'pending'; role: string & Opt = 'editor'; - createdAt?: Date | null; + created_at?: string | null; } -export class CollectionMembersRepository extends EntityRepository {} - export const CollectionMembersSchema = defineEntity({ class: CollectionMembers, repository: () => CollectionMembersRepository, properties: { - id: p.integer().primary().autoincrement(), - collection: () => p.manyToOne(Collections).ref().deleteRule('cascade'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_collection_members_user'), - status: p.text(), - role: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + collection: () => p.manyToOne(Collections).ref().deleteRule('cascade').hidden(), + collection_id: p.integer().persist(false), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_collection_members_user'), + user_id: p.integer().persist(false).index('idx_collection_members_user'), + status: p.text().default('pending'), + role: p.text().default('editor'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/CollectionPlaceRatings.entity.ts b/server/src/db/entities/CollectionPlaceRatings.entity.ts index e8f136e3a..c919ab985 100644 --- a/server/src/db/entities/CollectionPlaceRatings.entity.ts +++ b/server/src/db/entities/CollectionPlaceRatings.entity.ts @@ -1,25 +1,29 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollectionPlaceRatingsRepository } from '../repositories/CollectionPlaceRatings.repository'; +import { DbTimestampType } from '../types'; import { CollectionPlaces } from './CollectionPlaces.entity'; import { Users } from './Users.entity'; export class CollectionPlaceRatings { - id?: number | null; + id!: number & Opt; collectionPlace!: Ref; + collection_place_id!: number; user!: Ref; + user_id!: number; rating!: number; - createdAt?: Date | null; + created_at?: string | null; } -export class CollectionPlaceRatingsRepository extends EntityRepository {} - export const CollectionPlaceRatingsSchema = defineEntity({ class: CollectionPlaceRatings, repository: () => CollectionPlaceRatingsRepository, properties: { - id: p.integer().primary().autoincrement(), - collectionPlace: () => p.manyToOne(CollectionPlaces).ref().deleteRule('cascade').index('idx_collection_place_ratings_place'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + collectionPlace: () => p.manyToOne(CollectionPlaces).ref().deleteRule('cascade').hidden().index('idx_collection_place_ratings_place'), + collection_place_id: p.integer().persist(false).index('idx_collection_place_ratings_place'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), rating: p.integer(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/CollectionPlaces.entity.ts b/server/src/db/entities/CollectionPlaces.entity.ts index 5d3a41839..1db81cf5e 100644 --- a/server/src/db/entities/CollectionPlaces.entity.ts +++ b/server/src/db/entities/CollectionPlaces.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollectionPlacesRepository } from '../repositories/CollectionPlaces.repository'; +import { DbTimestampType } from '../types'; import { Categories } from './Categories.entity'; import { CollectionLabels } from './CollectionLabels.entity'; import { CollectionPlaceRatings } from './CollectionPlaceRatings.entity'; @@ -7,71 +9,77 @@ import { Tags } from './Tags.entity'; import { Users } from './Users.entity'; export class CollectionPlaces { - id?: number | null; + id!: number & Opt; collection!: Ref; + collection_id!: number; owner!: Ref; - savedBy?: Ref | null; + owner_id!: number; + saved_by?: number | null; name!: string; description?: string | null; - lat?: unknown | null; - lng?: unknown | null; + lat?: number | null; + lng?: number | null; address?: string | null; category?: Ref | null; - price?: unknown | null; + category_id?: number | null; + price?: number | null; currency?: string | null; notes?: string | null; - imageUrl?: string | null; - googlePlaceId?: string | null; - googleFtid?: string | null; - osmId?: string | null; + image_url?: string | null; + google_place_id?: string | null; + google_ftid?: string | null; + osm_id?: string | null; website?: string | null; phone?: string | null; status: string & Opt = 'idea'; - sourceTripId?: number | null; - sourcePlaceId?: number | null; + source_trip_id?: number | null; + source_place_id?: number | null; links?: string | null; - sortOrder?: number | null = 0; - createdAt?: Date | null; - updatedAt?: Date | null; - collectionPlaceLabels = new Collection(this); - collectionPlaceTags = new Collection(this); - collectionPlaceRatingsCollection = new Collection(this); + sort_order?: number | null = 0; + created_at?: string | null; + updated_at?: string | null; + savedByRef?: Ref | null; + collection_place_labels = new Collection(this); + collection_place_tags = new Collection(this); + collection_place_ratings_collection = new Collection(this); } -export class CollectionPlacesRepository extends EntityRepository {} - export const CollectionPlacesSchema = defineEntity({ class: CollectionPlaces, repository: () => CollectionPlacesRepository, properties: { - id: p.integer().primary().autoincrement(), - collection: () => p.manyToOne(Collections).ref().deleteRule('cascade').index('idx_collection_places_collection'), - owner: () => p.manyToOne(Users).ref().deleteRule('cascade'), - savedBy: () => p.manyToOne(Users).ref().name('saved_by').nullable(), + id: p.integer().primary(), + collection: () => p.manyToOne(Collections).ref().deleteRule('cascade').hidden().index('idx_collection_places_collection'), + collection_id: p.integer().persist(false).index('idx_collection_places_collection'), + owner: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + owner_id: p.integer().persist(false), + saved_by: p.integer().nullable().persist(false), name: p.text(), description: p.text().nullable(), lat: p.double().nullable(), lng: p.double().nullable(), address: p.text().nullable(), - category: () => p.manyToOne(Categories).ref().nullable(), + category: () => p.manyToOne(Categories).ref().nullable().hidden(), + category_id: p.integer().nullable().persist(false), price: p.double().nullable(), currency: p.text().nullable(), notes: p.text().nullable(), - imageUrl: p.text().nullable(), - googlePlaceId: p.text().nullable(), - googleFtid: p.text().nullable(), - osmId: p.text().nullable(), + image_url: p.text().nullable(), + google_place_id: p.text().nullable(), + google_ftid: p.text().nullable(), + osm_id: p.text().nullable(), website: p.text().nullable(), phone: p.text().nullable(), - status: p.text(), - sourceTripId: p.integer().nullable(), - sourcePlaceId: p.integer().nullable(), + status: p.text().default('idea'), + source_trip_id: p.integer().nullable(), + source_place_id: p.integer().nullable(), links: p.text().nullable(), - sortOrder: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), - collectionPlaceLabels: () => p.manyToMany(CollectionLabels).pivotTable('collection_place_labels').joinColumn('collection_place_id').inverseJoinColumn('label_id'), - collectionPlaceTags: () => p.manyToMany(Tags).pivotTable('collection_place_tags').joinColumn('collection_place_id').inverseJoinColumn('tag_id'), - collectionPlaceRatingsCollection: () => p.oneToMany(CollectionPlaceRatings).mappedBy('collectionPlace'), + sort_order: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + savedByRef: () => p.manyToOne(Users).ref().joinColumn('saved_by').nullable().hidden(), + collection_place_labels: () => p.manyToMany(CollectionLabels).pivotTable('collection_place_labels').joinColumn('collection_place_id').inverseJoinColumn('label_id').hidden(), + collection_place_tags: () => p.manyToMany(Tags).pivotTable('collection_place_tags').joinColumn('collection_place_id').inverseJoinColumn('tag_id').hidden(), + collection_place_ratings_collection: () => p.oneToMany(CollectionPlaceRatings).mappedBy('collectionPlace').hidden(), }, }); diff --git a/server/src/db/entities/Collections.entity.ts b/server/src/db/entities/Collections.entity.ts index d726d9b16..78de4a129 100644 --- a/server/src/db/entities/Collections.entity.ts +++ b/server/src/db/entities/Collections.entity.ts @@ -1,45 +1,47 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { CollectionsRepository } from '../repositories/Collections.repository'; +import { DbTimestampType } from '../types'; import { CollectionLabels } from './CollectionLabels.entity'; import { CollectionMembers } from './CollectionMembers.entity'; import { CollectionPlaces } from './CollectionPlaces.entity'; import { Users } from './Users.entity'; export class Collections { - id?: number | null; + id!: number & Opt; owner!: Ref; + owner_id!: number; name!: string; description?: string | null; color?: string | null = '#6366f1'; icon?: string | null = 'Bookmark'; - coverImage?: string | null; + cover_image?: string | null; links?: string | null; - sortOrder?: number | null = 0; - createdAt?: Date | null; - updatedAt?: Date | null; - collectionLabelsCollection = new Collection(this); - collectionMembersCollection = new Collection(this); - collectionPlacesCollection = new Collection(this); + sort_order?: number | null = 0; + created_at?: string | null; + updated_at?: string | null; + collection_labels_collection = new Collection(this); + collection_members_collection = new Collection(this); + collection_places_collection = new Collection(this); } -export class CollectionsRepository extends EntityRepository {} - export const CollectionsSchema = defineEntity({ class: Collections, repository: () => CollectionsRepository, properties: { - id: p.integer().primary().autoincrement(), - owner: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + owner: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + owner_id: p.integer().persist(false), name: p.text(), description: p.text().nullable(), color: p.text().nullable(), icon: p.text().nullable(), - coverImage: p.text().nullable(), + cover_image: p.text().nullable(), links: p.text().nullable(), - sortOrder: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), - collectionLabelsCollection: () => p.oneToMany(CollectionLabels).mappedBy('collection'), - collectionMembersCollection: () => p.oneToMany(CollectionMembers).mappedBy('collection'), - collectionPlacesCollection: () => p.oneToMany(CollectionPlaces).mappedBy('collection'), + sort_order: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + collection_labels_collection: () => p.oneToMany(CollectionLabels).mappedBy('collection').hidden(), + collection_members_collection: () => p.oneToMany(CollectionMembers).mappedBy('collection').hidden(), + collection_places_collection: () => p.oneToMany(CollectionPlaces).mappedBy('collection').hidden(), }, }); diff --git a/server/src/db/entities/DawarichConnections.entity.ts b/server/src/db/entities/DawarichConnections.entity.ts index 3af723fc1..a2892da0f 100644 --- a/server/src/db/entities/DawarichConnections.entity.ts +++ b/server/src/db/entities/DawarichConnections.entity.ts @@ -1,37 +1,39 @@ -import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { DawarichConnectionsRepository } from '../repositories/DawarichConnections.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class DawarichConnections { [PrimaryKeyProp]?: 'user'; user?: Ref | null; + user_id?: number | null; url?: string | null; - apiKey?: string | null; - allowInsecureTls: number & Opt = 0; - syncEnabled: number & Opt = 1; - lastSyncAt?: string | null; - lastSyncState: string & Opt = 'never'; - lastSyncError?: string | null; + api_key?: string | null; + allow_insecure_tls: number & Opt = 0; + sync_enabled: number & Opt = 1; + last_sync_at?: string | null; + last_sync_state: string & Opt = 'never'; + last_sync_error?: string | null; capabilities?: string | null; - createdAt?: Date | null; - updatedAt?: Date | null; + created_at?: string | null; + updated_at?: string | null; } -export class DawarichConnectionsRepository extends EntityRepository {} - export const DawarichConnectionsSchema = defineEntity({ class: DawarichConnections, repository: () => DawarichConnectionsRepository, properties: { - user: () => p.oneToOne(Users).primary().ref().nullable(), + user: () => p.oneToOne(Users).primary().ref().nullable().hidden(), + user_id: p.integer().nullable().persist(false), url: p.text().nullable(), - apiKey: p.text().nullable(), - allowInsecureTls: p.integer(), - syncEnabled: p.integer(), - lastSyncAt: p.text().nullable(), - lastSyncState: p.text(), - lastSyncError: p.text().nullable(), + api_key: p.text().nullable(), + allow_insecure_tls: p.integer().default(0), + sync_enabled: p.integer().default(1), + last_sync_at: p.text().nullable(), + last_sync_state: p.text().default('never'), + last_sync_error: p.text().nullable(), capabilities: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/DawarichVisitSuggestions.entity.ts b/server/src/db/entities/DawarichVisitSuggestions.entity.ts index b1a5c0949..2a0095669 100644 --- a/server/src/db/entities/DawarichVisitSuggestions.entity.ts +++ b/server/src/db/entities/DawarichVisitSuggestions.entity.ts @@ -1,70 +1,84 @@ +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { DawarichVisitSuggestionsRepository } from '../repositories/DawarichVisitSuggestions.repository'; import { BucketList } from './BucketList.entity'; import { Places } from './Places.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; -import { defineEntity, EntityRepository, type Opt, p, type Ref } from '@mikro-orm/core'; export class DawarichVisitSuggestions { - id?: number | null; + id!: number & Opt; user!: Ref; - sourceVisitId!: string; + user_id!: number; + source_visit_id!: string; trip?: Ref | null; + trip_id?: number | null; name!: string; - lat?: unknown | null; - lng?: unknown | null; - startedAt!: string; - endedAt!: string; - durationMinutes: number & Opt = 0; - localDate!: string; - sourceStatus: string & Opt = 'suggested'; - confidence?: unknown | null; - confidenceBand?: string | null; - countryCode?: string | null; + lat?: number | null; + lng?: number | null; + started_at!: string; + ended_at!: string; + duration_minutes: number & Opt = 0; + local_date!: string; + source_status: string & Opt = 'suggested'; + confidence?: number | null; + confidence_band?: string | null; + country_code?: string | null; state: string & Opt = 'new'; target?: string | null; acceptedPlace?: Ref | null; - acceptedJournalEntryId?: number | null; + accepted_place_id?: number | null; + accepted_journal_entry_id?: number | null; acceptedBucketListItem?: Ref | null; + accepted_bucket_list_item_id?: number | null; matchedBucketListItem?: Ref | null; - sourceHash!: string; - acceptedHash?: string | null; - sourceMissingAt?: string | null; - firstSeenAt!: string & Opt; - lastSeenAt!: string & Opt; + matched_bucket_list_item_id?: number | null; + source_hash!: string; + accepted_hash?: string | null; + source_missing_at?: string | null; + first_seen_at!: string & Opt; + last_seen_at!: string & Opt; } -export class DawarichVisitSuggestionsRepository extends EntityRepository {} - export const DawarichVisitSuggestionsSchema = defineEntity({ class: DawarichVisitSuggestions, repository: () => DawarichVisitSuggestionsRepository, - indexes: [{ name: 'idx_dawarich_suggestions_user_state', properties: ['user', 'state'] }], + indexes: [ + { + name: 'idx_dawarich_suggestions_user_state', + properties: ['user_id', 'state'], + }, + ], properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - sourceVisitId: p.text(), - trip: () => p.manyToOne(Trips).ref().nullable().index('idx_dawarich_suggestions_trip'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + source_visit_id: p.text(), + trip: () => p.manyToOne(Trips).ref().nullable().hidden().index('idx_dawarich_suggestions_trip'), + trip_id: p.integer().nullable().persist(false).index('idx_dawarich_suggestions_trip'), name: p.text(), lat: p.double().nullable(), lng: p.double().nullable(), - startedAt: p.text(), - endedAt: p.text(), - durationMinutes: p.integer(), - localDate: p.text(), - sourceStatus: p.text(), + started_at: p.text(), + ended_at: p.text(), + duration_minutes: p.integer().default(0), + local_date: p.text(), + source_status: p.text().default('suggested'), confidence: p.double().nullable(), - confidenceBand: p.text().nullable(), - countryCode: p.text().nullable(), - state: p.text(), + confidence_band: p.text().nullable(), + country_code: p.text().nullable(), + state: p.text().default('new'), target: p.text().nullable(), - acceptedPlace: () => p.manyToOne(Places).ref().nullable(), - acceptedJournalEntryId: p.integer().nullable(), - acceptedBucketListItem: () => p.manyToOne(BucketList).ref().nullable(), - matchedBucketListItem: () => p.manyToOne(BucketList).ref().nullable(), - sourceHash: p.text(), - acceptedHash: p.text().nullable(), - sourceMissingAt: p.text().nullable(), - firstSeenAt: p.text().onCreate(() => new Date().toISOString().replace(/\.\d{3}Z$/, 'Z')), - lastSeenAt: p.text().onCreate(() => new Date().toISOString().replace(/\.\d{3}Z$/, 'Z')), + acceptedPlace: () => p.manyToOne(Places).ref().nullable().hidden(), + accepted_place_id: p.integer().nullable().persist(false), + accepted_journal_entry_id: p.integer().nullable(), + acceptedBucketListItem: () => p.manyToOne(BucketList).ref().nullable().hidden(), + accepted_bucket_list_item_id: p.integer().nullable().persist(false), + matchedBucketListItem: () => p.manyToOne(BucketList).ref().nullable().hidden(), + matched_bucket_list_item_id: p.integer().nullable().persist(false), + source_hash: p.text(), + accepted_hash: p.text().nullable(), + source_missing_at: p.text().nullable(), + first_seen_at: p.text().defaultRaw(`CURRENT_TIMESTAMP`), + last_seen_at: p.text().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/DayAccommodations.entity.ts b/server/src/db/entities/DayAccommodations.entity.ts index 39082a147..a4ca29534 100644 --- a/server/src/db/entities/DayAccommodations.entity.ts +++ b/server/src/db/entities/DayAccommodations.entity.ts @@ -1,38 +1,46 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { DayAccommodationsRepository } from '../repositories/DayAccommodations.repository'; +import { DbTimestampType } from '../types'; import { Days } from './Days.entity'; import { Places } from './Places.entity'; import { Trips } from './Trips.entity'; export class DayAccommodations { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; place?: Ref | null; + place_id?: number | null; startDay!: Ref; + start_day_id!: number; endDay!: Ref; - checkIn?: string | null; - checkInEnd?: string | null; - checkOut?: string | null; + end_day_id!: number; + check_in?: string | null; + check_in_end?: string | null; + check_out?: string | null; confirmation?: string | null; notes?: string | null; - createdAt?: Date | null; + created_at?: string | null; } -export class DayAccommodationsRepository extends EntityRepository {} - export const DayAccommodationsSchema = defineEntity({ class: DayAccommodations, repository: () => DayAccommodationsRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_day_accommodations_trip_id'), - place: () => p.manyToOne(Places).ref().nullable(), - startDay: () => p.manyToOne(Days).ref().deleteRule('cascade').index('idx_day_accommodations_start_day_id'), - endDay: () => p.manyToOne(Days).ref().deleteRule('cascade').index('idx_day_accommodations_end_day_id'), - checkIn: p.text().nullable(), - checkInEnd: p.text().nullable(), - checkOut: p.text().nullable(), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_day_accommodations_trip_id'), + trip_id: p.integer().persist(false).index('idx_day_accommodations_trip_id'), + place: () => p.manyToOne(Places).ref().nullable().hidden(), + place_id: p.integer().nullable().persist(false), + startDay: () => p.manyToOne(Days).ref().deleteRule('cascade').hidden().index('idx_day_accommodations_start_day_id'), + start_day_id: p.integer().persist(false).index('idx_day_accommodations_start_day_id'), + endDay: () => p.manyToOne(Days).ref().deleteRule('cascade').hidden().index('idx_day_accommodations_end_day_id'), + end_day_id: p.integer().persist(false).index('idx_day_accommodations_end_day_id'), + check_in: p.text().nullable(), + check_in_end: p.text().nullable(), + check_out: p.text().nullable(), confirmation: p.text().nullable(), notes: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/DayAssignments.entity.ts b/server/src/db/entities/DayAssignments.entity.ts index 95b900b16..51dfdaf37 100644 --- a/server/src/db/entities/DayAssignments.entity.ts +++ b/server/src/db/entities/DayAssignments.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { DayAssignmentsRepository } from '../repositories/DayAssignments.repository'; +import { DbTimestampType } from '../types'; import { AssignmentParticipants } from './AssignmentParticipants.entity'; import { Days } from './Days.entity'; import { FileLinks } from './FileLinks.entity'; @@ -7,53 +9,55 @@ import { Reservations } from './Reservations.entity'; import { RoadtripDayBoundaries } from './RoadtripDayBoundaries.entity'; export class DayAssignments { - id?: number | null; + id!: number & Opt; day!: Ref; + day_id!: number; place!: Ref; - orderIndex?: number | null = 0; + place_id!: number; + order_index?: number | null = 0; notes?: string | null; - reservationStatus?: string | null = 'none'; - reservationNotes?: string | null; - reservationDatetime?: string | null; - createdAt?: Date | null; - assignmentTime?: string | null; - assignmentEndTime?: string | null; - legTransportMode?: string | null; - incomingLegTransportMode?: string | null; - endDay: number & Opt = 0; - accommodationId?: number | null; - assignmentParticipantsCollection = new Collection(this); - fileLinksCollection = new Collection(this); - reservationsCollection = new Collection(this); - roadtripDayBoundariesCollection = new Collection(this); - roadtripDayBoundariesCollection1 = new Collection(this); + reservation_status?: string | null = 'none'; + reservation_notes?: string | null; + reservation_datetime?: string | null; + created_at?: string | null; + assignment_time?: string | null; + assignment_end_time?: string | null; + leg_transport_mode?: string | null; + incoming_leg_transport_mode?: string | null; + end_day: number & Opt = 0; + accommodation_id?: number | null; + assignment_participants_collection = new Collection(this); + file_links_collection = new Collection(this); + reservations_collection = new Collection(this); + roadtrip_day_boundaries_collection = new Collection(this); + roadtrip_day_boundaries_collection1 = new Collection(this); } -export class DayAssignmentsRepository extends EntityRepository {} - export const DayAssignmentsSchema = defineEntity({ class: DayAssignments, repository: () => DayAssignmentsRepository, properties: { - id: p.integer().primary().autoincrement(), - day: () => p.manyToOne(Days).ref().deleteRule('cascade').index('idx_day_assignments_day_id'), - place: () => p.manyToOne(Places).ref().deleteRule('cascade').index('idx_day_assignments_place_id'), - orderIndex: p.integer().nullable(), + id: p.integer().primary(), + day: () => p.manyToOne(Days).ref().deleteRule('cascade').hidden().index('idx_day_assignments_day_id'), + day_id: p.integer().persist(false).index('idx_day_assignments_day_id'), + place: () => p.manyToOne(Places).ref().deleteRule('cascade').hidden().index('idx_day_assignments_place_id'), + place_id: p.integer().persist(false).index('idx_day_assignments_place_id'), + order_index: p.integer().nullable(), notes: p.text().nullable(), - reservationStatus: p.text().nullable(), - reservationNotes: p.text().nullable(), - reservationDatetime: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - assignmentTime: p.text().nullable(), - assignmentEndTime: p.text().nullable(), - legTransportMode: p.text().nullable(), - incomingLegTransportMode: p.text().nullable(), - endDay: p.integer(), - accommodationId: p.integer().nullable().index('idx_day_assignments_accommodation_id'), - assignmentParticipantsCollection: () => p.oneToMany(AssignmentParticipants).mappedBy('assignment'), - fileLinksCollection: () => p.oneToMany(FileLinks).mappedBy('assignment'), - reservationsCollection: () => p.oneToMany(Reservations).mappedBy('assignment'), - roadtripDayBoundariesCollection: () => p.oneToMany(RoadtripDayBoundaries).mappedBy('fromAssignment'), - roadtripDayBoundariesCollection1: () => p.oneToMany(RoadtripDayBoundaries).mappedBy('toAssignment'), + reservation_status: p.text().nullable(), + reservation_notes: p.text().nullable(), + reservation_datetime: p.text().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + assignment_time: p.text().nullable(), + assignment_end_time: p.text().nullable(), + leg_transport_mode: p.text().nullable(), + incoming_leg_transport_mode: p.text().nullable(), + end_day: p.integer().default(0), + accommodation_id: p.integer().nullable().index('idx_day_assignments_accommodation_id'), + assignment_participants_collection: () => p.oneToMany(AssignmentParticipants).mappedBy('assignment').hidden(), + file_links_collection: () => p.oneToMany(FileLinks).mappedBy('assignment').hidden(), + reservations_collection: () => p.oneToMany(Reservations).mappedBy('assignment').hidden(), + roadtrip_day_boundaries_collection: () => p.oneToMany(RoadtripDayBoundaries).mappedBy('fromAssignment').hidden(), + roadtrip_day_boundaries_collection1: () => p.oneToMany(RoadtripDayBoundaries).mappedBy('toAssignment').hidden(), }, }); diff --git a/server/src/db/entities/DayNotes.entity.ts b/server/src/db/entities/DayNotes.entity.ts index 51c28f3fc..11939d140 100644 --- a/server/src/db/entities/DayNotes.entity.ts +++ b/server/src/db/entities/DayNotes.entity.ts @@ -1,11 +1,11 @@ -import { type Ref, defineEntity, p } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; import { DayNotesRepository } from '../repositories/DayNotes.repository'; import { DbTimestampType } from '../types'; import { Days } from './Days.entity'; import { Trips } from './Trips.entity'; export class DayNotes { - id?: number | null; + id!: number & Opt; day!: Ref; day_id!: number; trip!: Ref; @@ -22,16 +22,16 @@ export const DayNotesSchema = defineEntity({ class: DayNotes, repository: () => DayNotesRepository, properties: { - id: p.integer().primary().autoincrement(), - day: () => p.manyToOne(Days).ref().hidden().deleteRule('cascade').index('idx_day_notes_day_id'), - day_id: p.integer().persist(false), - trip: () => p.manyToOne(Trips).ref().hidden().deleteRule('cascade'), + id: p.integer().primary(), + day: () => p.manyToOne(Days).ref().deleteRule('cascade').hidden().index('idx_day_notes_day_id'), + day_id: p.integer().persist(false).index('idx_day_notes_day_id'), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(), trip_id: p.integer().persist(false), text: p.text(), time: p.text().nullable(), icon: p.text().nullable(), - sort_order: p.double().nullable().default(0), - created_at: p.type(DbTimestampType).nullable().defaultRaw('CURRENT_TIMESTAMP'), + sort_order: p.double().nullable().defaultRaw(`0`), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), color: p.text().nullable(), }, }); diff --git a/server/src/db/entities/Days.entity.ts b/server/src/db/entities/Days.entity.ts index 5939fddf8..53a2426c3 100644 --- a/server/src/db/entities/Days.entity.ts +++ b/server/src/db/entities/Days.entity.ts @@ -1,4 +1,4 @@ -import { Collection, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; import { DaysRepository } from '../repositories/Days.repository'; import { DayAccommodations } from './DayAccommodations.entity'; import { DayAssignments } from './DayAssignments.entity'; @@ -11,7 +11,7 @@ import { RoadtripVias } from './RoadtripVias.entity'; import { Trips } from './Trips.entity'; export class Days { - id?: number | null; + id!: number & Opt; trip!: Ref; trip_id!: number; day_number!: number; @@ -35,23 +35,23 @@ export const DaysSchema = defineEntity({ class: Days, repository: () => DaysRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().hidden().deleteRule('cascade').index('idx_days_trip_id'), - trip_id: p.integer().persist(false), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_days_trip_id'), + trip_id: p.integer().persist(false).index('idx_days_trip_id'), day_number: p.integer(), date: p.text().nullable(), notes: p.text().nullable(), title: p.text().nullable(), default_transport_mode: p.text().nullable(), - day_accommodations_collection: () => p.oneToMany(DayAccommodations).hidden().mappedBy('startDay'), - day_accommodations_collection1: () => p.oneToMany(DayAccommodations).hidden().mappedBy('endDay'), - day_assignments_collection: () => p.oneToMany(DayAssignments).hidden().mappedBy('day'), - day_notes_collection: () => p.oneToMany(DayNotes).hidden().mappedBy('day'), - photos_collection: () => p.oneToMany(Photos).hidden().mappedBy('day'), - reservation_day_positions_collection: () => p.oneToMany(ReservationDayPositions).hidden().mappedBy('day'), - reservations_collection: () => p.oneToMany(Reservations).hidden().mappedBy('day'), - reservations_collection1: () => p.oneToMany(Reservations).hidden().mappedBy('endDay'), - roadtrip_day_tracks: () => p.oneToOne(RoadtripDayTracks).ref().hidden().mappedBy('day'), - roadtrip_vias_collection: () => p.oneToMany(RoadtripVias).hidden().mappedBy('day'), + day_accommodations_collection: () => p.oneToMany(DayAccommodations).mappedBy('startDay').hidden(), + day_accommodations_collection1: () => p.oneToMany(DayAccommodations).mappedBy('endDay').hidden(), + day_assignments_collection: () => p.oneToMany(DayAssignments).mappedBy('day').hidden(), + day_notes_collection: () => p.oneToMany(DayNotes).mappedBy('day').hidden(), + photos_collection: () => p.oneToMany(Photos).mappedBy('day').hidden(), + reservation_day_positions_collection: () => p.oneToMany(ReservationDayPositions).mappedBy('day').hidden(), + reservations_collection: () => p.oneToMany(Reservations).mappedBy('day').hidden(), + reservations_collection1: () => p.oneToMany(Reservations).mappedBy('endDay').hidden(), + roadtrip_day_tracks: () => p.oneToOne(RoadtripDayTracks).ref().mappedBy('day').hidden(), + roadtrip_vias_collection: () => p.oneToMany(RoadtripVias).mappedBy('day').hidden(), }, }); diff --git a/server/src/db/entities/DocumentConnections.entity.ts b/server/src/db/entities/DocumentConnections.entity.ts new file mode 100644 index 000000000..bda8b2f32 --- /dev/null +++ b/server/src/db/entities/DocumentConnections.entity.ts @@ -0,0 +1,53 @@ +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { DocumentConnectionsRepository } from '../repositories/DocumentConnections.repository'; +import { DbTimestampType } from '../types'; +import { DocumentProviders } from './DocumentProviders.entity'; +import { TripDocumentLinks } from './TripDocumentLinks.entity'; +import { Trips } from './Trips.entity'; +import { Users } from './Users.entity'; + +export class DocumentConnections { + id!: number & Opt; + trip!: Ref; + trip_id!: number; + provider!: Ref; + provider_id!: string; + ownerUser!: Ref; + owner_user_id!: number; + base_url!: string; + secrets?: string | null; + settings: string & Opt = '{}'; + allow_insecure_tls: number & Opt = 0; + capabilities?: string | null; + last_probe_at?: string | null; + last_probe_state: string & Opt = 'never'; + last_probe_error?: string | null; + created_at?: string | null; + updated_at?: string | null; + trip_document_links_collection = new Collection(this); +} + +export const DocumentConnectionsSchema = defineEntity({ + class: DocumentConnections, + repository: () => DocumentConnectionsRepository, + properties: { + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_document_connections_trip'), + trip_id: p.integer().persist(false).index('idx_document_connections_trip'), + provider: () => p.manyToOne(DocumentProviders).ref().deleteRule('cascade').hidden(), + provider_id: p.text().persist(false), + ownerUser: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_document_connections_owner'), + owner_user_id: p.integer().persist(false).index('idx_document_connections_owner'), + base_url: p.text(), + secrets: p.text().nullable(), + settings: p.text().default('{}'), + allow_insecure_tls: p.integer().default(0), + capabilities: p.text().nullable(), + last_probe_at: p.text().nullable(), + last_probe_state: p.text().default('never'), + last_probe_error: p.text().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + trip_document_links_collection: () => p.oneToMany(TripDocumentLinks).mappedBy('connection').hidden(), + }, +}); diff --git a/server/src/db/entities/DocumentProviderFields.entity.ts b/server/src/db/entities/DocumentProviderFields.entity.ts new file mode 100644 index 000000000..479d001da --- /dev/null +++ b/server/src/db/entities/DocumentProviderFields.entity.ts @@ -0,0 +1,35 @@ +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { DocumentProviderFieldsRepository } from '../repositories/DocumentProviderFields.repository'; +import { DocumentProviders } from './DocumentProviders.entity'; + +export class DocumentProviderFields { + id!: number & Opt; + provider!: Ref; + provider_id!: string; + field_key!: string; + label!: string; + input_type: string & Opt = 'text'; + placeholder?: string | null; + hint?: string | null; + required?: number | null = 0; + secret?: number | null = 0; + sort_order?: number | null = 0; +} + +export const DocumentProviderFieldsSchema = defineEntity({ + class: DocumentProviderFields, + repository: () => DocumentProviderFieldsRepository, + properties: { + id: p.integer().primary(), + provider: () => p.manyToOne(DocumentProviders).ref().deleteRule('cascade').hidden(), + provider_id: p.text().persist(false), + field_key: p.text(), + label: p.text(), + input_type: p.text().default('text'), + placeholder: p.text().nullable(), + hint: p.text().nullable(), + required: p.integer().nullable(), + secret: p.integer().nullable(), + sort_order: p.integer().nullable(), + }, +}); diff --git a/server/src/db/entities/DocumentProviders.entity.ts b/server/src/db/entities/DocumentProviders.entity.ts new file mode 100644 index 000000000..7b4d80b16 --- /dev/null +++ b/server/src/db/entities/DocumentProviders.entity.ts @@ -0,0 +1,30 @@ +import { Collection, defineEntity, p } from '@mikro-orm/core'; +import { DocumentProvidersRepository } from '../repositories/DocumentProviders.repository'; +import { DocumentConnections } from './DocumentConnections.entity'; +import { DocumentProviderFields } from './DocumentProviderFields.entity'; + +export class DocumentProviders { + id?: string | null; + name!: string; + description?: string | null; + icon?: string | null = 'FileText'; + enabled?: number | null = 0; + sort_order?: number | null = 0; + document_connections_collection = new Collection(this); + document_provider_fields_collection = new Collection(this); +} + +export const DocumentProvidersSchema = defineEntity({ + class: DocumentProviders, + repository: () => DocumentProvidersRepository, + properties: { + id: p.text().primary().nullable(), + name: p.text(), + description: p.text().nullable(), + icon: p.text().nullable(), + enabled: p.integer().nullable(), + sort_order: p.integer().nullable(), + document_connections_collection: () => p.oneToMany(DocumentConnections).mappedBy('provider').hidden(), + document_provider_fields_collection: () => p.oneToMany(DocumentProviderFields).mappedBy('provider').hidden(), + }, +}); diff --git a/server/src/db/entities/DocumentSyncItems.entity.ts b/server/src/db/entities/DocumentSyncItems.entity.ts new file mode 100644 index 000000000..2087c7c95 --- /dev/null +++ b/server/src/db/entities/DocumentSyncItems.entity.ts @@ -0,0 +1,93 @@ +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { DocumentSyncItemsRepository } from '../repositories/DocumentSyncItems.repository'; +import { TripDocumentLinks } from './TripDocumentLinks.entity'; +import { TripFiles } from './TripFiles.entity'; +import { Trips } from './Trips.entity'; + +export class DocumentSyncItems { + id!: number & Opt; + link!: Ref; + link_id!: number; + trip!: Ref; + trip_id!: number; + file?: Ref | null; + file_id?: number | null; + trek_doc_uid!: string; + remote_id?: string | null; + remote_name?: string | null; + remote_version?: string | null; + remote_size?: number | null; + remote_modified_at?: string | null; + content_sha256?: string | null; + pushed_sha256?: string | null; + state: string & Opt = 'pending'; + error_code?: string | null; + attempts: number & Opt = 0; + next_attempt_at?: string | null; + remote_missing_at?: string | null; + first_seen_at!: string & Opt; + last_seen_at!: string & Opt; + synced_at?: string | null; + remote_trashed_at?: string | null; +} + +export const DocumentSyncItemsSchema = defineEntity({ + class: DocumentSyncItems, + repository: () => DocumentSyncItemsRepository, + indexes: [ + { + name: 'idx_document_sync_items_due', + properties: ['link_id', 'next_attempt_at'], + }, + { + name: 'idx_document_sync_items_hash', + properties: ['link_id', 'content_sha256'], + }, + { + name: 'idx_document_sync_items_trip_state', + properties: ['trip_id', 'state'], + }, + ], + uniques: [ + { + name: 'idx_document_sync_items_uid', + properties: ['link_id', 'trek_doc_uid'], + }, + { + name: 'idx_document_sync_items_file', + where: 'file_id IS NOT NULL', + properties: ['link_id', 'file_id'], + }, + { + name: 'idx_document_sync_items_remote', + where: 'remote_id IS NOT NULL', + properties: ['link_id', 'remote_id'], + }, + ], + properties: { + id: p.integer().primary(), + link: () => p.manyToOne(TripDocumentLinks).ref().deleteRule('cascade').hidden(), + link_id: p.integer().persist(false), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), + file: () => p.manyToOne(TripFiles).ref().nullable().hidden(), + file_id: p.integer().nullable().persist(false), + trek_doc_uid: p.text(), + remote_id: p.text().nullable(), + remote_name: p.text().nullable(), + remote_version: p.text().nullable(), + remote_size: p.integer().nullable(), + remote_modified_at: p.text().nullable(), + content_sha256: p.text().nullable(), + pushed_sha256: p.text().nullable(), + state: p.text().default('pending'), + error_code: p.text().nullable(), + attempts: p.integer().default(0), + next_attempt_at: p.text().nullable(), + remote_missing_at: p.text().nullable(), + first_seen_at: p.text().defaultRaw(`CURRENT_TIMESTAMP`), + last_seen_at: p.text().defaultRaw(`CURRENT_TIMESTAMP`), + synced_at: p.text().nullable(), + remote_trashed_at: p.text().nullable(), + }, +}); diff --git a/server/src/db/entities/FileLinks.entity.ts b/server/src/db/entities/FileLinks.entity.ts index f69a229f2..b1331a750 100644 --- a/server/src/db/entities/FileLinks.entity.ts +++ b/server/src/db/entities/FileLinks.entity.ts @@ -1,4 +1,6 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { FileLinksRepository } from '../repositories/FileLinks.repository'; +import { DbTimestampType } from '../types'; import { BudgetItems } from './BudgetItems.entity'; import { DayAssignments } from './DayAssignments.entity'; import { Places } from './Places.entity'; @@ -6,30 +8,41 @@ import { Reservations } from './Reservations.entity'; import { TripFiles } from './TripFiles.entity'; export class FileLinks { - id?: number | null; + id!: number & Opt; file!: Ref; + file_id!: number; reservation?: Ref | null; + reservation_id?: number | null; assignment?: Ref | null; + assignment_id?: number | null; place?: Ref | null; - createdAt?: Date | null; + place_id?: number | null; + created_at?: string | null; budgetItem?: Ref | null; + budget_item_id?: number | null; } -export class FileLinksRepository extends EntityRepository {} - export const FileLinksSchema = defineEntity({ class: FileLinks, repository: () => FileLinksRepository, uniques: [ - { name: 'idx_file_links_file_budget', properties: ['file', 'budgetItem'] }, + { + name: 'idx_file_links_file_budget', + properties: ['file_id', 'budget_item_id'], + }, ], properties: { - id: p.integer().primary().autoincrement(), - file: () => p.manyToOne(TripFiles).ref().deleteRule('cascade'), - reservation: () => p.manyToOne(Reservations).ref().deleteRule('cascade').nullable(), - assignment: () => p.manyToOne(DayAssignments).ref().deleteRule('cascade').nullable(), - place: () => p.manyToOne(Places).ref().deleteRule('cascade').nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - budgetItem: () => p.manyToOne(BudgetItems).ref().nullable().index('idx_file_links_budget_item_id'), + id: p.integer().primary(), + file: () => p.manyToOne(TripFiles).ref().deleteRule('cascade').hidden(), + file_id: p.integer().persist(false), + reservation: () => p.manyToOne(Reservations).ref().deleteRule('cascade').nullable().hidden(), + reservation_id: p.integer().nullable().persist(false), + assignment: () => p.manyToOne(DayAssignments).ref().deleteRule('cascade').nullable().hidden(), + assignment_id: p.integer().nullable().persist(false), + place: () => p.manyToOne(Places).ref().deleteRule('cascade').nullable().hidden(), + place_id: p.integer().nullable().persist(false), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + budgetItem: () => p.manyToOne(BudgetItems).ref().nullable().hidden().index('idx_file_links_budget_item_id'), + budget_item_id: p.integer().nullable().persist(false).index('idx_file_links_budget_item_id'), }, }); diff --git a/server/src/db/entities/GooglePlacePhotoMeta.entity.ts b/server/src/db/entities/GooglePlacePhotoMeta.entity.ts index 9ec7f028f..a61deb099 100644 --- a/server/src/db/entities/GooglePlacePhotoMeta.entity.ts +++ b/server/src/db/entities/GooglePlacePhotoMeta.entity.ts @@ -1,22 +1,21 @@ -import { PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { GooglePlacePhotoMetaRepository } from '../repositories/GooglePlacePhotoMeta.repository'; export class GooglePlacePhotoMeta { - [PrimaryKeyProp]?: 'placeId'; - placeId?: string | null; + [PrimaryKeyProp]?: 'place_id'; + place_id?: string | null; attribution?: string | null; - fetchedAt!: number; - errorAt?: number | null; + fetched_at!: number; + error_at?: number | null; } -export class GooglePlacePhotoMetaRepository extends EntityRepository {} - export const GooglePlacePhotoMetaSchema = defineEntity({ class: GooglePlacePhotoMeta, repository: () => GooglePlacePhotoMetaRepository, properties: { - placeId: p.text().primary().nullable(), + place_id: p.text().primary().nullable(), attribution: p.text().nullable(), - fetchedAt: p.integer(), - errorAt: p.integer().nullable(), + fetched_at: p.integer(), + error_at: p.integer().nullable(), }, }); diff --git a/server/src/db/entities/HiddenCountries.entity.ts b/server/src/db/entities/HiddenCountries.entity.ts index 7dbdd12be..7e065672c 100644 --- a/server/src/db/entities/HiddenCountries.entity.ts +++ b/server/src/db/entities/HiddenCountries.entity.ts @@ -1,22 +1,24 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { HiddenCountriesRepository } from '../repositories/HiddenCountries.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class HiddenCountries { - id?: number | null; + id!: number & Opt; user!: Ref; - countryCode!: string; - createdAt?: Date | null; + user_id!: number; + country_code!: string; + created_at?: string | null; } -export class HiddenCountriesRepository extends EntityRepository {} - export const HiddenCountriesSchema = defineEntity({ class: HiddenCountries, repository: () => HiddenCountriesRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_hidden_countries_user'), - countryCode: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_hidden_countries_user'), + user_id: p.integer().persist(false).index('idx_hidden_countries_user'), + country_code: p.text(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/HiddenRegions.entity.ts b/server/src/db/entities/HiddenRegions.entity.ts index 1572e2d1c..db8d1b30a 100644 --- a/server/src/db/entities/HiddenRegions.entity.ts +++ b/server/src/db/entities/HiddenRegions.entity.ts @@ -1,24 +1,26 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { HiddenRegionsRepository } from '../repositories/HiddenRegions.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class HiddenRegions { - id?: number | null; + id!: number & Opt; user!: Ref; - regionCode!: string; - countryCode!: string; - createdAt?: Date | null; + user_id!: number; + region_code!: string; + country_code!: string; + created_at?: string | null; } -export class HiddenRegionsRepository extends EntityRepository {} - export const HiddenRegionsSchema = defineEntity({ class: HiddenRegions, repository: () => HiddenRegionsRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_hidden_regions_user'), - regionCode: p.text(), - countryCode: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_hidden_regions_user'), + user_id: p.integer().persist(false).index('idx_hidden_regions_user'), + region_code: p.text(), + country_code: p.text(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/IdempotencyKeys.entity.ts b/server/src/db/entities/IdempotencyKeys.entity.ts index 79c318a64..70811fae4 100644 --- a/server/src/db/entities/IdempotencyKeys.entity.ts +++ b/server/src/db/entities/IdempotencyKeys.entity.ts @@ -1,29 +1,30 @@ -import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { IdempotencyKeysRepository } from '../repositories/IdempotencyKeys.repository'; import { Users } from './Users.entity'; export class IdempotencyKeys { [PrimaryKeyProp]?: ['key', 'user', 'method', 'path']; key!: string; user!: Ref; + user_id!: number; method!: string; path!: string; - statusCode!: number; - responseBody!: string; - createdAt: number & Opt = NaN; + status_code!: number; + response_body!: string; + created_at: number & Opt = NaN; } -export class IdempotencyKeysRepository extends EntityRepository {} - export const IdempotencyKeysSchema = defineEntity({ class: IdempotencyKeys, repository: () => IdempotencyKeysRepository, properties: { key: p.text().primary(), - user: () => p.manyToOne(Users).primary().ref().deleteRule('cascade'), + user: () => p.manyToOne(Users).primary().ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), method: p.text().primary(), path: p.text().primary(), - statusCode: p.integer(), - responseBody: p.text(), - createdAt: p.integer().defaultRaw(`(strftime('%s','now'))`).index('idx_idempotency_keys_created'), + status_code: p.integer(), + response_body: p.text(), + created_at: p.integer().defaultRaw(`(strftime('%s','now'))`).index('idx_idempotency_keys_created'), }, }); diff --git a/server/src/db/entities/InviteTokens.entity.ts b/server/src/db/entities/InviteTokens.entity.ts index 51d66f98e..bc38f4e0b 100644 --- a/server/src/db/entities/InviteTokens.entity.ts +++ b/server/src/db/entities/InviteTokens.entity.ts @@ -1,31 +1,35 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { InviteTokensRepository } from '../repositories/InviteTokens.repository'; +import { DbTimestampType } from '../types'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class InviteTokens { - id?: number | null; + id!: number & Opt; token!: string; - maxUses: number & Opt = 1; - usedCount: number & Opt = 0; - expiresAt?: string | null; - createdBy!: Ref; - createdAt?: Date | null; + max_uses: number & Opt = 1; + used_count: number & Opt = 0; + expires_at?: string | null; + created_by!: number; + created_at?: string | null; trip?: Ref | null; + trip_id?: number | null; + createdByRef!: Ref; } -export class InviteTokensRepository extends EntityRepository {} - export const InviteTokensSchema = defineEntity({ class: InviteTokens, repository: () => InviteTokensRepository, properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), token: p.text(), - maxUses: p.integer(), - usedCount: p.integer(), - expiresAt: p.text().nullable(), - createdBy: () => p.manyToOne(Users).ref().name('created_by').deleteRule('cascade'), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - trip: () => p.manyToOne(Trips).ref().nullable(), + max_uses: p.integer().default(1), + used_count: p.integer().default(0), + expires_at: p.text().nullable(), + created_by: p.integer().persist(false), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + trip: () => p.manyToOne(Trips).ref().nullable().hidden(), + trip_id: p.integer().nullable().persist(false), + createdByRef: () => p.manyToOne(Users).ref().joinColumn('created_by').deleteRule('cascade').hidden(), }, }); diff --git a/server/src/db/entities/JourneyBooks.entity.ts b/server/src/db/entities/JourneyBooks.entity.ts index 33bf9e8f5..1d1d48b99 100644 --- a/server/src/db/entities/JourneyBooks.entity.ts +++ b/server/src/db/entities/JourneyBooks.entity.ts @@ -1,33 +1,39 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneyBooksRepository } from '../repositories/JourneyBooks.repository'; +import { DbTimestampType } from '../types'; import { Journeys } from './Journeys.entity'; import { Users } from './Users.entity'; export class JourneyBooks { - id?: number | null; + id!: number & Opt; journey!: Ref; + journey_id!: number; title: string & Opt = ''; document!: string; version: number & Opt = 1; - createdBy?: Ref | null; - updatedBy?: Ref | null; - createdAt?: Date | null; - updatedAt?: Date | null; + created_by?: number | null; + updated_by?: number | null; + created_at?: string | null; + updated_at?: string | null; + updatedByRef?: Ref | null; + createdByRef?: Ref | null; } -export class JourneyBooksRepository extends EntityRepository {} - export const JourneyBooksSchema = defineEntity({ class: JourneyBooks, repository: () => JourneyBooksRepository, properties: { - id: p.integer().primary().autoincrement(), - journey: () => p.manyToOne(Journeys).ref().deleteRule('cascade').index('idx_journey_books_journey'), - title: p.text(), + id: p.integer().primary(), + journey: () => p.manyToOne(Journeys).ref().deleteRule('cascade').hidden().index('idx_journey_books_journey'), + journey_id: p.integer().persist(false).index('idx_journey_books_journey'), + title: p.text().default(''), document: p.text(), - version: p.integer(), - createdBy: () => p.manyToOne(Users).ref().name('created_by').nullable(), - updatedBy: () => p.manyToOne(Users).ref().name('updated_by').nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), + version: p.integer().default(1), + created_by: p.integer().nullable().persist(false), + updated_by: p.integer().nullable().persist(false), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updatedByRef: () => p.manyToOne(Users).ref().joinColumn('updated_by').nullable().hidden(), + createdByRef: () => p.manyToOne(Users).ref().joinColumn('created_by').nullable().hidden(), }, }); diff --git a/server/src/db/entities/JourneyContributors.entity.ts b/server/src/db/entities/JourneyContributors.entity.ts index 4a188c618..c68e56a6c 100644 --- a/server/src/db/entities/JourneyContributors.entity.ts +++ b/server/src/db/entities/JourneyContributors.entity.ts @@ -1,26 +1,29 @@ -import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneyContributorsRepository } from '../repositories/JourneyContributors.repository'; import { Journeys } from './Journeys.entity'; import { Users } from './Users.entity'; export class JourneyContributors { [PrimaryKeyProp]?: ['journey', 'user']; journey!: Ref; + journey_id!: number; user!: Ref; + user_id!: number; role!: string; - addedAt!: number; - hideSkeletons: number & Opt = 0; + added_at!: number; + hide_skeletons: number & Opt = 0; } -export class JourneyContributorsRepository extends EntityRepository {} - export const JourneyContributorsSchema = defineEntity({ class: JourneyContributors, repository: () => JourneyContributorsRepository, properties: { - journey: () => p.manyToOne(Journeys).primary().ref(), - user: () => p.manyToOne(Users).primary().ref().index('idx_journey_contributors_user'), + journey: () => p.manyToOne(Journeys).primary().ref().hidden(), + journey_id: p.integer().persist(false), + user: () => p.manyToOne(Users).primary().ref().hidden().index('idx_journey_contributors_user'), + user_id: p.integer().persist(false).index('idx_journey_contributors_user'), role: p.text(), - addedAt: p.integer(), - hideSkeletons: p.integer(), + added_at: p.integer(), + hide_skeletons: p.integer().default(0), }, }); diff --git a/server/src/db/entities/JourneyEntries.entity.ts b/server/src/db/entities/JourneyEntries.entity.ts index 0ed3bccfc..5757f5e40 100644 --- a/server/src/db/entities/JourneyEntries.entity.ts +++ b/server/src/db/entities/JourneyEntries.entity.ts @@ -1,4 +1,5 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneyEntriesRepository } from '../repositories/JourneyEntries.repository'; import { JourneyEntryPhotos } from './JourneyEntryPhotos.entity'; import { Journeys } from './Journeys.entity'; import { Places } from './Places.entity'; @@ -6,76 +7,85 @@ import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class JourneyEntries { - id?: number | null; + id!: number & Opt; journey!: Ref; + journey_id!: number; sourceTrip?: Ref | null; + source_trip_id?: number | null; sourcePlace?: Ref | null; + source_place_id?: number | null; author!: Ref; + author_id!: number; type!: string; title?: string | null; story?: string | null; - entryDate!: string; - entryTime?: string | null; - locationName?: string | null; - locationLat?: unknown | null; - locationLng?: unknown | null; + entry_date!: string; + entry_time?: string | null; + location_name?: string | null; + location_lat?: number | null; + location_lng?: number | null; mood?: string | null; weather?: string | null; tags?: string | null; visibility?: string | null = 'private'; - sortOrder?: number | null = 0; - createdAt!: number; - updatedAt!: number; - prosCons?: string | null; - statsExcluded: number & Opt = 0; + sort_order?: number | null = 0; + created_at!: number; + updated_at!: number; + pros_cons?: string | null; + stats_excluded: number & Opt = 0; dismissed: number & Opt = 0; - countryCode?: string | null; - sourceAssignmentId?: number | null; - journeyEntryPhotosCollection = new Collection(this); + country_code?: string | null; + source_assignment_id?: number | null; + journey_entry_photos_collection = new Collection(this); } -export class JourneyEntriesRepository extends EntityRepository {} - export const JourneyEntriesSchema = defineEntity({ class: JourneyEntries, repository: () => JourneyEntriesRepository, indexes: [ { name: 'idx_journey_entries_source_assignment', - properties: ['sourcePlace', 'sourceAssignmentId'], + properties: ['source_place_id', 'source_assignment_id'], }, { name: 'idx_journey_entries_order', - properties: ['journey', 'entryDate', 'sortOrder'], + properties: ['journey_id', 'entry_date', 'sort_order'], + }, + { + name: 'idx_journey_entries_journey', + properties: ['journey_id', 'entry_date'], }, - { name: 'idx_journey_entries_journey', properties: ['journey', 'entryDate'] }, ], properties: { - id: p.integer().primary().autoincrement(), - journey: () => p.manyToOne(Journeys).ref().deleteRule('cascade'), - sourceTrip: () => p.manyToOne(Trips).ref().nullable(), - sourcePlace: () => p.manyToOne(Places).ref().nullable().index('idx_journey_entries_source'), - author: () => p.manyToOne(Users).ref(), + id: p.integer().primary(), + journey: () => p.manyToOne(Journeys).ref().deleteRule('cascade').hidden(), + journey_id: p.integer().persist(false), + sourceTrip: () => p.manyToOne(Trips).ref().nullable().hidden(), + source_trip_id: p.integer().nullable().persist(false), + sourcePlace: () => p.manyToOne(Places).ref().nullable().hidden().index('idx_journey_entries_source'), + source_place_id: p.integer().nullable().persist(false).index('idx_journey_entries_source'), + author: () => p.manyToOne(Users).ref().hidden(), + author_id: p.integer().persist(false), type: p.text(), title: p.text().nullable(), story: p.text().nullable(), - entryDate: p.text(), - entryTime: p.text().nullable(), - locationName: p.text().nullable(), - locationLat: p.double().nullable(), - locationLng: p.double().nullable(), + entry_date: p.text(), + entry_time: p.text().nullable(), + location_name: p.text().nullable(), + location_lat: p.double().nullable(), + location_lng: p.double().nullable(), mood: p.text().nullable(), weather: p.text().nullable(), tags: p.text().nullable(), visibility: p.text().nullable(), - sortOrder: p.integer().nullable(), - createdAt: p.integer(), - updatedAt: p.integer(), - prosCons: p.text().nullable(), - statsExcluded: p.integer(), - dismissed: p.integer(), - countryCode: p.text().nullable(), - sourceAssignmentId: p.integer().nullable(), - journeyEntryPhotosCollection: () => p.oneToMany(JourneyEntryPhotos).mappedBy('entry'), + sort_order: p.integer().nullable(), + created_at: p.integer(), + updated_at: p.integer(), + pros_cons: p.text().nullable(), + stats_excluded: p.integer().default(0), + dismissed: p.integer().default(0), + country_code: p.text().nullable(), + source_assignment_id: p.integer().nullable(), + journey_entry_photos_collection: () => p.oneToMany(JourneyEntryPhotos).mappedBy('entry').hidden(), }, }); diff --git a/server/src/db/entities/JourneyEntryPhotos.entity.ts b/server/src/db/entities/JourneyEntryPhotos.entity.ts index 0f5187544..250472800 100644 --- a/server/src/db/entities/JourneyEntryPhotos.entity.ts +++ b/server/src/db/entities/JourneyEntryPhotos.entity.ts @@ -1,24 +1,27 @@ -import { PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneyEntryPhotosRepository } from '../repositories/JourneyEntryPhotos.repository'; import { JourneyEntries } from './JourneyEntries.entity'; import { JourneyPhotos } from './JourneyPhotos.entity'; export class JourneyEntryPhotos { [PrimaryKeyProp]?: ['entry', 'journeyPhoto']; entry!: Ref; + entry_id!: number; journeyPhoto!: Ref; - sortOrder?: number | null = 0; - createdAt!: number; + journey_photo_id!: number; + sort_order?: number | null = 0; + created_at!: number; } -export class JourneyEntryPhotosRepository extends EntityRepository {} - export const JourneyEntryPhotosSchema = defineEntity({ class: JourneyEntryPhotos, repository: () => JourneyEntryPhotosRepository, properties: { - entry: () => p.manyToOne(JourneyEntries).primary().ref().index('idx_journey_entry_photos_entry'), - journeyPhoto: () => p.manyToOne(JourneyPhotos).primary().ref().index('idx_journey_entry_photos_photo'), - sortOrder: p.integer().nullable(), - createdAt: p.integer(), + entry: () => p.manyToOne(JourneyEntries).primary().ref().hidden().index('idx_journey_entry_photos_entry'), + entry_id: p.integer().persist(false).index('idx_journey_entry_photos_entry'), + journeyPhoto: () => p.manyToOne(JourneyPhotos).primary().ref().hidden().index('idx_journey_entry_photos_photo'), + journey_photo_id: p.integer().persist(false).index('idx_journey_entry_photos_photo'), + sort_order: p.integer().nullable(), + created_at: p.integer(), }, }); diff --git a/server/src/db/entities/JourneyPhotos.entity.ts b/server/src/db/entities/JourneyPhotos.entity.ts index fb5694a5d..eb862ca3e 100644 --- a/server/src/db/entities/JourneyPhotos.entity.ts +++ b/server/src/db/entities/JourneyPhotos.entity.ts @@ -1,38 +1,41 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneyPhotosRepository } from '../repositories/JourneyPhotos.repository'; import { JourneyEntryPhotos } from './JourneyEntryPhotos.entity'; import { Journeys } from './Journeys.entity'; import { TrekPhotos } from './TrekPhotos.entity'; export class JourneyPhotos { - id?: number | null; + id!: number & Opt; journey!: Ref; + journey_id!: number; photo!: Ref; + photo_id!: number; caption?: string | null; shared?: number | null = 0; - sortOrder?: number | null = 0; + sort_order?: number | null = 0; provider?: string | null; - assetId?: string | null; - ownerId?: number | null; - createdAt!: number; - journeyEntryPhotosCollection = new Collection(this); + asset_id?: string | null; + owner_id?: number | null; + created_at!: number; + journey_entry_photos_collection = new Collection(this); } -export class JourneyPhotosRepository extends EntityRepository {} - export const JourneyPhotosSchema = defineEntity({ class: JourneyPhotos, repository: () => JourneyPhotosRepository, properties: { - id: p.integer().primary().autoincrement(), - journey: () => p.manyToOne(Journeys).ref().deleteRule('cascade').index('idx_journey_photos_journey'), - photo: () => p.manyToOne(TrekPhotos).ref().deleteRule('cascade'), + id: p.integer().primary(), + journey: () => p.manyToOne(Journeys).ref().deleteRule('cascade').hidden().index('idx_journey_photos_journey'), + journey_id: p.integer().persist(false).index('idx_journey_photos_journey'), + photo: () => p.manyToOne(TrekPhotos).ref().deleteRule('cascade').hidden(), + photo_id: p.integer().persist(false), caption: p.text().nullable(), shared: p.integer().nullable(), - sortOrder: p.integer().nullable(), + sort_order: p.integer().nullable(), provider: p.text().nullable(), - assetId: p.text().nullable(), - ownerId: p.integer().nullable(), - createdAt: p.integer(), - journeyEntryPhotosCollection: () => p.oneToMany(JourneyEntryPhotos).mappedBy('journeyPhoto'), + asset_id: p.text().nullable(), + owner_id: p.integer().nullable(), + created_at: p.integer(), + journey_entry_photos_collection: () => p.oneToMany(JourneyEntryPhotos).mappedBy('journeyPhoto').hidden(), }, }); diff --git a/server/src/db/entities/JourneyShareTokens.entity.ts b/server/src/db/entities/JourneyShareTokens.entity.ts index cbe8d0374..d17930cfd 100644 --- a/server/src/db/entities/JourneyShareTokens.entity.ts +++ b/server/src/db/entities/JourneyShareTokens.entity.ts @@ -1,33 +1,37 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneyShareTokensRepository } from '../repositories/JourneyShareTokens.repository'; +import { DbTimestampType } from '../types'; import { Journeys } from './Journeys.entity'; import { Users } from './Users.entity'; export class JourneyShareTokens { - id?: number | null; + id!: number & Opt; journey!: Ref; + journey_id!: number; token!: string; - createdBy!: Ref; - shareTimeline?: number | null = 1; - shareGallery?: number | null = 1; - shareMap?: number | null = 1; - createdAt?: Date | null; - newestFirst: number & Opt = 0; + created_by!: number; + share_timeline?: number | null = 1; + share_gallery?: number | null = 1; + share_map?: number | null = 1; + created_at?: string | null; + newest_first: number & Opt = 0; + createdByRef!: Ref; } -export class JourneyShareTokensRepository extends EntityRepository {} - export const JourneyShareTokensSchema = defineEntity({ class: JourneyShareTokens, repository: () => JourneyShareTokensRepository, properties: { - id: p.integer().primary().autoincrement(), - journey: () => p.oneToOne(Journeys).ref().deleteRule('cascade').unique('idx_journey_share_journey'), + id: p.integer().primary(), + journey: () => p.oneToOne(Journeys).ref().deleteRule('cascade').hidden().unique('idx_journey_share_journey'), + journey_id: p.integer().persist(false).unique('idx_journey_share_journey'), token: p.text(), - createdBy: () => p.manyToOne(Users).ref().name('created_by'), - shareTimeline: p.integer().nullable(), - shareGallery: p.integer().nullable(), - shareMap: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - newestFirst: p.integer(), + created_by: p.integer().persist(false), + share_timeline: p.integer().nullable(), + share_gallery: p.integer().nullable(), + share_map: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + newest_first: p.integer().default(0), + createdByRef: () => p.manyToOne(Users).ref().joinColumn('created_by').hidden(), }, }); diff --git a/server/src/db/entities/JourneyTrips.entity.ts b/server/src/db/entities/JourneyTrips.entity.ts index 2f863693e..dd487ba89 100644 --- a/server/src/db/entities/JourneyTrips.entity.ts +++ b/server/src/db/entities/JourneyTrips.entity.ts @@ -1,22 +1,25 @@ -import { PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneyTripsRepository } from '../repositories/JourneyTrips.repository'; import { Journeys } from './Journeys.entity'; import { Trips } from './Trips.entity'; export class JourneyTrips { [PrimaryKeyProp]?: ['journey', 'trip']; journey!: Ref; + journey_id!: number; trip!: Ref; - addedAt!: number; + trip_id!: number; + added_at!: number; } -export class JourneyTripsRepository extends EntityRepository {} - export const JourneyTripsSchema = defineEntity({ class: JourneyTrips, repository: () => JourneyTripsRepository, properties: { - journey: () => p.manyToOne(Journeys).primary().ref().index('idx_journey_trips_journey'), - trip: () => p.manyToOne(Trips).primary().ref(), - addedAt: p.integer(), + journey: () => p.manyToOne(Journeys).primary().ref().hidden().index('idx_journey_trips_journey'), + journey_id: p.integer().persist(false).index('idx_journey_trips_journey'), + trip: () => p.manyToOne(Trips).primary().ref().hidden(), + trip_id: p.integer().persist(false), + added_at: p.integer(), }, }); diff --git a/server/src/db/entities/Journeys.entity.ts b/server/src/db/entities/Journeys.entity.ts index 5b399ec29..ee0a3b44c 100644 --- a/server/src/db/entities/Journeys.entity.ts +++ b/server/src/db/entities/Journeys.entity.ts @@ -1,4 +1,5 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { JourneysRepository } from '../repositories/Journeys.repository'; import { JourneyBooks } from './JourneyBooks.entity'; import { JourneyContributors } from './JourneyContributors.entity'; import { JourneyEntries } from './JourneyEntries.entity'; @@ -8,51 +9,51 @@ import { JourneyTrips } from './JourneyTrips.entity'; import { Users } from './Users.entity'; export class Journeys { - id?: number | null; + id!: number & Opt; user!: Ref; + user_id!: number; title!: string; subtitle?: string | null; - coverGradient?: string | null; + cover_gradient?: string | null; status?: string | null = 'draft'; - createdAt!: number; - updatedAt!: number; - coverImage?: string | null; - showTripTracks: number & Opt = 0; - showVerdict: number & Opt = 1; - showMood: number & Opt = 1; - showWeather: number & Opt = 1; - journeyBooksCollection = new Collection(this); - journeyContributorsCollection = new Collection(this); - journeyEntriesCollection = new Collection(this); - journeyPhotosCollection = new Collection(this); - journeyShareTokens: Ref | null = null; - journeyTripsCollection = new Collection(this); + created_at!: number; + updated_at!: number; + cover_image?: string | null; + show_trip_tracks: number & Opt = 0; + show_verdict: number & Opt = 1; + show_mood: number & Opt = 1; + show_weather: number & Opt = 1; + journey_books_collection = new Collection(this); + journey_contributors_collection = new Collection(this); + journey_entries_collection = new Collection(this); + journey_photos_collection = new Collection(this); + journey_share_tokens: Ref | null = null; + journey_trips_collection = new Collection(this); } -export class JourneysRepository extends EntityRepository {} - export const JourneysSchema = defineEntity({ class: Journeys, repository: () => JourneysRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().index('idx_journeys_user'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().hidden().index('idx_journeys_user'), + user_id: p.integer().persist(false).index('idx_journeys_user'), title: p.text(), subtitle: p.text().nullable(), - coverGradient: p.text().nullable(), + cover_gradient: p.text().nullable(), status: p.text().nullable(), - createdAt: p.integer(), - updatedAt: p.integer(), - coverImage: p.text().nullable(), - showTripTracks: p.integer(), - showVerdict: p.integer(), - showMood: p.integer(), - showWeather: p.integer(), - journeyBooksCollection: () => p.oneToMany(JourneyBooks).mappedBy('journey'), - journeyContributorsCollection: () => p.oneToMany(JourneyContributors).mappedBy('journey'), - journeyEntriesCollection: () => p.oneToMany(JourneyEntries).mappedBy('journey'), - journeyPhotosCollection: () => p.oneToMany(JourneyPhotos).mappedBy('journey'), - journeyShareTokens: () => p.oneToOne(JourneyShareTokens).ref().mappedBy('journey'), - journeyTripsCollection: () => p.oneToMany(JourneyTrips).mappedBy('journey'), + created_at: p.integer(), + updated_at: p.integer(), + cover_image: p.text().nullable(), + show_trip_tracks: p.integer().default(0), + show_verdict: p.integer().default(1), + show_mood: p.integer().default(1), + show_weather: p.integer().default(1), + journey_books_collection: () => p.oneToMany(JourneyBooks).mappedBy('journey').hidden(), + journey_contributors_collection: () => p.oneToMany(JourneyContributors).mappedBy('journey').hidden(), + journey_entries_collection: () => p.oneToMany(JourneyEntries).mappedBy('journey').hidden(), + journey_photos_collection: () => p.oneToMany(JourneyPhotos).mappedBy('journey').hidden(), + journey_share_tokens: () => p.oneToOne(JourneyShareTokens).ref().mappedBy('journey').hidden(), + journey_trips_collection: () => p.oneToMany(JourneyTrips).mappedBy('journey').hidden(), }, }); diff --git a/server/src/db/entities/McpTokens.entity.ts b/server/src/db/entities/McpTokens.entity.ts index 410473152..71fc1aaf6 100644 --- a/server/src/db/entities/McpTokens.entity.ts +++ b/server/src/db/entities/McpTokens.entity.ts @@ -1,34 +1,36 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { McpTokensRepository } from '../repositories/McpTokens.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class McpTokens { - id?: number | null; + id!: number & Opt; user!: Ref; + user_id!: number; name!: string; - tokenHash!: string; - tokenPrefix!: string; - createdAt?: Date | null; - lastUsedAt?: Date | null; + token_hash!: string; + token_prefix!: string; + created_at?: string | null; + last_used_at?: string | null; kind: string & Opt = 'mcp'; - scopeMode: string & Opt = 'all'; - apiScopes?: string | null; + scope_mode: string & Opt = 'all'; + api_scopes?: string | null; } -export class McpTokensRepository extends EntityRepository {} - export const McpTokensSchema = defineEntity({ class: McpTokens, repository: () => McpTokensRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), name: p.text(), - tokenHash: p.text().unique('idx_mcp_tokens_hash'), - tokenPrefix: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - lastUsedAt: p.datetime().nullable(), - kind: p.text(), - scopeMode: p.text(), - apiScopes: p.text().nullable(), + token_hash: p.text().unique('idx_mcp_tokens_hash'), + token_prefix: p.text(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + last_used_at: p.type(DbTimestampType).nullable(), + kind: p.text().default('mcp'), + scope_mode: p.text().default('all'), + api_scopes: p.text().nullable(), }, }); diff --git a/server/src/db/entities/Migrations.entity.ts b/server/src/db/entities/Migrations.entity.ts index c8bafc26d..3ab7b8467 100644 --- a/server/src/db/entities/Migrations.entity.ts +++ b/server/src/db/entities/Migrations.entity.ts @@ -1,4 +1,5 @@ -import { defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { defineEntity, p } from '@mikro-orm/core'; +import { MigrationsRepository } from '../repositories/Migrations.repository'; export class Migrations { id!: number; @@ -6,8 +7,6 @@ export class Migrations { name!: string; } -export class MigrationsRepository extends EntityRepository {} - export const MigrationsSchema = defineEntity({ class: Migrations, repository: () => MigrationsRepository, diff --git a/server/src/db/entities/NotificationChannelPreferences.entity.ts b/server/src/db/entities/NotificationChannelPreferences.entity.ts index b45a0eeca..974a7834e 100644 --- a/server/src/db/entities/NotificationChannelPreferences.entity.ts +++ b/server/src/db/entities/NotificationChannelPreferences.entity.ts @@ -1,23 +1,24 @@ -import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { NotificationChannelPreferencesRepository } from '../repositories/NotificationChannelPreferences.repository'; import { Users } from './Users.entity'; export class NotificationChannelPreferences { - [PrimaryKeyProp]?: ['user', 'eventType', 'channel']; + [PrimaryKeyProp]?: ['user', 'event_type', 'channel']; user!: Ref; - eventType!: string; + user_id!: number; + event_type!: string; channel!: string; enabled: number & Opt = 1; } -export class NotificationChannelPreferencesRepository extends EntityRepository {} - export const NotificationChannelPreferencesSchema = defineEntity({ class: NotificationChannelPreferences, repository: () => NotificationChannelPreferencesRepository, properties: { - user: () => p.manyToOne(Users).primary().ref().deleteRule('cascade').index('idx_ncp_user'), - eventType: p.text().primary(), + user: () => p.manyToOne(Users).primary().ref().deleteRule('cascade').hidden().index('idx_ncp_user'), + user_id: p.integer().persist(false).index('idx_ncp_user'), + event_type: p.text().primary(), channel: p.text().primary(), - enabled: p.integer(), + enabled: p.integer().default(1), }, }); diff --git a/server/src/db/entities/Notifications.entity.ts b/server/src/db/entities/Notifications.entity.ts index 242cd5545..54f2f17af 100644 --- a/server/src/db/entities/Notifications.entity.ts +++ b/server/src/db/entities/Notifications.entity.ts @@ -1,30 +1,32 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { NotificationsRepository } from '../repositories/Notifications.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class Notifications { - id?: number | null; + id!: number & Opt; type!: string; scope!: string; target!: number; sender?: Ref | null; + sender_id?: number | null; recipient!: Ref; - titleKey!: string; - titleParams?: string | null = '{}'; - textKey!: string; - textParams?: string | null = '{}'; - positiveTextKey?: string | null; - negativeTextKey?: string | null; - positiveCallback?: string | null; - negativeCallback?: string | null; + recipient_id!: number; + title_key!: string; + title_params?: string | null = '{}'; + text_key!: string; + text_params?: string | null = '{}'; + positive_text_key?: string | null; + negative_text_key?: string | null; + positive_callback?: string | null; + negative_callback?: string | null; response?: string | null; - navigateTextKey?: string | null; - navigateTarget?: string | null; - isRead?: number | null = 0; - createdAt?: Date | null; + navigate_text_key?: string | null; + navigate_target?: string | null; + is_read?: number | null = 0; + created_at?: string | null; } -export class NotificationsRepository extends EntityRepository {} - export const NotificationsSchema = defineEntity({ class: Notifications, repository: () => NotificationsRepository, @@ -32,32 +34,34 @@ export const NotificationsSchema = defineEntity({ { name: 'idx_notifications_target_scope', properties: ['target', 'scope'] }, { name: 'idx_notifications_recipient_created', - properties: ['recipient', 'createdAt'], + properties: ['recipient_id', 'created_at'], }, { name: 'idx_notifications_recipient', - properties: ['recipient', 'isRead', 'createdAt'], + properties: ['recipient_id', 'is_read', 'created_at'], }, ], properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), type: p.text(), scope: p.text(), target: p.integer(), - sender: () => p.manyToOne(Users).ref().nullable(), - recipient: () => p.manyToOne(Users).ref().deleteRule('cascade'), - titleKey: p.text(), - titleParams: p.text().nullable(), - textKey: p.text(), - textParams: p.text().nullable(), - positiveTextKey: p.text().nullable(), - negativeTextKey: p.text().nullable(), - positiveCallback: p.text().nullable(), - negativeCallback: p.text().nullable(), + sender: () => p.manyToOne(Users).ref().nullable().hidden(), + sender_id: p.integer().nullable().persist(false), + recipient: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + recipient_id: p.integer().persist(false), + title_key: p.text(), + title_params: p.text().nullable(), + text_key: p.text(), + text_params: p.text().nullable(), + positive_text_key: p.text().nullable(), + negative_text_key: p.text().nullable(), + positive_callback: p.text().nullable(), + negative_callback: p.text().nullable(), response: p.text().nullable(), - navigateTextKey: p.text().nullable(), - navigateTarget: p.text().nullable(), - isRead: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + navigate_text_key: p.text().nullable(), + navigate_target: p.text().nullable(), + is_read: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/OauthClients.entity.ts b/server/src/db/entities/OauthClients.entity.ts index db7de536c..952d0b48f 100644 --- a/server/src/db/entities/OauthClients.entity.ts +++ b/server/src/db/entities/OauthClients.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { OauthClientsRepository } from '../repositories/OauthClients.repository'; +import { DbTimestampType } from '../types'; import { OauthConsents } from './OauthConsents.entity'; import { OauthTokens } from './OauthTokens.entity'; import { Users } from './Users.entity'; @@ -6,37 +8,37 @@ import { Users } from './Users.entity'; export class OauthClients { id?: string | null; user?: Ref | null; + user_id?: number | null; name!: string; - clientId!: string; - clientSecretHash!: string; - redirectUris: string & Opt = '[]'; - allowedScopes: string & Opt = '[]'; - createdAt?: Date | null; - isPublic: number & Opt = 0; - createdVia: string & Opt = 'settings_ui'; - allowsClientCredentials: number & Opt = 0; - oauthConsentsCollection = new Collection(this); - oauthTokensCollection = new Collection(this); + client_id!: string; + client_secret_hash!: string; + redirect_uris: string & Opt = '[]'; + allowed_scopes: string & Opt = '[]'; + created_at?: string | null; + is_public: number & Opt = 0; + created_via: string & Opt = 'settings_ui'; + allows_client_credentials: number & Opt = 0; + oauth_consents_collection = new Collection(this); + oauth_tokens_collection = new Collection(this); } -export class OauthClientsRepository extends EntityRepository {} - export const OauthClientsSchema = defineEntity({ class: OauthClients, repository: () => OauthClientsRepository, properties: { id: p.text().primary().nullable(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').nullable().index('idx_oauth_clients_user'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').nullable().hidden().index('idx_oauth_clients_user'), + user_id: p.integer().nullable().persist(false).index('idx_oauth_clients_user'), name: p.text(), - clientId: p.text().unique('idx_oauth_clients_client_id'), - clientSecretHash: p.text(), - redirectUris: p.text(), - allowedScopes: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - isPublic: p.integer(), - createdVia: p.text(), - allowsClientCredentials: p.integer(), - oauthConsentsCollection: () => p.oneToMany(OauthConsents).mappedBy('client'), - oauthTokensCollection: () => p.oneToMany(OauthTokens).mappedBy('client'), + client_id: p.text().unique('idx_oauth_clients_client_id'), + client_secret_hash: p.text(), + redirect_uris: p.text().default('[]'), + allowed_scopes: p.text().default('[]'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + is_public: p.integer().default(0), + created_via: p.text().default('settings_ui'), + allows_client_credentials: p.integer().default(0), + oauth_consents_collection: () => p.oneToMany(OauthConsents).mappedBy('client').hidden(), + oauth_tokens_collection: () => p.oneToMany(OauthTokens).mappedBy('client').hidden(), }, }); diff --git a/server/src/db/entities/OauthConsents.entity.ts b/server/src/db/entities/OauthConsents.entity.ts index 432582fba..fb967fcfa 100644 --- a/server/src/db/entities/OauthConsents.entity.ts +++ b/server/src/db/entities/OauthConsents.entity.ts @@ -1,25 +1,29 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { OauthConsentsRepository } from '../repositories/OauthConsents.repository'; +import { DbTimestampType } from '../types'; import { OauthClients } from './OauthClients.entity'; import { Users } from './Users.entity'; export class OauthConsents { - id?: number | null; + id!: number & Opt; client!: Ref; + client_id!: string; user!: Ref; + user_id!: number; scopes: string & Opt = '[]'; - updatedAt?: Date | null; + updated_at?: string | null; } -export class OauthConsentsRepository extends EntityRepository {} - export const OauthConsentsSchema = defineEntity({ class: OauthConsents, repository: () => OauthConsentsRepository, properties: { - id: p.integer().primary().autoincrement(), - client: () => p.manyToOne(OauthClients).ref().name('client_id').deleteRule('cascade'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - scopes: p.text(), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + client: () => p.manyToOne(OauthClients).ref().name('client_id').deleteRule('cascade').hidden(), + client_id: p.text().persist(false), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + scopes: p.text().default('[]'), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/OauthTokens.entity.ts b/server/src/db/entities/OauthTokens.entity.ts index d6ac2dab6..dd127aa04 100644 --- a/server/src/db/entities/OauthTokens.entity.ts +++ b/server/src/db/entities/OauthTokens.entity.ts @@ -1,41 +1,47 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { OauthTokensRepository } from '../repositories/OauthTokens.repository'; +import { DbTimestampType } from '../types'; import { OauthClients } from './OauthClients.entity'; import { Users } from './Users.entity'; export class OauthTokens { - id?: number | null; + id!: number & Opt; client!: Ref; + client_id!: string; user!: Ref; - accessTokenHash!: string; - refreshTokenHash!: string; + user_id!: number; + access_token_hash!: string; + refresh_token_hash!: string; scopes: string & Opt = '[]'; - accessTokenExpiresAt!: Date; - refreshTokenExpiresAt!: Date; - revokedAt?: Date | null; - createdAt?: Date | null; + access_token_expires_at!: string; + refresh_token_expires_at!: string; + revoked_at?: string | null; + created_at?: string | null; parentToken?: Ref | null; + parent_token_id?: number | null; audience?: string | null; - oauthTokensCollection = new Collection(this); + oauth_tokens_collection = new Collection(this); } -export class OauthTokensRepository extends EntityRepository {} - export const OauthTokensSchema = defineEntity({ class: OauthTokens, repository: () => OauthTokensRepository, properties: { - id: p.integer().primary().autoincrement(), - client: () => p.manyToOne(OauthClients).ref().name('client_id').deleteRule('cascade'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_oauth_tokens_user'), - accessTokenHash: p.text().unique('idx_oauth_tokens_access'), - refreshTokenHash: p.text().unique('idx_oauth_tokens_refresh'), - scopes: p.text(), - accessTokenExpiresAt: p.datetime(), - refreshTokenExpiresAt: p.datetime(), - revokedAt: p.datetime().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - parentToken: () => p.manyToOne(OauthTokens).ref().nullable().index('idx_oauth_tokens_parent'), + id: p.integer().primary(), + client: () => p.manyToOne(OauthClients).ref().name('client_id').deleteRule('cascade').hidden(), + client_id: p.text().persist(false), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_oauth_tokens_user'), + user_id: p.integer().persist(false).index('idx_oauth_tokens_user'), + access_token_hash: p.text().unique('idx_oauth_tokens_access'), + refresh_token_hash: p.text().unique('idx_oauth_tokens_refresh'), + scopes: p.text().default('[]'), + access_token_expires_at: p.type(DbTimestampType), + refresh_token_expires_at: p.type(DbTimestampType), + revoked_at: p.type(DbTimestampType).nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + parentToken: () => p.manyToOne(OauthTokens).ref().nullable().hidden().index('idx_oauth_tokens_parent'), + parent_token_id: p.integer().nullable().persist(false).index('idx_oauth_tokens_parent'), audience: p.text().nullable(), - oauthTokensCollection: () => p.oneToMany(OauthTokens).mappedBy('parentToken'), + oauth_tokens_collection: () => p.oneToMany(OauthTokens).mappedBy('parentToken').hidden(), }, }); diff --git a/server/src/db/entities/PackingBags.entity.ts b/server/src/db/entities/PackingBags.entity.ts index 7bffd9358..b12735ba3 100644 --- a/server/src/db/entities/PackingBags.entity.ts +++ b/server/src/db/entities/PackingBags.entity.ts @@ -1,36 +1,40 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PackingBagsRepository } from '../repositories/PackingBags.repository'; +import { DbTimestampType } from '../types'; import { PackingItems } from './PackingItems.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class PackingBags { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; name!: string; color: string & Opt = '#6366f1'; - weightLimitGrams?: number | null; - sortOrder?: number | null = 0; - createdAt?: Date | null; + weight_limit_grams?: number | null; + sort_order?: number | null = 0; + created_at?: string | null; user?: Ref | null; - packingBagMembers = new Collection(this); - packingItemsCollection = new Collection(this); + user_id?: number | null = NaN; + packing_bag_members = new Collection(this); + packing_items_collection = new Collection(this); } -export class PackingBagsRepository extends EntityRepository {} - export const PackingBagsSchema = defineEntity({ class: PackingBags, repository: () => PackingBagsRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), name: p.text(), - color: p.text(), - weightLimitGrams: p.integer().nullable(), - sortOrder: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - user: () => p.manyToOne(Users).ref().nullable(), - packingBagMembers: () => p.manyToMany(Users).pivotTable('packing_bag_members').joinColumn('bag_id').inverseJoinColumn('user_id'), - packingItemsCollection: () => p.oneToMany(PackingItems).mappedBy('bag'), + color: p.text().default('#6366f1'), + weight_limit_grams: p.integer().nullable(), + sort_order: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + user: () => p.manyToOne(Users).ref().nullable().hidden().defaultRaw(`NULL`), + user_id: p.integer().nullable().persist(false).defaultRaw(`NULL`), + packing_bag_members: () => p.manyToMany(Users).pivotTable('packing_bag_members').joinColumn('bag_id').inverseJoinColumn('user_id').hidden(), + packing_items_collection: () => p.oneToMany(PackingItems).mappedBy('bag').hidden(), }, }); diff --git a/server/src/db/entities/PackingCategoryAssignees.entity.ts b/server/src/db/entities/PackingCategoryAssignees.entity.ts index 8bcaf29f6..877367e2c 100644 --- a/server/src/db/entities/PackingCategoryAssignees.entity.ts +++ b/server/src/db/entities/PackingCategoryAssignees.entity.ts @@ -1,23 +1,26 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PackingCategoryAssigneesRepository } from '../repositories/PackingCategoryAssignees.repository'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class PackingCategoryAssignees { - id?: number | null; + id!: number & Opt; trip!: Ref; - categoryName!: string; + trip_id!: number; + category_name!: string; user!: Ref; + user_id!: number; } -export class PackingCategoryAssigneesRepository extends EntityRepository {} - export const PackingCategoryAssigneesSchema = defineEntity({ class: PackingCategoryAssignees, repository: () => PackingCategoryAssigneesRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade'), - categoryName: p.text(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), + category_name: p.text(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), }, }); diff --git a/server/src/db/entities/PackingItemContributors.entity.ts b/server/src/db/entities/PackingItemContributors.entity.ts index 7189d9c96..e551ed9ba 100644 --- a/server/src/db/entities/PackingItemContributors.entity.ts +++ b/server/src/db/entities/PackingItemContributors.entity.ts @@ -1,24 +1,28 @@ -import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PackingItemContributorsRepository } from '../repositories/PackingItemContributors.repository'; +import { DbTimestampType } from '../types'; import { PackingItems } from './PackingItems.entity'; import { Users } from './Users.entity'; export class PackingItemContributors { [PrimaryKeyProp]?: ['item', 'user']; item!: Ref; + item_id!: number; user!: Ref; + user_id!: number; status: string & Opt = 'accepted'; - createdAt?: Date | null; + created_at?: string | null; } -export class PackingItemContributorsRepository extends EntityRepository {} - export const PackingItemContributorsSchema = defineEntity({ class: PackingItemContributors, repository: () => PackingItemContributorsRepository, properties: { - item: () => p.manyToOne(PackingItems).primary().ref(), - user: () => p.manyToOne(Users).primary().ref(), - status: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + item: () => p.manyToOne(PackingItems).primary().ref().hidden(), + item_id: p.integer().persist(false), + user: () => p.manyToOne(Users).primary().ref().hidden(), + user_id: p.integer().persist(false), + status: p.text().default('accepted'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/PackingItems.entity.ts b/server/src/db/entities/PackingItems.entity.ts index c40343431..b33631b59 100644 --- a/server/src/db/entities/PackingItems.entity.ts +++ b/server/src/db/entities/PackingItems.entity.ts @@ -1,49 +1,55 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PackingItemsRepository } from '../repositories/PackingItems.repository'; +import { DbTimestampType } from '../types'; import { PackingBags } from './PackingBags.entity'; import { PackingItemContributors } from './PackingItemContributors.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class PackingItems { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; name!: string; checked?: number | null = 0; category?: string | null; - sortOrder?: number | null = 0; - createdAt?: Date | null; - weightGrams?: number | null; + sort_order?: number | null = 0; + created_at?: string | null; + weight_grams?: number | null; bag?: Ref | null; + bag_id?: number | null; quantity: number & Opt = 1; - updatedAt?: Date | null; - isPrivate: number & Opt = 0; + updated_at?: string | null; + is_private: number & Opt = 0; owner?: Ref | null; - packingItemContributors = new Collection(this); - packingItemRecipients = new Collection(this); - packingItemContributorsCollection = new Collection(this); + owner_id?: number | null; + packing_item_contributors = new Collection(this); + packing_item_recipients = new Collection(this); + packing_item_contributors_collection = new Collection(this); } -export class PackingItemsRepository extends EntityRepository {} - export const PackingItemsSchema = defineEntity({ class: PackingItems, repository: () => PackingItemsRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_packing_items_trip_id'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_packing_items_trip_id'), + trip_id: p.integer().persist(false).index('idx_packing_items_trip_id'), name: p.text(), checked: p.integer().nullable(), category: p.text().nullable(), - sortOrder: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - weightGrams: p.integer().nullable(), - bag: () => p.manyToOne(PackingBags).ref().nullable(), - quantity: p.integer(), - updatedAt: p.datetime().nullable(), - isPrivate: p.integer(), - owner: () => p.manyToOne(Users).ref().nullable(), - packingItemContributors: () => p.manyToMany(Users).pivotTable('packing_item_contributors').pivotEntity(() => PackingItemContributors).joinColumn('item_id').inverseJoinColumn('user_id'), - packingItemRecipients: () => p.manyToMany(Users).pivotTable('packing_item_recipients').joinColumn('item_id').inverseJoinColumn('user_id'), - packingItemContributorsCollection: () => p.oneToMany(PackingItemContributors).mappedBy('item'), + sort_order: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + weight_grams: p.integer().nullable(), + bag: () => p.manyToOne(PackingBags).ref().nullable().hidden(), + bag_id: p.integer().nullable().persist(false), + quantity: p.integer().default(1), + updated_at: p.type(DbTimestampType).nullable(), + is_private: p.integer().default(0), + owner: () => p.manyToOne(Users).ref().nullable().hidden(), + owner_id: p.integer().nullable().persist(false), + packing_item_contributors: () => p.manyToMany(Users).pivotTable('packing_item_contributors').pivotEntity(() => PackingItemContributors).joinColumn('item_id').inverseJoinColumn('user_id').hidden(), + packing_item_recipients: () => p.manyToMany(Users).pivotTable('packing_item_recipients').joinColumn('item_id').inverseJoinColumn('user_id').hidden(), + packing_item_contributors_collection: () => p.oneToMany(PackingItemContributors).mappedBy('item').hidden(), }, }); diff --git a/server/src/db/entities/PackingTemplateCategories.entity.ts b/server/src/db/entities/PackingTemplateCategories.entity.ts index af5724e66..ae6cbcdcf 100644 --- a/server/src/db/entities/PackingTemplateCategories.entity.ts +++ b/server/src/db/entities/PackingTemplateCategories.entity.ts @@ -1,25 +1,26 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PackingTemplateCategoriesRepository } from '../repositories/PackingTemplateCategories.repository'; import { PackingTemplateItems } from './PackingTemplateItems.entity'; import { PackingTemplates } from './PackingTemplates.entity'; export class PackingTemplateCategories { - id?: number | null; + id!: number & Opt; template!: Ref; + template_id!: number; name!: string; - sortOrder: number & Opt = 0; - packingTemplateItemsCollection = new Collection(this); + sort_order: number & Opt = 0; + packing_template_items_collection = new Collection(this); } -export class PackingTemplateCategoriesRepository extends EntityRepository {} - export const PackingTemplateCategoriesSchema = defineEntity({ class: PackingTemplateCategories, repository: () => PackingTemplateCategoriesRepository, properties: { - id: p.integer().primary().autoincrement(), - template: () => p.manyToOne(PackingTemplates).ref().deleteRule('cascade'), + id: p.integer().primary(), + template: () => p.manyToOne(PackingTemplates).ref().deleteRule('cascade').hidden(), + template_id: p.integer().persist(false), name: p.text(), - sortOrder: p.integer(), - packingTemplateItemsCollection: () => p.oneToMany(PackingTemplateItems).mappedBy('category'), + sort_order: p.integer().default(0), + packing_template_items_collection: () => p.oneToMany(PackingTemplateItems).mappedBy('category').hidden(), }, }); diff --git a/server/src/db/entities/PackingTemplateItems.entity.ts b/server/src/db/entities/PackingTemplateItems.entity.ts index d11174657..344899ba6 100644 --- a/server/src/db/entities/PackingTemplateItems.entity.ts +++ b/server/src/db/entities/PackingTemplateItems.entity.ts @@ -1,22 +1,23 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PackingTemplateItemsRepository } from '../repositories/PackingTemplateItems.repository'; import { PackingTemplateCategories } from './PackingTemplateCategories.entity'; export class PackingTemplateItems { - id?: number | null; + id!: number & Opt; category!: Ref; + category_id!: number; name!: string; - sortOrder: number & Opt = 0; + sort_order: number & Opt = 0; } -export class PackingTemplateItemsRepository extends EntityRepository {} - export const PackingTemplateItemsSchema = defineEntity({ class: PackingTemplateItems, repository: () => PackingTemplateItemsRepository, properties: { - id: p.integer().primary().autoincrement(), - category: () => p.manyToOne(PackingTemplateCategories).ref().deleteRule('cascade'), + id: p.integer().primary(), + category: () => p.manyToOne(PackingTemplateCategories).ref().deleteRule('cascade').hidden(), + category_id: p.integer().persist(false), name: p.text(), - sortOrder: p.integer(), + sort_order: p.integer().default(0), }, }); diff --git a/server/src/db/entities/PackingTemplates.entity.ts b/server/src/db/entities/PackingTemplates.entity.ts index 90401773a..e10149e72 100644 --- a/server/src/db/entities/PackingTemplates.entity.ts +++ b/server/src/db/entities/PackingTemplates.entity.ts @@ -1,25 +1,27 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PackingTemplatesRepository } from '../repositories/PackingTemplates.repository'; +import { DbTimestampType } from '../types'; import { PackingTemplateCategories } from './PackingTemplateCategories.entity'; import { Users } from './Users.entity'; export class PackingTemplates { - id?: number | null; + id!: number & Opt; name!: string; - createdBy!: Ref; - createdAt?: Date | null; - packingTemplateCategoriesCollection = new Collection(this); + created_by!: number; + created_at?: string | null; + createdByRef!: Ref; + packing_template_categories_collection = new Collection(this); } -export class PackingTemplatesRepository extends EntityRepository {} - export const PackingTemplatesSchema = defineEntity({ class: PackingTemplates, repository: () => PackingTemplatesRepository, properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), name: p.text(), - createdBy: () => p.manyToOne(Users).ref().name('created_by').deleteRule('cascade'), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - packingTemplateCategoriesCollection: () => p.oneToMany(PackingTemplateCategories).mappedBy('template'), + created_by: p.integer().persist(false), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + createdByRef: () => p.manyToOne(Users).ref().joinColumn('created_by').deleteRule('cascade').hidden(), + packing_template_categories_collection: () => p.oneToMany(PackingTemplateCategories).mappedBy('template').hidden(), }, }); diff --git a/server/src/db/entities/PasswordResetTokens.entity.ts b/server/src/db/entities/PasswordResetTokens.entity.ts index ef180ca24..5a52dddb7 100644 --- a/server/src/db/entities/PasswordResetTokens.entity.ts +++ b/server/src/db/entities/PasswordResetTokens.entity.ts @@ -1,28 +1,30 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PasswordResetTokensRepository } from '../repositories/PasswordResetTokens.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class PasswordResetTokens { - id?: number | null; + id!: number & Opt; user!: Ref; - tokenHash!: string; - expiresAt!: Date; - consumedAt?: Date | null; - createdAt?: Date | null; - createdIp?: string | null; + user_id!: number; + token_hash!: string; + expires_at!: string; + consumed_at?: string | null; + created_at?: string | null; + created_ip?: string | null; } -export class PasswordResetTokensRepository extends EntityRepository {} - export const PasswordResetTokensSchema = defineEntity({ class: PasswordResetTokens, repository: () => PasswordResetTokensRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_prt_user'), - tokenHash: p.text().index('idx_prt_hash'), - expiresAt: p.datetime(), - consumedAt: p.datetime().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - createdIp: p.text().nullable(), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_prt_user'), + user_id: p.integer().persist(false).index('idx_prt_user'), + token_hash: p.text().index('idx_prt_hash'), + expires_at: p.type(DbTimestampType), + consumed_at: p.type(DbTimestampType).nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + created_ip: p.text().nullable(), }, }); diff --git a/server/src/db/entities/PhotoProviderFields.entity.ts b/server/src/db/entities/PhotoProviderFields.entity.ts index d67b64230..24688d55b 100644 --- a/server/src/db/entities/PhotoProviderFields.entity.ts +++ b/server/src/db/entities/PhotoProviderFields.entity.ts @@ -1,38 +1,39 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PhotoProviderFieldsRepository } from '../repositories/PhotoProviderFields.repository'; import { PhotoProviders } from './PhotoProviders.entity'; export class PhotoProviderFields { - id?: number | null; + id!: number & Opt; provider!: Ref; - fieldKey!: string; + provider_id!: string; + field_key!: string; label!: string; - inputType: string & Opt = 'text'; + input_type: string & Opt = 'text'; placeholder?: string | null; hint?: string | null; required?: number | null = 0; secret?: number | null = 0; - settingsKey?: string | null; - payloadKey?: string | null; - sortOrder?: number | null = 0; + settings_key?: string | null; + payload_key?: string | null; + sort_order?: number | null = 0; } -export class PhotoProviderFieldsRepository extends EntityRepository {} - export const PhotoProviderFieldsSchema = defineEntity({ class: PhotoProviderFields, repository: () => PhotoProviderFieldsRepository, properties: { - id: p.integer().primary().autoincrement(), - provider: () => p.manyToOne(PhotoProviders).ref().deleteRule('cascade'), - fieldKey: p.text(), + id: p.integer().primary(), + provider: () => p.manyToOne(PhotoProviders).ref().deleteRule('cascade').hidden(), + provider_id: p.text().persist(false), + field_key: p.text(), label: p.text(), - inputType: p.text(), + input_type: p.text().default('text'), placeholder: p.text().nullable(), hint: p.text().nullable(), required: p.integer().nullable(), secret: p.integer().nullable(), - settingsKey: p.text().nullable(), - payloadKey: p.text().nullable(), - sortOrder: p.integer().nullable(), + settings_key: p.text().nullable(), + payload_key: p.text().nullable(), + sort_order: p.integer().nullable(), }, }); diff --git a/server/src/db/entities/PhotoProviders.entity.ts b/server/src/db/entities/PhotoProviders.entity.ts index f6182a56f..4ac586d12 100644 --- a/server/src/db/entities/PhotoProviders.entity.ts +++ b/server/src/db/entities/PhotoProviders.entity.ts @@ -1,4 +1,5 @@ -import { Collection, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, defineEntity, p } from '@mikro-orm/core'; +import { PhotoProvidersRepository } from '../repositories/PhotoProviders.repository'; import { PhotoProviderFields } from './PhotoProviderFields.entity'; export class PhotoProviders { @@ -7,12 +8,10 @@ export class PhotoProviders { description?: string | null; icon?: string | null = 'Image'; enabled?: number | null = 0; - sortOrder?: number | null = 0; - photoProviderFieldsCollection = new Collection(this); + sort_order?: number | null = 0; + photo_provider_fields_collection = new Collection(this); } -export class PhotoProvidersRepository extends EntityRepository {} - export const PhotoProvidersSchema = defineEntity({ class: PhotoProviders, repository: () => PhotoProvidersRepository, @@ -22,7 +21,7 @@ export const PhotoProvidersSchema = defineEntity({ description: p.text().nullable(), icon: p.text().nullable(), enabled: p.integer().nullable(), - sortOrder: p.integer().nullable(), - photoProviderFieldsCollection: () => p.oneToMany(PhotoProviderFields).mappedBy('provider'), + sort_order: p.integer().nullable(), + photo_provider_fields_collection: () => p.oneToMany(PhotoProviderFields).mappedBy('provider').hidden(), }, }); diff --git a/server/src/db/entities/Photos.entity.ts b/server/src/db/entities/Photos.entity.ts index f5dbff978..543936da0 100644 --- a/server/src/db/entities/Photos.entity.ts +++ b/server/src/db/entities/Photos.entity.ts @@ -1,38 +1,44 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PhotosRepository } from '../repositories/Photos.repository'; +import { DbTimestampType } from '../types'; import { Days } from './Days.entity'; import { Places } from './Places.entity'; import { Trips } from './Trips.entity'; export class Photos { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; day?: Ref | null; + day_id?: number | null; place?: Ref | null; + place_id?: number | null; filename!: string; - originalName!: string; - fileSize?: number | null; - mimeType?: string | null; + original_name!: string; + file_size?: number | null; + mime_type?: string | null; caption?: string | null; - takenAt?: string | null; - createdAt?: Date | null; + taken_at?: string | null; + created_at?: string | null; } -export class PhotosRepository extends EntityRepository {} - export const PhotosSchema = defineEntity({ class: Photos, repository: () => PhotosRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_photos_trip_id'), - day: () => p.manyToOne(Days).ref().nullable().index('idx_photos_day_id'), - place: () => p.manyToOne(Places).ref().nullable().index('idx_photos_place_id'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_photos_trip_id'), + trip_id: p.integer().persist(false).index('idx_photos_trip_id'), + day: () => p.manyToOne(Days).ref().nullable().hidden().index('idx_photos_day_id'), + day_id: p.integer().nullable().persist(false).index('idx_photos_day_id'), + place: () => p.manyToOne(Places).ref().nullable().hidden().index('idx_photos_place_id'), + place_id: p.integer().nullable().persist(false).index('idx_photos_place_id'), filename: p.text(), - originalName: p.text(), - fileSize: p.integer().nullable(), - mimeType: p.text().nullable(), + original_name: p.text(), + file_size: p.integer().nullable(), + mime_type: p.text().nullable(), caption: p.text().nullable(), - takenAt: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + taken_at: p.text().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/PlaceDetailsCache.entity.ts b/server/src/db/entities/PlaceDetailsCache.entity.ts index dc51de62e..2a2594e55 100644 --- a/server/src/db/entities/PlaceDetailsCache.entity.ts +++ b/server/src/db/entities/PlaceDetailsCache.entity.ts @@ -1,24 +1,23 @@ -import { type Opt, PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { PlaceDetailsCacheRepository } from '../repositories/PlaceDetailsCache.repository'; export class PlaceDetailsCache { - [PrimaryKeyProp]?: ['placeId', 'lang', 'expanded']; - placeId!: string; + [PrimaryKeyProp]?: ['place_id', 'lang', 'expanded']; + place_id!: string; lang: string & Opt = ''; expanded: number & Opt = 0; - payloadJson!: string; - fetchedAt!: number; + payload_json!: string; + fetched_at!: number; } -export class PlaceDetailsCacheRepository extends EntityRepository {} - export const PlaceDetailsCacheSchema = defineEntity({ class: PlaceDetailsCache, repository: () => PlaceDetailsCacheRepository, properties: { - placeId: p.text().primary(), - lang: p.text().primary(), - expanded: p.integer().primary(), - payloadJson: p.text(), - fetchedAt: p.integer(), + place_id: p.text().primary(), + lang: p.text().primary().default(''), + expanded: p.integer().primary().default(0), + payload_json: p.text(), + fetched_at: p.integer(), }, }); diff --git a/server/src/db/entities/PlaceRatings.entity.ts b/server/src/db/entities/PlaceRatings.entity.ts index f2b1a2c48..963bb7703 100644 --- a/server/src/db/entities/PlaceRatings.entity.ts +++ b/server/src/db/entities/PlaceRatings.entity.ts @@ -1,25 +1,29 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PlaceRatingsRepository } from '../repositories/PlaceRatings.repository'; +import { DbTimestampType } from '../types'; import { Places } from './Places.entity'; import { Users } from './Users.entity'; export class PlaceRatings { - id?: number | null; + id!: number & Opt; place!: Ref; + place_id!: number; user!: Ref; + user_id!: number; rating!: number; - createdAt?: Date | null; + created_at?: string | null; } -export class PlaceRatingsRepository extends EntityRepository {} - export const PlaceRatingsSchema = defineEntity({ class: PlaceRatings, repository: () => PlaceRatingsRepository, properties: { - id: p.integer().primary().autoincrement(), - place: () => p.manyToOne(Places).ref().deleteRule('cascade').index('idx_place_ratings_place'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + place: () => p.manyToOne(Places).ref().deleteRule('cascade').hidden().index('idx_place_ratings_place'), + place_id: p.integer().persist(false).index('idx_place_ratings_place'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), rating: p.integer(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/PlaceRegions.entity.ts b/server/src/db/entities/PlaceRegions.entity.ts index f2b0fc5be..2ae7b2510 100644 --- a/server/src/db/entities/PlaceRegions.entity.ts +++ b/server/src/db/entities/PlaceRegions.entity.ts @@ -1,23 +1,24 @@ -import { PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PlaceRegionsRepository } from '../repositories/PlaceRegions.repository'; import { Places } from './Places.entity'; export class PlaceRegions { [PrimaryKeyProp]?: 'place'; place?: Ref | null; - countryCode!: string; - regionCode!: string; - regionName!: string; + place_id?: number | null; + country_code!: string; + region_code!: string; + region_name!: string; } -export class PlaceRegionsRepository extends EntityRepository {} - export const PlaceRegionsSchema = defineEntity({ class: PlaceRegions, repository: () => PlaceRegionsRepository, properties: { - place: () => p.oneToOne(Places).primary().ref().nullable(), - countryCode: p.text().index('idx_place_regions_country'), - regionCode: p.text().index('idx_place_regions_region'), - regionName: p.text(), + place: () => p.oneToOne(Places).primary().ref().nullable().hidden(), + place_id: p.integer().nullable().persist(false), + country_code: p.text().index('idx_place_regions_country'), + region_code: p.text().index('idx_place_regions_region'), + region_name: p.text(), }, }); diff --git a/server/src/db/entities/PlaceShadowPicks.entity.ts b/server/src/db/entities/PlaceShadowPicks.entity.ts index ada709086..2b404e766 100644 --- a/server/src/db/entities/PlaceShadowPicks.entity.ts +++ b/server/src/db/entities/PlaceShadowPicks.entity.ts @@ -1,39 +1,38 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PlaceShadowPicksRepository } from '../repositories/PlaceShadowPicks.repository'; export class PlaceShadowPicks { - id?: number | null; - createdAt!: string & Opt; + id!: number & Opt; + created_at!: string & Opt; query!: string; lang?: string | null; - biasLat?: unknown | null; - biasLng?: unknown | null; + bias_lat?: number | null; + bias_lng?: number | null; source!: string; - liveRank!: number; - liveCount!: number; - pickedName!: string; - pickedLat!: unknown; - pickedLng!: unknown; - pickedPlaceId?: string | null; + live_rank!: number; + live_count!: number; + picked_name!: string; + picked_lat!: number; + picked_lng!: number; + picked_place_id?: string | null; } -export class PlaceShadowPicksRepository extends EntityRepository {} - export const PlaceShadowPicksSchema = defineEntity({ class: PlaceShadowPicks, repository: () => PlaceShadowPicksRepository, properties: { - id: p.integer().primary().autoincrement(), - createdAt: p.text().defaultRaw(`(datetime('now'))`).index('idx_place_shadow_created'), + id: p.integer().primary(), + created_at: p.text().defaultRaw(`(datetime('now'))`).index('idx_place_shadow_created'), query: p.text(), lang: p.text().nullable(), - biasLat: p.double().nullable(), - biasLng: p.double().nullable(), + bias_lat: p.double().nullable(), + bias_lng: p.double().nullable(), source: p.text(), - liveRank: p.integer(), - liveCount: p.integer(), - pickedName: p.text(), - pickedLat: p.double(), - pickedLng: p.double(), - pickedPlaceId: p.text().nullable(), + live_rank: p.integer(), + live_count: p.integer(), + picked_name: p.text(), + picked_lat: p.double(), + picked_lng: p.double(), + picked_place_id: p.text().nullable(), }, }); diff --git a/server/src/db/entities/Places.entity.ts b/server/src/db/entities/Places.entity.ts index f8196a590..47afb472b 100644 --- a/server/src/db/entities/Places.entity.ts +++ b/server/src/db/entities/Places.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { PlacesRepository } from '../repositories/Places.repository'; +import { DbTimestampType } from '../types'; import { BudgetItems } from './BudgetItems.entity'; import { Categories } from './Categories.entity'; import { DawarichVisitSuggestions } from './DawarichVisitSuggestions.entity'; @@ -16,103 +18,105 @@ import { TripFiles } from './TripFiles.entity'; import { Trips } from './Trips.entity'; export class Places { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; name!: string; description?: string | null; - lat?: unknown | null; - lng?: unknown | null; + lat?: number | null; + lng?: number | null; address?: string | null; category?: Ref | null; - price?: unknown | null; + category_id?: number | null; + price?: number | null; currency?: string | null; - reservationStatus?: string | null = 'none'; - reservationNotes?: string | null; - reservationDatetime?: string | null; - placeTime?: string | null; - endTime?: string | null; - durationMinutes?: number | null = 60; + reservation_status?: string | null = 'none'; + reservation_notes?: string | null; + reservation_datetime?: string | null; + place_time?: string | null; + end_time?: string | null; + duration_minutes?: number | null = 60; notes?: string | null; - imageUrl?: string | null; - googlePlaceId?: string | null; - googleFtid?: string | null; + image_url?: string | null; + google_place_id?: string | null; + google_ftid?: string | null; website?: string | null; phone?: string | null; - transportMode?: string | null = 'walking'; - createdAt?: Date | null; - updatedAt?: Date | null; - osmId?: string | null; - routeGeometry?: string | null; - routeColor?: string | null; - stopType?: string | null; - fillPercent?: number | null; - amapPoiId?: string | null; + transport_mode?: string | null = 'walking'; + created_at?: string | null; + updated_at?: string | null; + osm_id?: string | null; + route_geometry?: string | null; + route_color?: string | null; + stop_type?: string | null; + fill_percent?: number | null; + amap_poi_id?: string | null; source?: string | null; - placeTags = new Collection(this); - budgetItemsCollection = new Collection(this); - dawarichVisitSuggestionsCollection = new Collection(this); - dayAccommodationsCollection = new Collection(this); - dayAssignmentsCollection = new Collection(this); - fileLinksCollection = new Collection(this); - journeyEntriesCollection = new Collection(this); - photosCollection = new Collection(this); - placeRatingsCollection = new Collection(this); - placeRegions: Ref | null = null; - reservationsCollection = new Collection(this); - roadtripDayTracksCollection = new Collection(this); - tripFilesCollection = new Collection(this); + place_tags = new Collection(this); + budget_items_collection = new Collection(this); + dawarich_visit_suggestions_collection = new Collection(this); + day_accommodations_collection = new Collection(this); + day_assignments_collection = new Collection(this); + file_links_collection = new Collection(this); + journey_entries_collection = new Collection(this); + photos_collection = new Collection(this); + place_ratings_collection = new Collection(this); + place_regions: Ref | null = null; + reservations_collection = new Collection(this); + roadtrip_day_tracks_collection = new Collection(this); + trip_files_collection = new Collection(this); } -export class PlacesRepository extends EntityRepository {} - export const PlacesSchema = defineEntity({ class: Places, repository: () => PlacesRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_places_trip_id'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_places_trip_id'), + trip_id: p.integer().persist(false).index('idx_places_trip_id'), name: p.text(), description: p.text().nullable(), lat: p.double().nullable(), lng: p.double().nullable(), address: p.text().nullable(), - category: () => p.manyToOne(Categories).ref().nullable().index('idx_places_category_id'), + category: () => p.manyToOne(Categories).ref().nullable().hidden().index('idx_places_category_id'), + category_id: p.integer().nullable().persist(false).index('idx_places_category_id'), price: p.double().nullable(), currency: p.text().nullable(), - reservationStatus: p.text().nullable(), - reservationNotes: p.text().nullable(), - reservationDatetime: p.text().nullable(), - placeTime: p.text().nullable(), - endTime: p.text().nullable(), - durationMinutes: p.integer().nullable(), + reservation_status: p.text().nullable(), + reservation_notes: p.text().nullable(), + reservation_datetime: p.text().nullable(), + place_time: p.text().nullable(), + end_time: p.text().nullable(), + duration_minutes: p.integer().nullable(), notes: p.text().nullable(), - imageUrl: p.text().nullable(), - googlePlaceId: p.text().nullable(), - googleFtid: p.text().nullable(), + image_url: p.text().nullable(), + google_place_id: p.text().nullable(), + google_ftid: p.text().nullable(), website: p.text().nullable(), phone: p.text().nullable(), - transportMode: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), - osmId: p.text().nullable(), - routeGeometry: p.text().nullable(), - routeColor: p.text().nullable(), - stopType: p.text().nullable(), - fillPercent: p.integer().nullable(), - amapPoiId: p.text().nullable(), + transport_mode: p.text().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + osm_id: p.text().nullable(), + route_geometry: p.text().nullable(), + route_color: p.text().nullable(), + stop_type: p.text().nullable(), + fill_percent: p.integer().nullable(), + amap_poi_id: p.text().nullable(), source: p.text().nullable(), - placeTags: () => p.manyToMany(Tags).pivotTable('place_tags').joinColumn('place_id').inverseJoinColumn('tag_id'), - budgetItemsCollection: () => p.oneToMany(BudgetItems).mappedBy('place'), - dawarichVisitSuggestionsCollection: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('acceptedPlace'), - dayAccommodationsCollection: () => p.oneToMany(DayAccommodations).mappedBy('place'), - dayAssignmentsCollection: () => p.oneToMany(DayAssignments).mappedBy('place'), - fileLinksCollection: () => p.oneToMany(FileLinks).mappedBy('place'), - journeyEntriesCollection: () => p.oneToMany(JourneyEntries).mappedBy('sourcePlace'), - photosCollection: () => p.oneToMany(Photos).mappedBy('place'), - placeRatingsCollection: () => p.oneToMany(PlaceRatings).mappedBy('place'), - placeRegions: () => p.oneToOne(PlaceRegions).ref().mappedBy('place'), - reservationsCollection: () => p.oneToMany(Reservations).mappedBy('place'), - roadtripDayTracksCollection: () => p.oneToMany(RoadtripDayTracks).mappedBy('place'), - tripFilesCollection: () => p.oneToMany(TripFiles).mappedBy('place'), + place_tags: () => p.manyToMany(Tags).pivotTable('place_tags').joinColumn('place_id').inverseJoinColumn('tag_id').hidden(), + budget_items_collection: () => p.oneToMany(BudgetItems).mappedBy('place').hidden(), + dawarich_visit_suggestions_collection: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('acceptedPlace').hidden(), + day_accommodations_collection: () => p.oneToMany(DayAccommodations).mappedBy('place').hidden(), + day_assignments_collection: () => p.oneToMany(DayAssignments).mappedBy('place').hidden(), + file_links_collection: () => p.oneToMany(FileLinks).mappedBy('place').hidden(), + journey_entries_collection: () => p.oneToMany(JourneyEntries).mappedBy('sourcePlace').hidden(), + photos_collection: () => p.oneToMany(Photos).mappedBy('place').hidden(), + place_ratings_collection: () => p.oneToMany(PlaceRatings).mappedBy('place').hidden(), + place_regions: () => p.oneToOne(PlaceRegions).ref().mappedBy('place').hidden(), + reservations_collection: () => p.oneToMany(Reservations).mappedBy('place').hidden(), + roadtrip_day_tracks_collection: () => p.oneToMany(RoadtripDayTracks).mappedBy('place').hidden(), + trip_files_collection: () => p.oneToMany(TripFiles).mappedBy('place').hidden(), }, }); diff --git a/server/src/db/entities/PluginActions.entity.ts b/server/src/db/entities/PluginActions.entity.ts index 3bbe7e6e8..69bcfc406 100644 --- a/server/src/db/entities/PluginActions.entity.ts +++ b/server/src/db/entities/PluginActions.entity.ts @@ -1,28 +1,27 @@ -import { type Opt, PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { PluginActionsRepository } from '../repositories/PluginActions.repository'; export class PluginActions { - [PrimaryKeyProp]?: ['pluginId', 'actionKey']; - pluginId!: string; - actionKey!: string; + [PrimaryKeyProp]?: ['plugin_id', 'action_key']; + plugin_id!: string; + action_key!: string; label!: string; hint?: string | null; danger: number & Opt = 0; - sortOrder: number & Opt = 0; + sort_order: number & Opt = 0; scope: string & Opt = 'user'; } -export class PluginActionsRepository extends EntityRepository {} - export const PluginActionsSchema = defineEntity({ class: PluginActions, repository: () => PluginActionsRepository, properties: { - pluginId: p.text().primary(), - actionKey: p.text().primary(), + plugin_id: p.text().primary(), + action_key: p.text().primary(), label: p.text(), hint: p.text().nullable(), - danger: p.integer(), - sortOrder: p.integer(), - scope: p.text(), + danger: p.integer().default(0), + sort_order: p.integer().default(0), + scope: p.text().default('user'), }, }); diff --git a/server/src/db/entities/PluginCapabilityAudit.entity.ts b/server/src/db/entities/PluginCapabilityAudit.entity.ts index 4dc8147de..3b9794d78 100644 --- a/server/src/db/entities/PluginCapabilityAudit.entity.ts +++ b/server/src/db/entities/PluginCapabilityAudit.entity.ts @@ -1,32 +1,31 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginCapabilityAuditRepository } from '../repositories/PluginCapabilityAudit.repository'; export class PluginCapabilityAudit { - id?: number | null; - pluginId!: string; - actingUserId?: number | null; + id!: number & Opt; + plugin_id!: string; + acting_user_id?: number | null; method!: string; resource?: string | null; code!: string; ts!: string & Opt; - prevHash?: string | null; + prev_hash?: string | null; hash!: string; } -export class PluginCapabilityAuditRepository extends EntityRepository {} - export const PluginCapabilityAuditSchema = defineEntity({ class: PluginCapabilityAudit, repository: () => PluginCapabilityAuditRepository, - indexes: [{ name: 'idx_plugin_audit_plugin', properties: ['pluginId', 'id'] }], + indexes: [{ name: 'idx_plugin_audit_plugin', properties: ['plugin_id', 'id'] }], properties: { - id: p.integer().primary().autoincrement(), - pluginId: p.text(), - actingUserId: p.integer().nullable(), + id: p.integer().primary(), + plugin_id: p.text(), + acting_user_id: p.integer().nullable(), method: p.text(), resource: p.text().nullable(), code: p.text(), ts: p.text().defaultRaw(`(datetime('now'))`), - prevHash: p.text().nullable(), + prev_hash: p.text().nullable(), hash: p.text(), }, }); diff --git a/server/src/db/entities/PluginEgressHosts.entity.ts b/server/src/db/entities/PluginEgressHosts.entity.ts index b20f368e8..0dc3c4775 100644 --- a/server/src/db/entities/PluginEgressHosts.entity.ts +++ b/server/src/db/entities/PluginEgressHosts.entity.ts @@ -1,21 +1,20 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginEgressHostsRepository } from '../repositories/PluginEgressHosts.repository'; export class PluginEgressHosts { - id?: number | null; - pluginId!: string; + id!: number & Opt; + plugin_id!: string; host!: string; - createdAt!: string & Opt; + created_at!: string & Opt; } -export class PluginEgressHostsRepository extends EntityRepository {} - export const PluginEgressHostsSchema = defineEntity({ class: PluginEgressHosts, repository: () => PluginEgressHostsRepository, properties: { - id: p.integer().primary().autoincrement(), - pluginId: p.text().index('idx_plugin_egress_hosts_plugin'), + id: p.integer().primary(), + plugin_id: p.text().index('idx_plugin_egress_hosts_plugin'), host: p.text(), - createdAt: p.text().defaultRaw(`(datetime('now'))`), + created_at: p.text().defaultRaw(`(datetime('now'))`), }, }); diff --git a/server/src/db/entities/PluginEntityMetadata.entity.ts b/server/src/db/entities/PluginEntityMetadata.entity.ts index 0458975df..ec3c7db17 100644 --- a/server/src/db/entities/PluginEntityMetadata.entity.ts +++ b/server/src/db/entities/PluginEntityMetadata.entity.ts @@ -1,33 +1,32 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginEntityMetadataRepository } from '../repositories/PluginEntityMetadata.repository'; export class PluginEntityMetadata { - id?: number | null; - pluginId!: string; - entityType!: string; - entityId!: number; + id!: number & Opt; + plugin_id!: string; + entity_type!: string; + entity_id!: number; key!: string; value?: string | null; - updatedAt!: string & Opt; + updated_at!: string & Opt; } -export class PluginEntityMetadataRepository extends EntityRepository {} - export const PluginEntityMetadataSchema = defineEntity({ class: PluginEntityMetadata, repository: () => PluginEntityMetadataRepository, indexes: [ { name: 'idx_plugin_meta_entity', - properties: ['pluginId', 'entityType', 'entityId'], + properties: ['plugin_id', 'entity_type', 'entity_id'], }, ], properties: { - id: p.integer().primary().autoincrement(), - pluginId: p.text(), - entityType: p.text(), - entityId: p.integer(), + id: p.integer().primary(), + plugin_id: p.text(), + entity_type: p.text(), + entity_id: p.integer(), key: p.text(), value: p.text().nullable(), - updatedAt: p.text().defaultRaw(`(datetime('now'))`), + updated_at: p.text().defaultRaw(`(datetime('now'))`), }, }); diff --git a/server/src/db/entities/PluginErrorLog.entity.ts b/server/src/db/entities/PluginErrorLog.entity.ts index 7f754546d..a9e85b81b 100644 --- a/server/src/db/entities/PluginErrorLog.entity.ts +++ b/server/src/db/entities/PluginErrorLog.entity.ts @@ -1,27 +1,27 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginErrorLogRepository } from '../repositories/PluginErrorLog.repository'; +import { DbTimestampType } from '../types'; export class PluginErrorLog { - id?: number | null; - pluginId!: string; - ts?: Date | null; + id!: number & Opt; + plugin_id!: string; + ts?: string | null; level: string & Opt = 'error'; message?: string | null; stack?: string | null; } -export class PluginErrorLogRepository extends EntityRepository {} - export const PluginErrorLogSchema = defineEntity({ class: PluginErrorLog, repository: () => PluginErrorLogRepository, indexes: [ - { name: 'idx_plugin_error_log_plugin', properties: ['pluginId', 'ts'] }, + { name: 'idx_plugin_error_log_plugin', properties: ['plugin_id', 'ts'] }, ], properties: { - id: p.integer().primary().autoincrement(), - pluginId: p.text(), - ts: p.datetime().nullable().onCreate(() => new Date()), - level: p.text(), + id: p.integer().primary(), + plugin_id: p.text(), + ts: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + level: p.text().default('error'), message: p.text().nullable(), stack: p.text().nullable(), }, diff --git a/server/src/db/entities/PluginMetaMigrations.entity.ts b/server/src/db/entities/PluginMetaMigrations.entity.ts index d0dbfa1d1..30aecd974 100644 --- a/server/src/db/entities/PluginMetaMigrations.entity.ts +++ b/server/src/db/entities/PluginMetaMigrations.entity.ts @@ -1,20 +1,20 @@ -import { PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { PluginMetaMigrationsRepository } from '../repositories/PluginMetaMigrations.repository'; +import { DbTimestampType } from '../types'; export class PluginMetaMigrations { - [PrimaryKeyProp]?: ['pluginId', 'migrationId']; - pluginId!: string; - migrationId!: string; - appliedAt?: Date | null; + [PrimaryKeyProp]?: ['plugin_id', 'migration_id']; + plugin_id!: string; + migration_id!: string; + applied_at?: string | null; } -export class PluginMetaMigrationsRepository extends EntityRepository {} - export const PluginMetaMigrationsSchema = defineEntity({ class: PluginMetaMigrations, repository: () => PluginMetaMigrationsRepository, properties: { - pluginId: p.text().primary(), - migrationId: p.text().primary(), - appliedAt: p.datetime().nullable().onCreate(() => new Date()), + plugin_id: p.text().primary(), + migration_id: p.text().primary(), + applied_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/PluginOauthState.entity.ts b/server/src/db/entities/PluginOauthState.entity.ts index 4e96c788f..3ad89c905 100644 --- a/server/src/db/entities/PluginOauthState.entity.ts +++ b/server/src/db/entities/PluginOauthState.entity.ts @@ -1,24 +1,23 @@ -import { PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { PluginOauthStateRepository } from '../repositories/PluginOauthState.repository'; export class PluginOauthState { [PrimaryKeyProp]?: 'state'; state?: string | null; - pluginId!: string; - userId!: number; + plugin_id!: string; + user_id!: number; verifier!: string; - createdAt!: number; + created_at!: number; } -export class PluginOauthStateRepository extends EntityRepository {} - export const PluginOauthStateSchema = defineEntity({ class: PluginOauthState, repository: () => PluginOauthStateRepository, properties: { state: p.text().primary().nullable(), - pluginId: p.text(), - userId: p.integer(), + plugin_id: p.text(), + user_id: p.integer(), verifier: p.text(), - createdAt: p.integer(), + created_at: p.integer(), }, }); diff --git a/server/src/db/entities/PluginOauthTokens.entity.ts b/server/src/db/entities/PluginOauthTokens.entity.ts index 0b14289c2..f4a97659b 100644 --- a/server/src/db/entities/PluginOauthTokens.entity.ts +++ b/server/src/db/entities/PluginOauthTokens.entity.ts @@ -1,28 +1,27 @@ -import { type Opt, PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { PluginOauthTokensRepository } from '../repositories/PluginOauthTokens.repository'; export class PluginOauthTokens { - [PrimaryKeyProp]?: ['pluginId', 'userId']; - pluginId!: string; - userId!: number; - accessToken?: string | null; - refreshToken?: string | null; - expiresAt?: number | null; + [PrimaryKeyProp]?: ['plugin_id', 'user_id']; + plugin_id!: string; + user_id!: number; + access_token?: string | null; + refresh_token?: string | null; + expires_at?: number | null; scope?: string | null; - updatedAt!: string & Opt; + updated_at!: string & Opt; } -export class PluginOauthTokensRepository extends EntityRepository {} - export const PluginOauthTokensSchema = defineEntity({ class: PluginOauthTokens, repository: () => PluginOauthTokensRepository, properties: { - pluginId: p.text().primary(), - userId: p.integer().primary(), - accessToken: p.text().nullable(), - refreshToken: p.text().nullable(), - expiresAt: p.integer().nullable(), + plugin_id: p.text().primary(), + user_id: p.integer().primary(), + access_token: p.text().nullable(), + refresh_token: p.text().nullable(), + expires_at: p.integer().nullable(), scope: p.text().nullable(), - updatedAt: p.text().defaultRaw(`(datetime('now'))`), + updated_at: p.text().defaultRaw(`(datetime('now'))`), }, }); diff --git a/server/src/db/entities/PluginScheduledTasks.entity.ts b/server/src/db/entities/PluginScheduledTasks.entity.ts index cc73d7dd1..6e392f283 100644 --- a/server/src/db/entities/PluginScheduledTasks.entity.ts +++ b/server/src/db/entities/PluginScheduledTasks.entity.ts @@ -1,27 +1,26 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginScheduledTasksRepository } from '../repositories/PluginScheduledTasks.repository'; export class PluginScheduledTasks { - id?: number | null; - pluginId!: string; + id!: number & Opt; + plugin_id!: string; name!: string; - dueAt!: number; + due_at!: number; payload: string & Opt = 'null'; - everyMs?: number | null; - createdAt!: string & Opt; + every_ms?: number | null; + created_at!: string & Opt; } -export class PluginScheduledTasksRepository extends EntityRepository {} - export const PluginScheduledTasksSchema = defineEntity({ class: PluginScheduledTasks, repository: () => PluginScheduledTasksRepository, properties: { - id: p.integer().primary().autoincrement(), - pluginId: p.text(), + id: p.integer().primary(), + plugin_id: p.text(), name: p.text(), - dueAt: p.integer().index('idx_plugin_sched_due'), - payload: p.text(), - everyMs: p.integer().nullable(), - createdAt: p.text().defaultRaw(`(datetime('now'))`), + due_at: p.integer().index('idx_plugin_sched_due'), + payload: p.text().default('null'), + every_ms: p.integer().nullable(), + created_at: p.text().defaultRaw(`(datetime('now'))`), }, }); diff --git a/server/src/db/entities/PluginSettingsFields.entity.ts b/server/src/db/entities/PluginSettingsFields.entity.ts index ba1333a04..c582c07a5 100644 --- a/server/src/db/entities/PluginSettingsFields.entity.ts +++ b/server/src/db/entities/PluginSettingsFields.entity.ts @@ -1,41 +1,40 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginSettingsFieldsRepository } from '../repositories/PluginSettingsFields.repository'; export class PluginSettingsFields { - id?: number | null; - pluginId!: string; - fieldKey!: string; + id!: number & Opt; + plugin_id!: string; + field_key!: string; label?: string | null; - inputType: string & Opt = 'text'; + input_type: string & Opt = 'text'; placeholder?: string | null; hint?: string | null; required: number & Opt = 0; secret: number & Opt = 0; scope: string & Opt = 'instance'; options?: string | null; - oauthConfig?: string | null; - sortOrder: number & Opt = 0; - defaultValue?: string | null; + oauth_config?: string | null; + sort_order: number & Opt = 0; + default_value?: string | null; } -export class PluginSettingsFieldsRepository extends EntityRepository {} - export const PluginSettingsFieldsSchema = defineEntity({ class: PluginSettingsFields, repository: () => PluginSettingsFieldsRepository, properties: { - id: p.integer().primary().autoincrement(), - pluginId: p.text(), - fieldKey: p.text(), + id: p.integer().primary(), + plugin_id: p.text(), + field_key: p.text(), label: p.text().nullable(), - inputType: p.text(), + input_type: p.text().default('text'), placeholder: p.text().nullable(), hint: p.text().nullable(), - required: p.integer(), - secret: p.integer(), - scope: p.text(), + required: p.integer().default(0), + secret: p.integer().default(0), + scope: p.text().default('instance'), options: p.text().nullable(), - oauthConfig: p.text().nullable(), - sortOrder: p.integer(), - defaultValue: p.text().nullable(), + oauth_config: p.text().nullable(), + sort_order: p.integer().default(0), + default_value: p.text().nullable(), }, }); diff --git a/server/src/db/entities/PluginUserConfig.entity.ts b/server/src/db/entities/PluginUserConfig.entity.ts index 1694aff15..041956895 100644 --- a/server/src/db/entities/PluginUserConfig.entity.ts +++ b/server/src/db/entities/PluginUserConfig.entity.ts @@ -1,22 +1,21 @@ -import { type Opt, PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { PluginUserConfigRepository } from '../repositories/PluginUserConfig.repository'; export class PluginUserConfig { - [PrimaryKeyProp]?: ['pluginId', 'userId']; - pluginId!: string; - userId!: number; + [PrimaryKeyProp]?: ['plugin_id', 'user_id']; + plugin_id!: string; + user_id!: number; config: string & Opt = '{}'; - updatedAt!: string & Opt; + updated_at!: string & Opt; } -export class PluginUserConfigRepository extends EntityRepository {} - export const PluginUserConfigSchema = defineEntity({ class: PluginUserConfig, repository: () => PluginUserConfigRepository, properties: { - pluginId: p.text().primary(), - userId: p.integer().primary(), - config: p.text(), - updatedAt: p.text().defaultRaw(`(datetime('now'))`), + plugin_id: p.text().primary(), + user_id: p.integer().primary(), + config: p.text().default('{}'), + updated_at: p.text().defaultRaw(`(datetime('now'))`), }, }); diff --git a/server/src/db/entities/PluginUserErasureQueue.entity.ts b/server/src/db/entities/PluginUserErasureQueue.entity.ts index a7abbc911..75ae8e4f2 100644 --- a/server/src/db/entities/PluginUserErasureQueue.entity.ts +++ b/server/src/db/entities/PluginUserErasureQueue.entity.ts @@ -1,21 +1,20 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginUserErasureQueueRepository } from '../repositories/PluginUserErasureQueue.repository'; export class PluginUserErasureQueue { - id?: number | null; - pluginId!: string; - userId!: number; - createdAt!: string & Opt; + id!: number & Opt; + plugin_id!: string; + user_id!: number; + created_at!: string & Opt; } -export class PluginUserErasureQueueRepository extends EntityRepository {} - export const PluginUserErasureQueueSchema = defineEntity({ class: PluginUserErasureQueue, repository: () => PluginUserErasureQueueRepository, properties: { - id: p.integer().primary().autoincrement(), - pluginId: p.text().index('idx_plugin_erasure_plugin'), - userId: p.integer(), - createdAt: p.text().defaultRaw(`(datetime('now'))`), + id: p.integer().primary(), + plugin_id: p.text().index('idx_plugin_erasure_plugin'), + user_id: p.integer(), + created_at: p.text().defaultRaw(`(datetime('now'))`), }, }); diff --git a/server/src/db/entities/Plugins.entity.ts b/server/src/db/entities/Plugins.entity.ts index 64977e99a..a6ad80056 100644 --- a/server/src/db/entities/Plugins.entity.ts +++ b/server/src/db/entities/Plugins.entity.ts @@ -1,4 +1,6 @@ -import { type Opt, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { PluginsRepository } from '../repositories/Plugins.repository'; +import { DbTimestampType } from '../types'; export class Plugins { id?: string | null; @@ -7,35 +9,33 @@ export class Plugins { type: string & Opt = 'integration'; icon?: string | null = 'Blocks'; version?: string | null; - apiVersion?: number | null = 1; - minTrekVersion?: string | null; + api_version?: number | null = 1; + min_trek_version?: string | null; permissions?: string | null = '[]'; - grantedPermissions?: string | null = '[]'; + granted_permissions?: string | null = '[]'; status: string & Opt = 'inactive'; config?: string | null = '{}'; - sourceRepo?: string | null; - sourceCommit?: string | null; + source_repo?: string | null; + source_commit?: string | null; sha256?: string | null; - crashCount: number & Opt = 0; - lastError?: string | null; - reviewedAt?: string | null; - sortOrder: number & Opt = 0; - installedAt?: Date | null; - updatedAt?: Date | null; + crash_count: number & Opt = 0; + last_error?: string | null; + reviewed_at?: string | null; + sort_order: number & Opt = 0; + installed_at?: string | null; + updated_at?: string | null; enabled: number & Opt = 0; capabilities: string & Opt = '{}'; - authorPubkey?: string | null; + author_pubkey?: string | null; dependencies: string & Opt = '{}'; - operatorEgress: number & Opt = 0; - updateBlockCode?: string | null; - updateBlockDetail?: string | null; - updateBlockVersion?: string | null; - trekRange?: string | null; - updateHold: number & Opt = 0; + operator_egress: number & Opt = 0; + update_block_code?: string | null; + update_block_detail?: string | null; + update_block_version?: string | null; + trek_range?: string | null; + update_hold: number & Opt = 0; } -export class PluginsRepository extends EntityRepository {} - export const PluginsSchema = defineEntity({ class: Plugins, repository: () => PluginsRepository, @@ -43,33 +43,33 @@ export const PluginsSchema = defineEntity({ id: p.text().primary().nullable(), name: p.text(), description: p.text().nullable(), - type: p.text(), + type: p.text().default('integration'), icon: p.text().nullable(), version: p.text().nullable(), - apiVersion: p.integer().nullable(), - minTrekVersion: p.text().nullable(), + api_version: p.integer().nullable(), + min_trek_version: p.text().nullable(), permissions: p.text().nullable(), - grantedPermissions: p.text().nullable(), - status: p.text(), + granted_permissions: p.text().nullable(), + status: p.text().default('inactive'), config: p.text().nullable(), - sourceRepo: p.text().nullable(), - sourceCommit: p.text().nullable(), + source_repo: p.text().nullable(), + source_commit: p.text().nullable(), sha256: p.text().nullable(), - crashCount: p.integer(), - lastError: p.text().nullable(), - reviewedAt: p.text().nullable(), - sortOrder: p.integer(), - installedAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), - enabled: p.integer(), - capabilities: p.text(), - authorPubkey: p.text().nullable(), - dependencies: p.text(), - operatorEgress: p.integer(), - updateBlockCode: p.text().nullable(), - updateBlockDetail: p.text().nullable(), - updateBlockVersion: p.text().nullable(), - trekRange: p.text().nullable(), - updateHold: p.integer(), + crash_count: p.integer().default(0), + last_error: p.text().nullable(), + reviewed_at: p.text().nullable(), + sort_order: p.integer().default(0), + installed_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + enabled: p.integer().default(0), + capabilities: p.text().default('{}'), + author_pubkey: p.text().nullable(), + dependencies: p.text().default('{}'), + operator_egress: p.integer().default(0), + update_block_code: p.text().nullable(), + update_block_detail: p.text().nullable(), + update_block_version: p.text().nullable(), + trek_range: p.text().nullable(), + update_hold: p.integer().default(0), }, }); diff --git a/server/src/db/entities/ReservationDayPositions.entity.ts b/server/src/db/entities/ReservationDayPositions.entity.ts index 0f9e8a213..dc05279f7 100644 --- a/server/src/db/entities/ReservationDayPositions.entity.ts +++ b/server/src/db/entities/ReservationDayPositions.entity.ts @@ -1,22 +1,25 @@ -import { PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { ReservationDayPositionsRepository } from '../repositories/ReservationDayPositions.repository'; import { Days } from './Days.entity'; import { Reservations } from './Reservations.entity'; export class ReservationDayPositions { [PrimaryKeyProp]?: ['reservation', 'day']; reservation!: Ref; + reservation_id!: number; day!: Ref; - position!: unknown; + day_id!: number; + position!: number; } -export class ReservationDayPositionsRepository extends EntityRepository {} - export const ReservationDayPositionsSchema = defineEntity({ class: ReservationDayPositions, repository: () => ReservationDayPositionsRepository, properties: { - reservation: () => p.manyToOne(Reservations).primary().ref(), - day: () => p.manyToOne(Days).primary().ref(), + reservation: () => p.manyToOne(Reservations).primary().ref().hidden(), + reservation_id: p.integer().persist(false), + day: () => p.manyToOne(Days).primary().ref().hidden(), + day_id: p.integer().persist(false), position: p.double(), }, }); diff --git a/server/src/db/entities/ReservationEndpoints.entity.ts b/server/src/db/entities/ReservationEndpoints.entity.ts index 2a484ec31..a83f00974 100644 --- a/server/src/db/entities/ReservationEndpoints.entity.ts +++ b/server/src/db/entities/ReservationEndpoints.entity.ts @@ -1,38 +1,40 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { ReservationEndpointsRepository } from '../repositories/ReservationEndpoints.repository'; +import { DbTimestampType } from '../types'; import { Reservations } from './Reservations.entity'; export class ReservationEndpoints { - id?: number | null; + id!: number & Opt; reservation!: Ref; + reservation_id!: number; role!: string; sequence: number & Opt = 0; name!: string; code?: string | null; - lat!: unknown; - lng!: unknown; + lat!: number; + lng!: number; timezone?: string | null; - localTime?: string | null; - localDate?: string | null; - createdAt?: Date | null; + local_time?: string | null; + local_date?: string | null; + created_at?: string | null; } -export class ReservationEndpointsRepository extends EntityRepository {} - export const ReservationEndpointsSchema = defineEntity({ class: ReservationEndpoints, repository: () => ReservationEndpointsRepository, properties: { - id: p.integer().primary().autoincrement(), - reservation: () => p.manyToOne(Reservations).ref().deleteRule('cascade').index('idx_reservation_endpoints_reservation_id'), + id: p.integer().primary(), + reservation: () => p.manyToOne(Reservations).ref().deleteRule('cascade').hidden().index('idx_reservation_endpoints_reservation_id'), + reservation_id: p.integer().persist(false).index('idx_reservation_endpoints_reservation_id'), role: p.text(), - sequence: p.integer(), + sequence: p.integer().default(0), name: p.text(), code: p.text().nullable(), lat: p.double(), lng: p.double(), timezone: p.text().nullable(), - localTime: p.text().nullable(), - localDate: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + local_time: p.text().nullable(), + local_date: p.text().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/ReservationTravelers.entity.ts b/server/src/db/entities/ReservationTravelers.entity.ts index 4f6c7eb86..b9c72aa5b 100644 --- a/server/src/db/entities/ReservationTravelers.entity.ts +++ b/server/src/db/entities/ReservationTravelers.entity.ts @@ -1,21 +1,24 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { ReservationTravelersRepository } from '../repositories/ReservationTravelers.repository'; import { Reservations } from './Reservations.entity'; import { Users } from './Users.entity'; export class ReservationTravelers { - id?: number | null; + id!: number & Opt; reservation!: Ref; + reservation_id!: number; user!: Ref; + user_id!: number; } -export class ReservationTravelersRepository extends EntityRepository {} - export const ReservationTravelersSchema = defineEntity({ class: ReservationTravelers, repository: () => ReservationTravelersRepository, properties: { - id: p.integer().primary().autoincrement(), - reservation: () => p.manyToOne(Reservations).ref().index('idx_reservation_travelers_res'), - user: () => p.manyToOne(Users).ref().index('idx_reservation_travelers_user'), + id: p.integer().primary(), + reservation: () => p.manyToOne(Reservations).ref().hidden().index('idx_reservation_travelers_res'), + reservation_id: p.integer().persist(false).index('idx_reservation_travelers_res'), + user: () => p.manyToOne(Users).ref().hidden().index('idx_reservation_travelers_user'), + user_id: p.integer().persist(false).index('idx_reservation_travelers_user'), }, }); diff --git a/server/src/db/entities/Reservations.entity.ts b/server/src/db/entities/Reservations.entity.ts index 4116e2b74..a7933bcb7 100644 --- a/server/src/db/entities/Reservations.entity.ts +++ b/server/src/db/entities/Reservations.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { ReservationsRepository } from '../repositories/Reservations.repository'; +import { DbTimestampType } from '../types'; import { BudgetItems } from './BudgetItems.entity'; import { DayAssignments } from './DayAssignments.entity'; import { Days } from './Days.entity'; @@ -11,85 +13,93 @@ import { TripFiles } from './TripFiles.entity'; import { Trips } from './Trips.entity'; export class Reservations { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; day?: Ref | null; + day_id?: number | null; endDay?: Ref | null; + end_day_id?: number | null; place?: Ref | null; + place_id?: number | null; assignment?: Ref | null; + assignment_id?: number | null; title!: string; - accommodationId?: string | null; - reservationTime?: string | null; - reservationEndTime?: string | null; + accommodation_id?: string | null; + reservation_time?: string | null; + reservation_end_time?: string | null; location?: string | null; - confirmationNumber?: string | null; + confirmation_number?: string | null; notes?: string | null; status?: string | null = 'pending'; type?: string | null = 'other'; - createdAt?: Date | null; + created_at?: string | null; metadata?: string | null; - dayPlanPosition?: unknown | null; - needsReview: number & Opt = 0; - externalSource?: string | null; - externalId?: string | null; - externalOwnerUserId?: number | null; - externalSyncedAt?: string | null; - syncEnabled?: number | null = 1; - externalHash?: string | null; + day_plan_position?: number | null; + needs_review: number & Opt = 0; + external_source?: string | null; + external_id?: string | null; + external_owner_user_id?: number | null; + external_synced_at?: string | null; + sync_enabled?: number | null = 1; + external_hash?: string | null; url?: string | null; - ingestState: string & Opt = 'live'; - budgetItemsCollection = new Collection(this); - fileLinksCollection = new Collection(this); - reservationDayPositionsCollection = new Collection(this); - reservationEndpointsCollection = new Collection(this); - reservationTravelersCollection = new Collection(this); - tripFilesCollection = new Collection(this); + ingest_state: string & Opt = 'live'; + budget_items_collection = new Collection(this); + file_links_collection = new Collection(this); + reservation_day_positions_collection = new Collection(this); + reservation_endpoints_collection = new Collection(this); + reservation_travelers_collection = new Collection(this); + trip_files_collection = new Collection(this); } -export class ReservationsRepository extends EntityRepository {} - export const ReservationsSchema = defineEntity({ class: Reservations, repository: () => ReservationsRepository, uniques: [ { name: 'idx_reservations_external', - properties: ['externalSource', 'externalId', 'trip'], + properties: ['external_source', 'external_id', 'trip_id'], }, ], properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_reservations_trip_id'), - day: () => p.manyToOne(Days).ref().nullable().index('idx_reservations_day_id'), - endDay: () => p.manyToOne(Days).ref().nullable(), - place: () => p.manyToOne(Places).ref().nullable(), - assignment: () => p.manyToOne(DayAssignments).ref().nullable(), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_reservations_trip_id'), + trip_id: p.integer().persist(false).index('idx_reservations_trip_id'), + day: () => p.manyToOne(Days).ref().nullable().hidden().index('idx_reservations_day_id'), + day_id: p.integer().nullable().persist(false).index('idx_reservations_day_id'), + endDay: () => p.manyToOne(Days).ref().nullable().hidden(), + end_day_id: p.integer().nullable().persist(false), + place: () => p.manyToOne(Places).ref().nullable().hidden(), + place_id: p.integer().nullable().persist(false), + assignment: () => p.manyToOne(DayAssignments).ref().nullable().hidden(), + assignment_id: p.integer().nullable().persist(false), title: p.text(), - accommodationId: p.text().nullable(), - reservationTime: p.text().nullable(), - reservationEndTime: p.text().nullable(), + accommodation_id: p.text().nullable(), + reservation_time: p.text().nullable(), + reservation_end_time: p.text().nullable(), location: p.text().nullable(), - confirmationNumber: p.text().nullable(), + confirmation_number: p.text().nullable(), notes: p.text().nullable(), status: p.text().nullable(), type: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), metadata: p.text().nullable(), - dayPlanPosition: p.double().nullable(), - needsReview: p.integer(), - externalSource: p.text().nullable(), - externalId: p.text().nullable(), - externalOwnerUserId: p.integer().nullable(), - externalSyncedAt: p.text().nullable(), - syncEnabled: p.integer().nullable(), - externalHash: p.text().nullable(), + day_plan_position: p.double().nullable().defaultRaw(`NULL`), + needs_review: p.integer().default(0), + external_source: p.text().nullable(), + external_id: p.text().nullable(), + external_owner_user_id: p.integer().nullable(), + external_synced_at: p.text().nullable(), + sync_enabled: p.integer().nullable(), + external_hash: p.text().nullable(), url: p.text().nullable(), - ingestState: p.text(), - budgetItemsCollection: () => p.oneToMany(BudgetItems).mappedBy('reservation'), - fileLinksCollection: () => p.oneToMany(FileLinks).mappedBy('reservation'), - reservationDayPositionsCollection: () => p.oneToMany(ReservationDayPositions).mappedBy('reservation'), - reservationEndpointsCollection: () => p.oneToMany(ReservationEndpoints).mappedBy('reservation'), - reservationTravelersCollection: () => p.oneToMany(ReservationTravelers).mappedBy('reservation'), - tripFilesCollection: () => p.oneToMany(TripFiles).mappedBy('reservation'), + ingest_state: p.text().default('live'), + budget_items_collection: () => p.oneToMany(BudgetItems).mappedBy('reservation').hidden(), + file_links_collection: () => p.oneToMany(FileLinks).mappedBy('reservation').hidden(), + reservation_day_positions_collection: () => p.oneToMany(ReservationDayPositions).mappedBy('reservation').hidden(), + reservation_endpoints_collection: () => p.oneToMany(ReservationEndpoints).mappedBy('reservation').hidden(), + reservation_travelers_collection: () => p.oneToMany(ReservationTravelers).mappedBy('reservation').hidden(), + trip_files_collection: () => p.oneToMany(TripFiles).mappedBy('reservation').hidden(), }, }); diff --git a/server/src/db/entities/RoadtripDayBoundaries.entity.ts b/server/src/db/entities/RoadtripDayBoundaries.entity.ts index b2054d6a4..1f33aa3f1 100644 --- a/server/src/db/entities/RoadtripDayBoundaries.entity.ts +++ b/server/src/db/entities/RoadtripDayBoundaries.entity.ts @@ -1,52 +1,41 @@ +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { RoadtripDayBoundariesRepository } from '../repositories/RoadtripDayBoundaries.repository'; import { DayAssignments } from './DayAssignments.entity'; import { Trips } from './Trips.entity'; -import { PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; - - - - - - - - - - - - - - - - export class RoadtripDayBoundaries { - [PrimaryKeyProp]?: ['trip', 'dayNumber']; + [PrimaryKeyProp]?: ['trip', 'day_number']; trip!: Ref; - dayNumber!: number; + trip_id!: number; + day_number!: number; fromAssignment!: Ref; + from_assignment_id!: number; toAssignment?: Ref | null; - fraction!: number; // was `unknown` + to_assignment_id?: number | null; + fraction!: number; } -export class RoadtripDayBoundariesRepository extends EntityRepository {} - export const RoadtripDayBoundariesSchema = defineEntity({ class: RoadtripDayBoundaries, repository: () => RoadtripDayBoundariesRepository, checks: [ { name: 'roadtrip_day_boundaries_fraction_check', - expression: 'fraction BETWEEN 0 AND 1', + expression: 'fraction BETWEEN 0 AND 1), PRIMARY KEY (trip_id, day_number', }, { name: 'roadtrip_day_boundaries_day_number_check', - expression: 'day_number BETWEEN 1 AND 366', + expression: 'day_number >= 1', }, ], properties: { - trip: () => p.manyToOne(Trips).primary().ref().deleteRule('cascade'), - dayNumber: p.integer().primary(), - fromAssignment: () => p.manyToOne(DayAssignments).ref().deleteRule('cascade'), - toAssignment: () => p.manyToOne(DayAssignments).ref().deleteRule('cascade').nullable(), + trip: () => p.manyToOne(Trips).primary().ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), + day_number: p.integer().primary(), + fromAssignment: () => p.manyToOne(DayAssignments).ref().deleteRule('cascade').hidden(), + from_assignment_id: p.integer().persist(false), + toAssignment: () => p.manyToOne(DayAssignments).ref().deleteRule('cascade').nullable().hidden(), + to_assignment_id: p.integer().nullable().persist(false), fraction: p.double(), }, }); diff --git a/server/src/db/entities/RoadtripDayTracks.entity.ts b/server/src/db/entities/RoadtripDayTracks.entity.ts index 00a69aca8..e5ee859a2 100644 --- a/server/src/db/entities/RoadtripDayTracks.entity.ts +++ b/server/src/db/entities/RoadtripDayTracks.entity.ts @@ -1,27 +1,27 @@ +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { RoadtripDayTracksRepository } from '../repositories/RoadtripDayTracks.repository'; import { Days } from './Days.entity'; import { Places } from './Places.entity'; -import { defineEntity, EntityRepository, p, PrimaryKeyProp, type Ref } from '@mikro-orm/core'; export class RoadtripDayTracks { [PrimaryKeyProp]?: 'day'; day?: Ref | null; + day_id?: number | null; place!: Ref; - strayKm?: unknown | null; - createdAt?: string | null; + place_id!: number; + stray_km?: number | null; + created_at?: string | null; } -export class RoadtripDayTracksRepository extends EntityRepository {} - export const RoadtripDayTracksSchema = defineEntity({ class: RoadtripDayTracks, repository: () => RoadtripDayTracksRepository, properties: { - day: () => p.oneToOne(Days).primary().ref().nullable(), - place: () => p.manyToOne(Places).ref().deleteRule('cascade').index('idx_roadtrip_day_tracks_place'), - strayKm: p.double().nullable(), - createdAt: p - .text() - .nullable() - .onCreate(() => new Date().toISOString().replace(/\.\d{3}Z$/, 'Z')), + day: () => p.oneToOne(Days).primary().ref().nullable().hidden(), + day_id: p.integer().nullable().persist(false), + place: () => p.manyToOne(Places).ref().deleteRule('cascade').hidden().index('idx_roadtrip_day_tracks_place'), + place_id: p.integer().persist(false).index('idx_roadtrip_day_tracks_place'), + stray_km: p.double().nullable(), + created_at: p.text().nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/RoadtripPreferences.entity.ts b/server/src/db/entities/RoadtripPreferences.entity.ts index 1b48d9a68..508ff5be8 100644 --- a/server/src/db/entities/RoadtripPreferences.entity.ts +++ b/server/src/db/entities/RoadtripPreferences.entity.ts @@ -1,20 +1,21 @@ -import { PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { RoadtripPreferencesRepository } from '../repositories/RoadtripPreferences.repository'; import { Trips } from './Trips.entity'; export class RoadtripPreferences { [PrimaryKeyProp]?: ['trip', 'key']; trip!: Ref; + trip_id!: number; key!: string; value!: string; } -export class RoadtripPreferencesRepository extends EntityRepository {} - export const RoadtripPreferencesSchema = defineEntity({ class: RoadtripPreferences, repository: () => RoadtripPreferencesRepository, properties: { - trip: () => p.manyToOne(Trips).primary().ref().deleteRule('cascade'), + trip: () => p.manyToOne(Trips).primary().ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), key: p.text().primary(), value: p.text(), }, diff --git a/server/src/db/entities/RoadtripVias.entity.ts b/server/src/db/entities/RoadtripVias.entity.ts index 7c3b560a8..85e191491 100644 --- a/server/src/db/entities/RoadtripVias.entity.ts +++ b/server/src/db/entities/RoadtripVias.entity.ts @@ -1,37 +1,35 @@ +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { RoadtripViasRepository } from '../repositories/RoadtripVias.repository'; import { Days } from './Days.entity'; -import { defineEntity, EntityRepository, type Opt, p, type Ref } from '@mikro-orm/core'; export class RoadtripVias { - id?: number | null; + id!: number & Opt; day!: Ref; - afterOrderIndex!: number; + day_id!: number; + after_order_index!: number; sequence: number & Opt = 0; - lat!: unknown; - lng!: unknown; - createdAt?: string | null; + lat!: number; + lng!: number; + created_at?: string | null; } -export class RoadtripViasRepository extends EntityRepository {} - export const RoadtripViasSchema = defineEntity({ class: RoadtripVias, repository: () => RoadtripViasRepository, indexes: [ { name: 'idx_roadtrip_vias_day', - properties: ['day', 'afterOrderIndex', 'sequence'], + properties: ['day_id', 'after_order_index', 'sequence'], }, ], properties: { - id: p.integer().primary().autoincrement(), - day: () => p.manyToOne(Days).ref().deleteRule('cascade'), - afterOrderIndex: p.integer(), - sequence: p.integer(), + id: p.integer().primary(), + day: () => p.manyToOne(Days).ref().deleteRule('cascade').hidden(), + day_id: p.integer().persist(false), + after_order_index: p.integer(), + sequence: p.integer().default(0), lat: p.double(), lng: p.double(), - createdAt: p - .text() - .nullable() - .onCreate(() => new Date().toISOString().replace(/\.\d{3}Z$/, 'Z')), + created_at: p.text().nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/RouteUsageDaily.entity.ts b/server/src/db/entities/RouteUsageDaily.entity.ts index 8ad61424d..457def889 100644 --- a/server/src/db/entities/RouteUsageDaily.entity.ts +++ b/server/src/db/entities/RouteUsageDaily.entity.ts @@ -1,19 +1,18 @@ -import { type Opt, PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { RouteUsageDailyRepository } from '../repositories/RouteUsageDaily.repository'; export class RouteUsageDaily { - [PrimaryKeyProp]?: ['day', 'profile', 'surface', 'selfHosted']; + [PrimaryKeyProp]?: ['day', 'profile', 'surface', 'self_hosted']; day!: string; profile!: string; surface!: string; - selfHosted!: number; + self_hosted!: number; requests: number & Opt = 0; waypoints: number & Opt = 0; - km!: number; + km!: number & Opt; failed: number & Opt = 0; } -export class RouteUsageDailyRepository extends EntityRepository {} - export const RouteUsageDailySchema = defineEntity({ class: RouteUsageDaily, repository: () => RouteUsageDailyRepository, @@ -21,10 +20,10 @@ export const RouteUsageDailySchema = defineEntity({ day: p.text().primary().index('idx_route_usage_day'), profile: p.text().primary(), surface: p.text().primary(), - selfHosted: p.integer().primary(), - requests: p.integer(), - waypoints: p.integer(), - km: p.double().default(0), - failed: p.integer(), + self_hosted: p.integer().primary(), + requests: p.integer().default(0), + waypoints: p.integer().default(0), + km: p.double().defaultRaw(`0`), + failed: p.integer().default(0), }, }); diff --git a/server/src/db/entities/SchemaVersion.entity.ts b/server/src/db/entities/SchemaVersion.entity.ts index 1704216b0..6ffda26e7 100644 --- a/server/src/db/entities/SchemaVersion.entity.ts +++ b/server/src/db/entities/SchemaVersion.entity.ts @@ -1,17 +1,16 @@ -import { defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, defineEntity, p } from '@mikro-orm/core'; +import { SchemaVersionRepository } from '../repositories/SchemaVersion.repository'; export class SchemaVersion { - id?: number | null; + id!: number & Opt; version!: number; } -export class SchemaVersionRepository extends EntityRepository {} - export const SchemaVersionSchema = defineEntity({ class: SchemaVersion, repository: () => SchemaVersionRepository, properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), version: p.integer(), }, }); diff --git a/server/src/db/entities/SchoolHolidayCountries.entity.ts b/server/src/db/entities/SchoolHolidayCountries.entity.ts index cadfda2b3..ac923f800 100644 --- a/server/src/db/entities/SchoolHolidayCountries.entity.ts +++ b/server/src/db/entities/SchoolHolidayCountries.entity.ts @@ -1,21 +1,20 @@ -import { Collection, PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { SchoolHolidayCountriesRepository } from '../repositories/SchoolHolidayCountries.repository'; import { SchoolHolidayRegions } from './SchoolHolidayRegions.entity'; export class SchoolHolidayCountries { [PrimaryKeyProp]?: 'code'; code?: string | null; name!: string; - schoolHolidayRegionsCollection = new Collection(this); + school_holiday_regions_collection = new Collection(this); } -export class SchoolHolidayCountriesRepository extends EntityRepository {} - export const SchoolHolidayCountriesSchema = defineEntity({ class: SchoolHolidayCountries, repository: () => SchoolHolidayCountriesRepository, properties: { code: p.text().primary().nullable(), name: p.text(), - schoolHolidayRegionsCollection: () => p.oneToMany(SchoolHolidayRegions).mappedBy('country'), + school_holiday_regions_collection: () => p.oneToMany(SchoolHolidayRegions).mappedBy('countryRef').hidden(), }, }); diff --git a/server/src/db/entities/SchoolHolidayPeriods.entity.ts b/server/src/db/entities/SchoolHolidayPeriods.entity.ts index 182de8c35..60bb25f1c 100644 --- a/server/src/db/entities/SchoolHolidayPeriods.entity.ts +++ b/server/src/db/entities/SchoolHolidayPeriods.entity.ts @@ -1,16 +1,16 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { SchoolHolidayPeriodsRepository } from '../repositories/SchoolHolidayPeriods.repository'; import { SchoolHolidayRegions } from './SchoolHolidayRegions.entity'; export class SchoolHolidayPeriods { - id?: number | null; + id!: number & Opt; region!: Ref; + region_id!: number; name!: string; - startDate!: string; - endDate!: string; + start_date!: string; + end_date!: string; } -export class SchoolHolidayPeriodsRepository extends EntityRepository {} - export const SchoolHolidayPeriodsSchema = defineEntity({ class: SchoolHolidayPeriods, repository: () => SchoolHolidayPeriodsRepository, @@ -21,10 +21,11 @@ export const SchoolHolidayPeriodsSchema = defineEntity({ }, ], properties: { - id: p.integer().primary().autoincrement(), - region: () => p.manyToOne(SchoolHolidayRegions).ref().deleteRule('cascade').index('idx_school_holiday_periods_region'), + id: p.integer().primary(), + region: () => p.manyToOne(SchoolHolidayRegions).ref().deleteRule('cascade').hidden().index('idx_school_holiday_periods_region'), + region_id: p.integer().persist(false).index('idx_school_holiday_periods_region'), name: p.text(), - startDate: p.text(), - endDate: p.text(), + start_date: p.text(), + end_date: p.text(), }, }); diff --git a/server/src/db/entities/SchoolHolidayRegions.entity.ts b/server/src/db/entities/SchoolHolidayRegions.entity.ts index 3c70491cc..58fad25a6 100644 --- a/server/src/db/entities/SchoolHolidayRegions.entity.ts +++ b/server/src/db/entities/SchoolHolidayRegions.entity.ts @@ -1,25 +1,26 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { SchoolHolidayRegionsRepository } from '../repositories/SchoolHolidayRegions.repository'; import { SchoolHolidayCountries } from './SchoolHolidayCountries.entity'; import { SchoolHolidayPeriods } from './SchoolHolidayPeriods.entity'; export class SchoolHolidayRegions { - id?: number | null; - country!: Ref; + id!: number & Opt; + country!: string; name!: string; revision: number & Opt = 1; - schoolHolidayPeriodsCollection = new Collection(this); + countryRef!: Ref; + school_holiday_periods_collection = new Collection(this); } -export class SchoolHolidayRegionsRepository extends EntityRepository {} - export const SchoolHolidayRegionsSchema = defineEntity({ class: SchoolHolidayRegions, repository: () => SchoolHolidayRegionsRepository, properties: { - id: p.integer().primary().autoincrement(), - country: () => p.manyToOne(SchoolHolidayCountries).ref().joinColumn('country'), + id: p.integer().primary(), + country: p.text().persist(false), name: p.text().collation('NOCASE'), - revision: p.integer(), - schoolHolidayPeriodsCollection: () => p.oneToMany(SchoolHolidayPeriods).mappedBy('region'), + revision: p.integer().default(1), + countryRef: () => p.manyToOne(SchoolHolidayCountries).ref().joinColumn('country').hidden(), + school_holiday_periods_collection: () => p.oneToMany(SchoolHolidayPeriods).mappedBy('region').hidden(), }, }); diff --git a/server/src/db/entities/Settings.entity.ts b/server/src/db/entities/Settings.entity.ts index c14a10613..87fd3f431 100644 --- a/server/src/db/entities/Settings.entity.ts +++ b/server/src/db/entities/Settings.entity.ts @@ -1,21 +1,22 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { SettingsRepository } from '../repositories/Settings.repository'; import { Users } from './Users.entity'; export class Settings { - id?: number | null; + id!: number & Opt; user!: Ref; + user_id!: number; key!: string; value?: string | null; } -export class SettingsRepository extends EntityRepository {} - export const SettingsSchema = defineEntity({ class: Settings, repository: () => SettingsRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), key: p.text(), value: p.text().nullable(), }, diff --git a/server/src/db/entities/ShareTokens.entity.ts b/server/src/db/entities/ShareTokens.entity.ts index 373551b56..cf81cb285 100644 --- a/server/src/db/entities/ShareTokens.entity.ts +++ b/server/src/db/entities/ShareTokens.entity.ts @@ -1,37 +1,41 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { ShareTokensRepository } from '../repositories/ShareTokens.repository'; +import { DbTimestampType } from '../types'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class ShareTokens { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; token!: string; - createdBy!: Ref; - shareMap?: number | null = 1; - shareBookings?: number | null = 1; - sharePacking?: number | null = 0; - shareBudget?: number | null = 0; - shareCollab?: number | null = 0; - createdAt?: Date | null; - expiresAt?: string | null; + created_by!: number; + share_map?: number | null = 1; + share_bookings?: number | null = 1; + share_packing?: number | null = 0; + share_budget?: number | null = 0; + share_collab?: number | null = 0; + created_at?: string | null; + expires_at?: string | null; + createdByRef!: Ref; } -export class ShareTokensRepository extends EntityRepository {} - export const ShareTokensSchema = defineEntity({ class: ShareTokens, repository: () => ShareTokensRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), token: p.text().index('idx_share_tokens_token'), - createdBy: () => p.manyToOne(Users).ref().name('created_by'), - shareMap: p.integer().nullable(), - shareBookings: p.integer().nullable(), - sharePacking: p.integer().nullable(), - shareBudget: p.integer().nullable(), - shareCollab: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - expiresAt: p.text().nullable(), + created_by: p.integer().persist(false), + share_map: p.integer().nullable(), + share_bookings: p.integer().nullable(), + share_packing: p.integer().nullable(), + share_budget: p.integer().nullable(), + share_collab: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + expires_at: p.text().nullable(), + createdByRef: () => p.manyToOne(Users).ref().joinColumn('created_by').hidden(), }, }); diff --git a/server/src/db/entities/Tags.entity.ts b/server/src/db/entities/Tags.entity.ts index 4841b1220..3cc1a4186 100644 --- a/server/src/db/entities/Tags.entity.ts +++ b/server/src/db/entities/Tags.entity.ts @@ -1,30 +1,32 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TagsRepository } from '../repositories/Tags.repository'; +import { DbTimestampType } from '../types'; import { CollectionPlaces } from './CollectionPlaces.entity'; import { Places } from './Places.entity'; import { Users } from './Users.entity'; export class Tags { - id?: number | null; + id!: number & Opt; user!: Ref; + user_id!: number; name!: string; color?: string | null = '#10b981'; - createdAt?: Date | null; - collectionPlaceTagsInverse = new Collection(this); - placeTagsInverse = new Collection(this); + created_at?: string | null; + collection_place_tags_inverse = new Collection(this); + place_tags_inverse = new Collection(this); } -export class TagsRepository extends EntityRepository {} - export const TagsSchema = defineEntity({ class: Tags, repository: () => TagsRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), name: p.text(), color: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - collectionPlaceTagsInverse: () => p.manyToMany(CollectionPlaces).mappedBy('collectionPlaceTags'), - placeTagsInverse: () => p.manyToMany(Places).mappedBy('placeTags'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + collection_place_tags_inverse: () => p.manyToMany(CollectionPlaces).mappedBy('collection_place_tags').hidden(), + place_tags_inverse: () => p.manyToMany(Places).mappedBy('place_tags').hidden(), }, }); diff --git a/server/src/db/entities/TodoCategoryAssignees.entity.ts b/server/src/db/entities/TodoCategoryAssignees.entity.ts index 85a972db3..dccd2bd17 100644 --- a/server/src/db/entities/TodoCategoryAssignees.entity.ts +++ b/server/src/db/entities/TodoCategoryAssignees.entity.ts @@ -1,23 +1,26 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TodoCategoryAssigneesRepository } from '../repositories/TodoCategoryAssignees.repository'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class TodoCategoryAssignees { - id?: number | null; + id!: number & Opt; trip!: Ref; - categoryName!: string; + trip_id!: number; + category_name!: string; user!: Ref; + user_id!: number; } -export class TodoCategoryAssigneesRepository extends EntityRepository {} - export const TodoCategoryAssigneesSchema = defineEntity({ class: TodoCategoryAssignees, repository: () => TodoCategoryAssigneesRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade'), - categoryName: p.text(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), + category_name: p.text(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), }, }); diff --git a/server/src/db/entities/TodoItems.entity.ts b/server/src/db/entities/TodoItems.entity.ts index d2761df2c..ab18f2bfd 100644 --- a/server/src/db/entities/TodoItems.entity.ts +++ b/server/src/db/entities/TodoItems.entity.ts @@ -1,39 +1,43 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TodoItemsRepository } from '../repositories/TodoItems.repository'; +import { DbTimestampType } from '../types'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class TodoItems { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; name!: string; checked?: number | null = 0; category?: string | null; - sortOrder?: number | null = 0; - dueDate?: string | null; + sort_order?: number | null = 0; + due_date?: string | null; description?: string | null; assignedUser?: Ref | null; + assigned_user_id?: number | null; priority?: number | null = 0; - createdAt?: Date | null; - remindedAt?: Date | null; + created_at?: string | null; + reminded_at?: string | null; } -export class TodoItemsRepository extends EntityRepository {} - export const TodoItemsSchema = defineEntity({ class: TodoItems, repository: () => TodoItemsRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_todo_items_trip_id'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_todo_items_trip_id'), + trip_id: p.integer().persist(false).index('idx_todo_items_trip_id'), name: p.text(), checked: p.integer().nullable(), category: p.text().nullable(), - sortOrder: p.integer().nullable(), - dueDate: p.text().nullable(), + sort_order: p.integer().nullable(), + due_date: p.text().nullable(), description: p.text().nullable(), - assignedUser: () => p.manyToOne(Users).ref().nullable(), + assignedUser: () => p.manyToOne(Users).ref().nullable().hidden(), + assigned_user_id: p.integer().nullable().persist(false), priority: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - remindedAt: p.datetime().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + reminded_at: p.type(DbTimestampType).nullable(), }, }); diff --git a/server/src/db/entities/TrekPhotoCacheMeta.entity.ts b/server/src/db/entities/TrekPhotoCacheMeta.entity.ts index 6a3e86fe9..3f4e66d96 100644 --- a/server/src/db/entities/TrekPhotoCacheMeta.entity.ts +++ b/server/src/db/entities/TrekPhotoCacheMeta.entity.ts @@ -1,20 +1,19 @@ -import { type Opt, PrimaryKeyProp, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, PrimaryKeyProp, defineEntity, p } from '@mikro-orm/core'; +import { TrekPhotoCacheMetaRepository } from '../repositories/TrekPhotoCacheMeta.repository'; export class TrekPhotoCacheMeta { - [PrimaryKeyProp]?: 'cacheKey'; - cacheKey?: string | null; - contentType: string & Opt = 'image/jpeg'; - fetchedAt!: number; + [PrimaryKeyProp]?: 'cache_key'; + cache_key?: string | null; + content_type: string & Opt = 'image/jpeg'; + fetched_at!: number; } -export class TrekPhotoCacheMetaRepository extends EntityRepository {} - export const TrekPhotoCacheMetaSchema = defineEntity({ class: TrekPhotoCacheMeta, repository: () => TrekPhotoCacheMetaRepository, properties: { - cacheKey: p.text().primary().nullable(), - contentType: p.text(), - fetchedAt: p.integer().index('idx_trek_photo_cache_meta_fetched_at'), + cache_key: p.text().primary().nullable(), + content_type: p.text().default('image/jpeg'), + fetched_at: p.integer().index('idx_trek_photo_cache_meta_fetched_at'), }, }); diff --git a/server/src/db/entities/TrekPhotos.entity.ts b/server/src/db/entities/TrekPhotos.entity.ts index 7d044574c..019e7526e 100644 --- a/server/src/db/entities/TrekPhotos.entity.ts +++ b/server/src/db/entities/TrekPhotos.entity.ts @@ -1,30 +1,31 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TrekPhotosRepository } from '../repositories/TrekPhotos.repository'; +import { DbTimestampType } from '../types'; import { JourneyPhotos } from './JourneyPhotos.entity'; import { TripPhotos } from './TripPhotos.entity'; import { Users } from './Users.entity'; export class TrekPhotos { - id?: number | null; + id!: number & Opt; provider!: string; - assetId?: string | null; + asset_id?: string | null; owner?: Ref | null; - filePath?: string | null; - thumbnailPath?: string | null; + owner_id?: number | null; + file_path?: string | null; + thumbnail_path?: string | null; width?: number | null; height?: number | null; - createdAt?: Date | null; + created_at?: string | null; passphrase?: string | null; - mediaType: string & Opt = 'image'; - durationMs?: number | null; - takenAt?: string | null; - lat?: unknown | null; - lng?: unknown | null; - journeyPhotosCollection = new Collection(this); - tripPhotosCollection = new Collection(this); + media_type: string & Opt = 'image'; + duration_ms?: number | null; + taken_at?: string | null; + lat?: number | null; + lng?: number | null; + journey_photos_collection = new Collection(this); + trip_photos_collection = new Collection(this); } -export class TrekPhotosRepository extends EntityRepository {} - export const TrekPhotosSchema = defineEntity({ class: TrekPhotos, repository: () => TrekPhotosRepository, @@ -39,26 +40,27 @@ export const TrekPhotosSchema = defineEntity({ { name: 'idx_trek_photos_provider_asset', where: 'asset_id IS NOT NULL', - properties: ['provider', 'assetId', 'owner'], + properties: ['provider', 'asset_id', 'owner_id'], }, ], properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), provider: p.text(), - assetId: p.text().nullable(), - owner: () => p.manyToOne(Users).ref().nullable().index('idx_trek_photos_owner'), - filePath: p.text().nullable(), - thumbnailPath: p.text().nullable(), + asset_id: p.text().nullable(), + owner: () => p.manyToOne(Users).ref().nullable().hidden().index('idx_trek_photos_owner'), + owner_id: p.integer().nullable().persist(false).index('idx_trek_photos_owner'), + file_path: p.text().nullable(), + thumbnail_path: p.text().nullable(), width: p.integer().nullable(), height: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - passphrase: p.text().nullable(), - mediaType: p.text(), - durationMs: p.integer().nullable(), - takenAt: p.text().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + passphrase: p.text().nullable().defaultRaw(`NULL`), + media_type: p.text().default('image'), + duration_ms: p.integer().nullable(), + taken_at: p.text().nullable(), lat: p.double().nullable(), lng: p.double().nullable(), - journeyPhotosCollection: () => p.oneToMany(JourneyPhotos).mappedBy('photo'), - tripPhotosCollection: () => p.oneToMany(TripPhotos).mappedBy('photo'), + journey_photos_collection: () => p.oneToMany(JourneyPhotos).mappedBy('photo').hidden(), + trip_photos_collection: () => p.oneToMany(TripPhotos).mappedBy('photo').hidden(), }, }); diff --git a/server/src/db/entities/TripAlbumLinks.entity.ts b/server/src/db/entities/TripAlbumLinks.entity.ts index 5d1dd892e..c50ff84b3 100644 --- a/server/src/db/entities/TripAlbumLinks.entity.ts +++ b/server/src/db/entities/TripAlbumLinks.entity.ts @@ -1,38 +1,42 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TripAlbumLinksRepository } from '../repositories/TripAlbumLinks.repository'; +import { DbTimestampType } from '../types'; import { TripPhotos } from './TripPhotos.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class TripAlbumLinks { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; user!: Ref; + user_id!: number; provider!: string; - albumId!: string; - albumName: string & Opt = ''; - syncEnabled: number & Opt = 1; - lastSyncedAt?: Date | null; - createdAt?: Date | null; + album_id!: string; + album_name: string & Opt = ''; + sync_enabled: number & Opt = 1; + last_synced_at?: string | null; + created_at?: string | null; passphrase?: string | null; - tripPhotosCollection = new Collection(this); + trip_photos_collection = new Collection(this); } -export class TripAlbumLinksRepository extends EntityRepository {} - export const TripAlbumLinksSchema = defineEntity({ class: TripAlbumLinks, repository: () => TripAlbumLinksRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_trip_album_links_trip'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_trip_album_links_trip'), + trip_id: p.integer().persist(false).index('idx_trip_album_links_trip'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), provider: p.text(), - albumId: p.text(), - albumName: p.text(), - syncEnabled: p.integer(), - lastSyncedAt: p.datetime().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - passphrase: p.text().nullable(), - tripPhotosCollection: () => p.oneToMany(TripPhotos).mappedBy('albumLink'), + album_id: p.text(), + album_name: p.text().default(''), + sync_enabled: p.integer().default(1), + last_synced_at: p.type(DbTimestampType).nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + passphrase: p.text().nullable().defaultRaw(`NULL`), + trip_photos_collection: () => p.oneToMany(TripPhotos).mappedBy('albumLink').hidden(), }, }); diff --git a/server/src/db/entities/TripDocumentLinks.entity.ts b/server/src/db/entities/TripDocumentLinks.entity.ts new file mode 100644 index 000000000..3c84083fe --- /dev/null +++ b/server/src/db/entities/TripDocumentLinks.entity.ts @@ -0,0 +1,86 @@ +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TripDocumentLinksRepository } from '../repositories/TripDocumentLinks.repository'; +import { DbTimestampType } from '../types'; +import { DocumentConnections } from './DocumentConnections.entity'; +import { DocumentSyncItems } from './DocumentSyncItems.entity'; +import { Trips } from './Trips.entity'; +import { Users } from './Users.entity'; + +export class TripDocumentLinks { + id!: number & Opt; + trip!: Ref; + trip_id!: number; + connection!: Ref; + connection_id!: number; + provider_id!: string; + remote_scope_key!: string; + remote_root_id?: string | null; + remote_root_path?: string | null; + remote_label: string & Opt = ''; + direction: string & Opt = 'both'; + delete_policy: string & Opt = 'unlink'; + conflict_policy: string & Opt = 'manual'; + sync_enabled: number & Opt = 1; + webhook_token?: string | null; + webhook_secret?: string | null; + webhook_subscription_id?: string | null; + remote_cursor?: string | null; + last_sync_at?: string | null; + last_sync_state: string & Opt = 'never'; + last_sync_error?: string | null; + failure_count: number & Opt = 0; + next_attempt_at?: string | null; + created_by?: number | null; + created_at?: string | null; + updated_at?: string | null; + createdByRef?: Ref | null; + document_sync_items_collection = new Collection(this); +} + +export const TripDocumentLinksSchema = defineEntity({ + class: TripDocumentLinks, + repository: () => TripDocumentLinksRepository, + indexes: [ + { + name: 'idx_trip_document_links_due', + properties: ['sync_enabled', 'next_attempt_at'], + }, + ], + uniques: [ + { + name: 'idx_trip_document_links_token', + where: 'webhook_token IS NOT NULL', + properties: ['webhook_token'], + }, + ], + properties: { + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_trip_document_links_trip'), + trip_id: p.integer().persist(false).index('idx_trip_document_links_trip'), + connection: () => p.manyToOne(DocumentConnections).ref().deleteRule('cascade').hidden(), + connection_id: p.integer().persist(false), + provider_id: p.text(), + remote_scope_key: p.text(), + remote_root_id: p.text().nullable(), + remote_root_path: p.text().nullable(), + remote_label: p.text().default(''), + direction: p.text().default('both'), + delete_policy: p.text().default('unlink'), + conflict_policy: p.text().default('manual'), + sync_enabled: p.integer().default(1), + webhook_token: p.text().nullable(), + webhook_secret: p.text().nullable(), + webhook_subscription_id: p.text().nullable(), + remote_cursor: p.text().nullable(), + last_sync_at: p.text().nullable(), + last_sync_state: p.text().default('never'), + last_sync_error: p.text().nullable(), + failure_count: p.integer().default(0), + next_attempt_at: p.text().nullable(), + created_by: p.integer().nullable().persist(false), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + createdByRef: () => p.manyToOne(Users).ref().joinColumn('created_by').nullable().hidden(), + document_sync_items_collection: () => p.oneToMany(DocumentSyncItems).mappedBy('link').hidden(), + }, +}); diff --git a/server/src/db/entities/TripFiles.entity.ts b/server/src/db/entities/TripFiles.entity.ts index 241ae960c..bb40e02b8 100644 --- a/server/src/db/entities/TripFiles.entity.ts +++ b/server/src/db/entities/TripFiles.entity.ts @@ -1,6 +1,9 @@ -import { Collection, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TripFilesRepository } from '../repositories/TripFiles.repository'; +import { DbTimestampType } from '../types'; import { CollabMessages } from './CollabMessages.entity'; import { CollabNotes } from './CollabNotes.entity'; +import { DocumentSyncItems } from './DocumentSyncItems.entity'; import { FileLinks } from './FileLinks.entity'; import { Places } from './Places.entity'; import { Reservations } from './Reservations.entity'; @@ -8,45 +11,57 @@ import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class TripFiles { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; place?: Ref | null; + place_id?: number | null; reservation?: Ref | null; + reservation_id?: number | null; filename!: string; - originalName!: string; - fileSize?: number | null; - mimeType?: string | null; + original_name!: string; + file_size?: number | null; + mime_type?: string | null; description?: string | null; - createdAt?: Date | null; + created_at?: string | null; note?: Ref | null; - uploadedBy?: Ref | null; + note_id?: number | null; + uploaded_by?: number | null; starred?: number | null = 0; - deletedAt?: string | null; + deleted_at?: string | null; message?: Ref | null; - fileLinksCollection = new Collection(this); + message_id?: number | null; + uploadedByRef?: Ref | null; + document_sync_items_collection = new Collection(this); + file_links_collection = new Collection(this); } -export class TripFilesRepository extends EntityRepository {} - export const TripFilesSchema = defineEntity({ class: TripFiles, repository: () => TripFilesRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_trip_files_trip_id'), - place: () => p.manyToOne(Places).ref().nullable(), - reservation: () => p.manyToOne(Reservations).ref().nullable(), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_trip_files_trip_id'), + trip_id: p.integer().persist(false).index('idx_trip_files_trip_id'), + place: () => p.manyToOne(Places).ref().nullable().hidden(), + place_id: p.integer().nullable().persist(false), + reservation: () => p.manyToOne(Reservations).ref().nullable().hidden(), + reservation_id: p.integer().nullable().persist(false), filename: p.text(), - originalName: p.text(), - fileSize: p.integer().nullable(), - mimeType: p.text().nullable(), + original_name: p.text(), + file_size: p.integer().nullable(), + mime_type: p.text().nullable(), description: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - note: () => p.manyToOne(CollabNotes).ref().nullable(), - uploadedBy: () => p.manyToOne(Users).ref().name('uploaded_by').nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + note: () => p.manyToOne(CollabNotes).ref().nullable().hidden(), + note_id: p.integer().nullable().persist(false), + uploaded_by: p.integer().nullable().persist(false), starred: p.integer().nullable(), - deletedAt: p.text().nullable(), - message: () => p.manyToOne(CollabMessages).ref().deleteRule('cascade').nullable().index('idx_trip_files_message_id'), - fileLinksCollection: () => p.oneToMany(FileLinks).mappedBy('file'), + deleted_at: p.text().nullable(), + message: () => p.manyToOne(CollabMessages).ref().deleteRule('cascade').nullable().hidden().index('idx_trip_files_message_id'), + message_id: p.integer().nullable().persist(false).index('idx_trip_files_message_id'), + uploadedByRef: () => p.manyToOne(Users).ref().joinColumn('uploaded_by').nullable().hidden(), + document_sync_items_collection: () => p.oneToMany(DocumentSyncItems).mappedBy('file').hidden(), + file_links_collection: () => p.oneToMany(FileLinks).mappedBy('file').hidden(), }, }); diff --git a/server/src/db/entities/TripInviteTokens.entity.ts b/server/src/db/entities/TripInviteTokens.entity.ts index 91e2f540c..09a76b35b 100644 --- a/server/src/db/entities/TripInviteTokens.entity.ts +++ b/server/src/db/entities/TripInviteTokens.entity.ts @@ -1,27 +1,31 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TripInviteTokensRepository } from '../repositories/TripInviteTokens.repository'; +import { DbTimestampType } from '../types'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class TripInviteTokens { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; token!: string; - createdBy?: Ref | null; - expiresAt?: string | null; - createdAt?: Date | null; + created_by?: number | null; + expires_at?: string | null; + created_at?: string | null; + createdByRef?: Ref | null; } -export class TripInviteTokensRepository extends EntityRepository {} - export const TripInviteTokensSchema = defineEntity({ class: TripInviteTokens, repository: () => TripInviteTokensRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade'), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(), + trip_id: p.integer().persist(false), token: p.text().index('idx_trip_invite_tokens_token'), - createdBy: () => p.manyToOne(Users).ref().name('created_by').nullable(), - expiresAt: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + created_by: p.integer().nullable().persist(false), + expires_at: p.text().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + createdByRef: () => p.manyToOne(Users).ref().joinColumn('created_by').nullable().hidden(), }, }); diff --git a/server/src/db/entities/TripMembers.entity.ts b/server/src/db/entities/TripMembers.entity.ts index 4b7603b69..1d2119afe 100644 --- a/server/src/db/entities/TripMembers.entity.ts +++ b/server/src/db/entities/TripMembers.entity.ts @@ -1,25 +1,31 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TripMembersRepository } from '../repositories/TripMembers.repository'; +import { DbTimestampType } from '../types'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class TripMembers { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; user!: Ref; - invitedBy?: Ref | null; - addedAt?: Date | null; + user_id!: number; + invited_by?: number | null; + added_at?: string | null; + invitedByRef?: Ref | null; } -export class TripMembersRepository extends EntityRepository {} - export const TripMembersSchema = defineEntity({ class: TripMembers, repository: () => TripMembersRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_trip_members_trip_id'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_trip_members_user_id'), - invitedBy: () => p.manyToOne(Users).ref().name('invited_by').nullable(), - addedAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_trip_members_trip_id'), + trip_id: p.integer().persist(false).index('idx_trip_members_trip_id'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_trip_members_user_id'), + user_id: p.integer().persist(false).index('idx_trip_members_user_id'), + invited_by: p.integer().nullable().persist(false), + added_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + invitedByRef: () => p.manyToOne(Users).ref().joinColumn('invited_by').nullable().hidden(), }, }); diff --git a/server/src/db/entities/TripPhotos.entity.ts b/server/src/db/entities/TripPhotos.entity.ts index 4af411bf7..e82a29746 100644 --- a/server/src/db/entities/TripPhotos.entity.ts +++ b/server/src/db/entities/TripPhotos.entity.ts @@ -1,31 +1,39 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { TripPhotosRepository } from '../repositories/TripPhotos.repository'; +import { DbTimestampType } from '../types'; import { TrekPhotos } from './TrekPhotos.entity'; import { TripAlbumLinks } from './TripAlbumLinks.entity'; import { Trips } from './Trips.entity'; import { Users } from './Users.entity'; export class TripPhotos { - id?: number | null; + id!: number & Opt; trip!: Ref; + trip_id!: number; user!: Ref; + user_id!: number; photo!: Ref; + photo_id!: number; shared: number & Opt = 1; albumLink?: Ref | null; - addedAt?: Date | null; + album_link_id?: number | null; + added_at?: string | null; } -export class TripPhotosRepository extends EntityRepository {} - export const TripPhotosSchema = defineEntity({ class: TripPhotos, repository: () => TripPhotosRepository, properties: { - id: p.integer().primary().autoincrement(), - trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').index('idx_trip_photos_trip'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - photo: () => p.manyToOne(TrekPhotos).ref().deleteRule('cascade').index('idx_trip_photos_photo'), - shared: p.integer(), - albumLink: () => p.manyToOne(TripAlbumLinks).ref().nullable(), - addedAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden().index('idx_trip_photos_trip'), + trip_id: p.integer().persist(false).index('idx_trip_photos_trip'), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + photo: () => p.manyToOne(TrekPhotos).ref().deleteRule('cascade').hidden().index('idx_trip_photos_photo'), + photo_id: p.integer().persist(false).index('idx_trip_photos_photo'), + shared: p.integer().default(1), + albumLink: () => p.manyToOne(TripAlbumLinks).ref().nullable().hidden(), + album_link_id: p.integer().nullable().persist(false), + added_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/Trips.entity.ts b/server/src/db/entities/Trips.entity.ts index e7a9d196b..2a4655480 100644 --- a/server/src/db/entities/Trips.entity.ts +++ b/server/src/db/entities/Trips.entity.ts @@ -1,4 +1,4 @@ -import { Collection, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; import { TripsRepository } from '../repositories/Trips.repository'; import { DbTimestampType } from '../types'; import { BudgetCategoryOrder } from './BudgetCategoryOrder.entity'; @@ -12,6 +12,8 @@ import { DawarichVisitSuggestions } from './DawarichVisitSuggestions.entity'; import { DayAccommodations } from './DayAccommodations.entity'; import { DayNotes } from './DayNotes.entity'; import { Days } from './Days.entity'; +import { DocumentConnections } from './DocumentConnections.entity'; +import { DocumentSyncItems } from './DocumentSyncItems.entity'; import { InviteTokens } from './InviteTokens.entity'; import { JourneyEntries } from './JourneyEntries.entity'; import { JourneyTrips } from './JourneyTrips.entity'; @@ -27,6 +29,7 @@ import { ShareTokens } from './ShareTokens.entity'; import { TodoCategoryAssignees } from './TodoCategoryAssignees.entity'; import { TodoItems } from './TodoItems.entity'; import { TripAlbumLinks } from './TripAlbumLinks.entity'; +import { TripDocumentLinks } from './TripDocumentLinks.entity'; import { TripFiles } from './TripFiles.entity'; import { TripInviteTokens } from './TripInviteTokens.entity'; import { TripMembers } from './TripMembers.entity'; @@ -34,7 +37,7 @@ import { TripPhotos } from './TripPhotos.entity'; import { Users } from './Users.entity'; export class Trips { - id?: number | null; + id!: number & Opt; user!: Ref; user_id!: number; title!: string; @@ -59,6 +62,8 @@ export class Trips { day_accommodations_collection = new Collection(this); day_notes_collection = new Collection(this); days_collection = new Collection(this); + document_connections_collection = new Collection(this); + document_sync_items_collection = new Collection(this); invite_tokens_collection = new Collection(this); journey_entries_collection = new Collection(this); journey_trips_collection = new Collection(this); @@ -74,6 +79,7 @@ export class Trips { todo_category_assignees_collection = new Collection(this); todo_items_collection = new Collection(this); trip_album_links_collection = new Collection(this); + trip_document_links_collection = new Collection(this); trip_files_collection = new Collection(this); trip_invite_tokens_collection = new Collection(this); trip_members_collection = new Collection(this); @@ -91,9 +97,9 @@ export const TripsSchema = defineEntity({ }, ], properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().hidden().deleteRule('cascade').index('idx_trips_user_id'), - user_id: p.integer().persist(false), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_trips_user_id'), + user_id: p.integer().persist(false).index('idx_trips_user_id'), title: p.text(), description: p.text().nullable(), start_date: p.text().nullable(), @@ -103,37 +109,40 @@ export const TripsSchema = defineEntity({ is_archived: p.integer().nullable(), reminder_days: p.integer().nullable(), feed_token: p.text().nullable(), - created_at: p.type(DbTimestampType).nullable().index('idx_trips_created_at').defaultRaw('CURRENT_TIMESTAMP'), - updated_at: p.type(DbTimestampType).nullable().defaultRaw('CURRENT_TIMESTAMP'), - budget_category_order_collection: () => p.oneToMany(BudgetCategoryOrder).hidden().mappedBy('trip'), - budget_items_collection: () => p.oneToMany(BudgetItems).hidden().mappedBy('trip'), - budget_settlements_collection: () => p.oneToMany(BudgetSettlements).hidden().mappedBy('trip'), - collab_links_collection: () => p.oneToMany(CollabLinks).hidden().mappedBy('trip'), - collab_messages_collection: () => p.oneToMany(CollabMessages).hidden().mappedBy('trip'), - collab_notes_collection: () => p.oneToMany(CollabNotes).hidden().mappedBy('trip'), - collab_polls_collection: () => p.oneToMany(CollabPolls).hidden().mappedBy('trip'), - dawarich_visit_suggestions_collection: () => p.oneToMany(DawarichVisitSuggestions).hidden().mappedBy('trip'), - day_accommodations_collection: () => p.oneToMany(DayAccommodations).hidden().mappedBy('trip'), - day_notes_collection: () => p.oneToMany(DayNotes).hidden().mappedBy('trip'), - days_collection: () => p.oneToMany(Days).hidden().mappedBy('trip'), - invite_tokens_collection: () => p.oneToMany(InviteTokens).hidden().mappedBy('trip'), - journey_entries_collection: () => p.oneToMany(JourneyEntries).hidden().mappedBy('sourceTrip'), - journey_trips_collection: () => p.oneToMany(JourneyTrips).hidden().mappedBy('trip'), - packing_bags_collection: () => p.oneToMany(PackingBags).hidden().mappedBy('trip'), - packing_category_assignees_collection: () => p.oneToMany(PackingCategoryAssignees).hidden().mappedBy('trip'), - packing_items_collection: () => p.oneToMany(PackingItems).hidden().mappedBy('trip'), - photos_collection: () => p.oneToMany(Photos).hidden().mappedBy('trip'), - places_collection: () => p.oneToMany(Places).hidden().mappedBy('trip'), - reservations_collection: () => p.oneToMany(Reservations).hidden().mappedBy('trip'), - roadtrip_day_boundaries_collection: () => p.oneToMany(RoadtripDayBoundaries).hidden().mappedBy('trip'), - roadtrip_preferences_collection: () => p.oneToMany(RoadtripPreferences).hidden().mappedBy('trip'), - share_tokens_collection: () => p.oneToMany(ShareTokens).hidden().mappedBy('trip'), - todo_category_assignees_collection: () => p.oneToMany(TodoCategoryAssignees).hidden().mappedBy('trip'), - todo_items_collection: () => p.oneToMany(TodoItems).hidden().mappedBy('trip'), - trip_album_links_collection: () => p.oneToMany(TripAlbumLinks).hidden().mappedBy('trip'), - trip_files_collection: () => p.oneToMany(TripFiles).hidden().mappedBy('trip'), - trip_invite_tokens_collection: () => p.oneToMany(TripInviteTokens).hidden().mappedBy('trip'), - trip_members_collection: () => p.oneToMany(TripMembers).hidden().mappedBy('trip'), - trip_photos_collection: () => p.oneToMany(TripPhotos).hidden().mappedBy('trip'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`).index('idx_trips_created_at'), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + budget_category_order_collection: () => p.oneToMany(BudgetCategoryOrder).mappedBy('trip').hidden(), + budget_items_collection: () => p.oneToMany(BudgetItems).mappedBy('trip').hidden(), + budget_settlements_collection: () => p.oneToMany(BudgetSettlements).mappedBy('trip').hidden(), + collab_links_collection: () => p.oneToMany(CollabLinks).mappedBy('trip').hidden(), + collab_messages_collection: () => p.oneToMany(CollabMessages).mappedBy('trip').hidden(), + collab_notes_collection: () => p.oneToMany(CollabNotes).mappedBy('trip').hidden(), + collab_polls_collection: () => p.oneToMany(CollabPolls).mappedBy('trip').hidden(), + dawarich_visit_suggestions_collection: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('trip').hidden(), + day_accommodations_collection: () => p.oneToMany(DayAccommodations).mappedBy('trip').hidden(), + day_notes_collection: () => p.oneToMany(DayNotes).mappedBy('trip').hidden(), + days_collection: () => p.oneToMany(Days).mappedBy('trip').hidden(), + document_connections_collection: () => p.oneToMany(DocumentConnections).mappedBy('trip').hidden(), + document_sync_items_collection: () => p.oneToMany(DocumentSyncItems).mappedBy('trip').hidden(), + invite_tokens_collection: () => p.oneToMany(InviteTokens).mappedBy('trip').hidden(), + journey_entries_collection: () => p.oneToMany(JourneyEntries).mappedBy('sourceTrip').hidden(), + journey_trips_collection: () => p.oneToMany(JourneyTrips).mappedBy('trip').hidden(), + packing_bags_collection: () => p.oneToMany(PackingBags).mappedBy('trip').hidden(), + packing_category_assignees_collection: () => p.oneToMany(PackingCategoryAssignees).mappedBy('trip').hidden(), + packing_items_collection: () => p.oneToMany(PackingItems).mappedBy('trip').hidden(), + photos_collection: () => p.oneToMany(Photos).mappedBy('trip').hidden(), + places_collection: () => p.oneToMany(Places).mappedBy('trip').hidden(), + reservations_collection: () => p.oneToMany(Reservations).mappedBy('trip').hidden(), + roadtrip_day_boundaries_collection: () => p.oneToMany(RoadtripDayBoundaries).mappedBy('trip').hidden(), + roadtrip_preferences_collection: () => p.oneToMany(RoadtripPreferences).mappedBy('trip').hidden(), + share_tokens_collection: () => p.oneToMany(ShareTokens).mappedBy('trip').hidden(), + todo_category_assignees_collection: () => p.oneToMany(TodoCategoryAssignees).mappedBy('trip').hidden(), + todo_items_collection: () => p.oneToMany(TodoItems).mappedBy('trip').hidden(), + trip_album_links_collection: () => p.oneToMany(TripAlbumLinks).mappedBy('trip').hidden(), + trip_document_links_collection: () => p.oneToMany(TripDocumentLinks).mappedBy('trip').hidden(), + trip_files_collection: () => p.oneToMany(TripFiles).mappedBy('trip').hidden(), + trip_invite_tokens_collection: () => p.oneToMany(TripInviteTokens).mappedBy('trip').hidden(), + trip_members_collection: () => p.oneToMany(TripMembers).mappedBy('trip').hidden(), + trip_photos_collection: () => p.oneToMany(TripPhotos).mappedBy('trip').hidden(), }, }); diff --git a/server/src/db/entities/UserNoticeDismissals.entity.ts b/server/src/db/entities/UserNoticeDismissals.entity.ts index d27109df5..fabcb0e58 100644 --- a/server/src/db/entities/UserNoticeDismissals.entity.ts +++ b/server/src/db/entities/UserNoticeDismissals.entity.ts @@ -1,23 +1,24 @@ -import { PrimaryKeyProp, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { UserNoticeDismissalsRepository } from '../repositories/UserNoticeDismissals.repository'; import { Users } from './Users.entity'; export class UserNoticeDismissals { - [PrimaryKeyProp]?: ['user', 'noticeId']; + [PrimaryKeyProp]?: ['user', 'notice_id']; user!: Ref; - noticeId!: string; - dismissedAt!: number; - dismissedAppVersion?: string | null; + user_id!: number; + notice_id!: string; + dismissed_at!: number; + dismissed_app_version?: string | null; } -export class UserNoticeDismissalsRepository extends EntityRepository {} - export const UserNoticeDismissalsSchema = defineEntity({ class: UserNoticeDismissals, repository: () => UserNoticeDismissalsRepository, properties: { - user: () => p.manyToOne(Users).primary().ref().deleteRule('cascade'), - noticeId: p.text().primary(), - dismissedAt: p.integer(), - dismissedAppVersion: p.text().nullable(), + user: () => p.manyToOne(Users).primary().ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + notice_id: p.text().primary(), + dismissed_at: p.integer(), + dismissed_app_version: p.text().nullable(), }, }); diff --git a/server/src/db/entities/Users.entity.ts b/server/src/db/entities/Users.entity.ts index 009bcab74..986c0456b 100644 --- a/server/src/db/entities/Users.entity.ts +++ b/server/src/db/entities/Users.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { UsersRepository } from '../repositories/Users.repository'; +import { DbTimestampType } from '../types'; import { AssignmentParticipants } from './AssignmentParticipants.entity'; import { AuditLog } from './AuditLog.entity'; import { BucketList } from './BucketList.entity'; @@ -19,6 +21,7 @@ import { CollectionPlaces } from './CollectionPlaces.entity'; import { Collections } from './Collections.entity'; import { DawarichConnections } from './DawarichConnections.entity'; import { DawarichVisitSuggestions } from './DawarichVisitSuggestions.entity'; +import { DocumentConnections } from './DocumentConnections.entity'; import { HiddenCountries } from './HiddenCountries.entity'; import { HiddenRegions } from './HiddenRegions.entity'; import { IdempotencyKeys } from './IdempotencyKeys.entity'; @@ -49,6 +52,7 @@ import { TodoCategoryAssignees } from './TodoCategoryAssignees.entity'; import { TodoItems } from './TodoItems.entity'; import { TrekPhotos } from './TrekPhotos.entity'; import { TripAlbumLinks } from './TripAlbumLinks.entity'; +import { TripDocumentLinks } from './TripDocumentLinks.entity'; import { TripFiles } from './TripFiles.entity'; import { TripInviteTokens } from './TripInviteTokens.entity'; import { TripMembers } from './TripMembers.entity'; @@ -68,126 +72,126 @@ import { WebauthnChallenges } from './WebauthnChallenges.entity'; import { WebauthnCredentials } from './WebauthnCredentials.entity'; export class Users { - id?: number | null; + id!: number & Opt; username!: string; email!: string; - passwordHash!: string; + password_hash!: string; role: string & Opt = 'user'; - mapsApiKey?: string | null; - unsplashApiKey?: string | null; - amapApiKey?: string | null; - openweatherApiKey?: string | null; + maps_api_key?: string | null; + unsplash_api_key?: string | null; + amap_api_key?: string | null; + openweather_api_key?: string | null; avatar?: string | null; - oidcSub?: string | null; - oidcIssuer?: string | null; - lastLogin?: Date | null; - mfaEnabled?: number | null = 0; - mfaSecret?: string | null; - mfaBackupCodes?: string | null; - immichUrl?: string | null; - immichAccessToken?: string | null; - synologyUrl?: string | null; - synologyUsername?: string | null; - synologyPassword?: string | null; - synologySid?: string | null; - mustChangePassword?: number | null = 0; - passwordVersion: number & Opt = 0; - feedToken?: string | null; - isGuest: number & Opt = 0; - createdAt?: Date | null; - updatedAt?: Date | null; - immichApiKey?: string | null; - synologySkipSsl: number & Opt = 0; - synologyDid?: string | null; - firstSeenVersion: string & Opt = '0.0.0'; - loginCount: number & Opt = 0; - immichAutoUpload: number & Opt = 0; - airtrailUrl?: string | null; - airtrailApiKey?: string | null; - airtrailAllowInsecureTls?: number | null = 0; - airtrailWriteEnabled?: number | null = 0; - displayName?: string | null; - assignmentParticipantsCollection = new Collection(this); - auditLogCollection = new Collection(this); - bucketListCollection = new Collection(this); - budgetItemMembersCollection = new Collection(this); - budgetItemPayersCollection = new Collection(this); - budgetItemsCollection = new Collection(this); - budgetSettlementsCollection = new Collection(this); - budgetSettlementsCollection1 = new Collection(this); - budgetSettlementsCollection2 = new Collection(this); - categoriesCollection = new Collection(this); - collabLinksCollection = new Collection(this); - collabMessageReactionsCollection = new Collection(this); - collabMessagesCollection = new Collection(this); - collabNotesCollection = new Collection(this); - collabPollVotesCollection = new Collection(this); - collabPollsCollection = new Collection(this); - collectionMembersCollection = new Collection(this); - collectionPlaceRatingsCollection = new Collection(this); - collectionPlacesCollection = new Collection(this); - collectionPlacesCollection1 = new Collection(this); - collectionsCollection = new Collection(this); - dawarichConnections: Ref | null = null; - dawarichVisitSuggestionsCollection = new Collection(this); - hiddenCountriesCollection = new Collection(this); - hiddenRegionsCollection = new Collection(this); - idempotencyKeysCollection = new Collection(this); - inviteTokensCollection = new Collection(this); - journeyBooksCollection = new Collection(this); - journeyBooksCollection1 = new Collection(this); - journeyContributorsCollection = new Collection(this); - journeyEntriesCollection = new Collection(this); - journeyShareTokensCollection = new Collection(this); - journeysCollection = new Collection(this); - mcpTokensCollection = new Collection(this); - notificationChannelPreferencesCollection = new Collection(this); - notificationsCollection = new Collection(this); - notificationsCollection1 = new Collection(this); - oauthClientsCollection = new Collection(this); - oauthConsentsCollection = new Collection(this); - oauthTokensCollection = new Collection(this); - packingBagsCollection = new Collection(this); - packingBagMembersInverse = new Collection(this); - packingCategoryAssigneesCollection = new Collection(this); - packingItemContributorsCollection = new Collection(this); - packingItemsCollection = new Collection(this); - packingItemContributorsInverse = new Collection(this); - packingItemRecipientsInverse = new Collection(this); - packingTemplatesCollection = new Collection(this); - passwordResetTokensCollection = new Collection(this); - placeRatingsCollection = new Collection(this); - reservationTravelersCollection = new Collection(this); - settingsCollection = new Collection(this); - shareTokensCollection = new Collection(this); - tagsCollection = new Collection(this); - todoCategoryAssigneesCollection = new Collection(this); - todoItemsCollection = new Collection(this); - trekPhotosCollection = new Collection(this); - tripAlbumLinksCollection = new Collection(this); - tripFilesCollection = new Collection(this); - tripInviteTokensCollection = new Collection(this); - tripMembersCollection = new Collection(this); - tripMembersCollection1 = new Collection(this); - tripPhotosCollection = new Collection(this); - tripsCollection = new Collection(this); - userNoticeDismissalsCollection = new Collection(this); - vacayEntriesCollection = new Collection(this); - vacayPlanMembersCollection = new Collection(this); - vacayPlansCollection = new Collection(this); - vacaySharesCollection = new Collection(this); - vacaySharesCollection1 = new Collection(this); - vacayUserColorsCollection = new Collection(this); - vacayUserSettings: Ref | null = null; - vacayUserYearsCollection = new Collection(this); - visitedCountriesCollection = new Collection(this); - visitedRegionsCollection = new Collection(this); - webauthnChallengesCollection = new Collection(this); - webauthnCredentialsCollection = new Collection(this); + oidc_sub?: string | null; + oidc_issuer?: string | null; + last_login?: string | null; + mfa_enabled?: number | null = 0; + mfa_secret?: string | null; + mfa_backup_codes?: string | null; + immich_url?: string | null; + immich_access_token?: string | null; + synology_url?: string | null; + synology_username?: string | null; + synology_password?: string | null; + synology_sid?: string | null; + must_change_password?: number | null = 0; + password_version: number & Opt = 0; + feed_token?: string | null; + is_guest: number & Opt = 0; + created_at?: string | null; + updated_at?: string | null; + immich_api_key?: string | null; + synology_skip_ssl: number & Opt = 0; + synology_did?: string | null; + first_seen_version: string & Opt = '0.0.0'; + login_count: number & Opt = 0; + immich_auto_upload: number & Opt = 0; + airtrail_url?: string | null; + airtrail_api_key?: string | null; + airtrail_allow_insecure_tls?: number | null = 0; + airtrail_write_enabled?: number | null = 0; + display_name?: string | null; + assignment_participants_collection = new Collection(this); + audit_log_collection = new Collection(this); + bucket_list_collection = new Collection(this); + budget_item_members_collection = new Collection(this); + budget_item_payers_collection = new Collection(this); + budget_items_collection = new Collection(this); + budget_settlements_collection = new Collection(this); + budget_settlements_collection1 = new Collection(this); + budget_settlements_collection2 = new Collection(this); + categories_collection = new Collection(this); + collab_links_collection = new Collection(this); + collab_message_reactions_collection = new Collection(this); + collab_messages_collection = new Collection(this); + collab_notes_collection = new Collection(this); + collab_poll_votes_collection = new Collection(this); + collab_polls_collection = new Collection(this); + collection_members_collection = new Collection(this); + collection_place_ratings_collection = new Collection(this); + collection_places_collection = new Collection(this); + collection_places_collection1 = new Collection(this); + collections_collection = new Collection(this); + dawarich_connections: Ref | null = null; + dawarich_visit_suggestions_collection = new Collection(this); + document_connections_collection = new Collection(this); + hidden_countries_collection = new Collection(this); + hidden_regions_collection = new Collection(this); + idempotency_keys_collection = new Collection(this); + invite_tokens_collection = new Collection(this); + journey_books_collection = new Collection(this); + journey_books_collection1 = new Collection(this); + journey_contributors_collection = new Collection(this); + journey_entries_collection = new Collection(this); + journey_share_tokens_collection = new Collection(this); + journeys_collection = new Collection(this); + mcp_tokens_collection = new Collection(this); + notification_channel_preferences_collection = new Collection(this); + notifications_collection = new Collection(this); + notifications_collection1 = new Collection(this); + oauth_clients_collection = new Collection(this); + oauth_consents_collection = new Collection(this); + oauth_tokens_collection = new Collection(this); + packing_bags_collection = new Collection(this); + packing_bag_members_inverse = new Collection(this); + packing_category_assignees_collection = new Collection(this); + packing_item_contributors_collection = new Collection(this); + packing_items_collection = new Collection(this); + packing_item_contributors_inverse = new Collection(this); + packing_item_recipients_inverse = new Collection(this); + packing_templates_collection = new Collection(this); + password_reset_tokens_collection = new Collection(this); + place_ratings_collection = new Collection(this); + reservation_travelers_collection = new Collection(this); + settings_collection = new Collection(this); + share_tokens_collection = new Collection(this); + tags_collection = new Collection(this); + todo_category_assignees_collection = new Collection(this); + todo_items_collection = new Collection(this); + trek_photos_collection = new Collection(this); + trip_album_links_collection = new Collection(this); + trip_document_links_collection = new Collection(this); + trip_files_collection = new Collection(this); + trip_invite_tokens_collection = new Collection(this); + trip_members_collection = new Collection(this); + trip_members_collection1 = new Collection(this); + trip_photos_collection = new Collection(this); + trips_collection = new Collection(this); + user_notice_dismissals_collection = new Collection(this); + vacay_entries_collection = new Collection(this); + vacay_plan_members_collection = new Collection(this); + vacay_plans_collection = new Collection(this); + vacay_shares_collection = new Collection(this); + vacay_shares_collection1 = new Collection(this); + vacay_user_colors_collection = new Collection(this); + vacay_user_settings: Ref | null = null; + vacay_user_years_collection = new Collection(this); + visited_countries_collection = new Collection(this); + visited_regions_collection = new Collection(this); + webauthn_challenges_collection = new Collection(this); + webauthn_credentials_collection = new Collection(this); } -export class UsersRepository extends EntityRepository {} - export const UsersSchema = defineEntity({ class: Users, repository: () => UsersRepository, @@ -195,125 +199,127 @@ export const UsersSchema = defineEntity({ { name: 'idx_users_feed_token', where: 'feed_token IS NOT NULL', - properties: ['feedToken'], + properties: ['feed_token'], }, ], properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), username: p.text(), email: p.text().index('idx_users_email'), - passwordHash: p.text(), - role: p.text(), - mapsApiKey: p.text().nullable(), - unsplashApiKey: p.text().nullable(), - amapApiKey: p.text().nullable(), - openweatherApiKey: p.text().nullable(), + password_hash: p.text(), + role: p.text().default('user'), + maps_api_key: p.text().nullable(), + unsplash_api_key: p.text().nullable(), + amap_api_key: p.text().nullable(), + openweather_api_key: p.text().nullable(), avatar: p.text().nullable(), - oidcSub: p.text().nullable(), - oidcIssuer: p.text().nullable(), - lastLogin: p.datetime().nullable(), - mfaEnabled: p.integer().nullable(), - mfaSecret: p.text().nullable(), - mfaBackupCodes: p.text().nullable(), - immichUrl: p.text().nullable(), - immichAccessToken: p.text().nullable(), - synologyUrl: p.text().nullable(), - synologyUsername: p.text().nullable(), - synologyPassword: p.text().nullable(), - synologySid: p.text().nullable(), - mustChangePassword: p.integer().nullable(), - passwordVersion: p.integer(), - feedToken: p.text().nullable(), - isGuest: p.integer(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - updatedAt: p.datetime().nullable().onCreate(() => new Date()), - immichApiKey: p.text().nullable(), - synologySkipSsl: p.integer(), - synologyDid: p.text().nullable(), - firstSeenVersion: p.text(), - loginCount: p.integer(), - immichAutoUpload: p.integer(), - airtrailUrl: p.text().nullable(), - airtrailApiKey: p.text().nullable(), - airtrailAllowInsecureTls: p.integer().nullable(), - airtrailWriteEnabled: p.integer().nullable(), - displayName: p.text().nullable(), - assignmentParticipantsCollection: () => p.oneToMany(AssignmentParticipants).mappedBy('user'), - auditLogCollection: () => p.oneToMany(AuditLog).mappedBy('user'), - bucketListCollection: () => p.oneToMany(BucketList).mappedBy('user'), - budgetItemMembersCollection: () => p.oneToMany(BudgetItemMembers).mappedBy('user'), - budgetItemPayersCollection: () => p.oneToMany(BudgetItemPayers).mappedBy('user'), - budgetItemsCollection: () => p.oneToMany(BudgetItems).mappedBy('paidByUser'), - budgetSettlementsCollection: () => p.oneToMany(BudgetSettlements).mappedBy('fromUser'), - budgetSettlementsCollection1: () => p.oneToMany(BudgetSettlements).mappedBy('toUser'), - budgetSettlementsCollection2: () => p.oneToMany(BudgetSettlements).mappedBy('createdByUser'), - categoriesCollection: () => p.oneToMany(Categories).mappedBy('user'), - collabLinksCollection: () => p.oneToMany(CollabLinks).mappedBy('user'), - collabMessageReactionsCollection: () => p.oneToMany(CollabMessageReactions).mappedBy('user'), - collabMessagesCollection: () => p.oneToMany(CollabMessages).mappedBy('user'), - collabNotesCollection: () => p.oneToMany(CollabNotes).mappedBy('user'), - collabPollVotesCollection: () => p.oneToMany(CollabPollVotes).mappedBy('user'), - collabPollsCollection: () => p.oneToMany(CollabPolls).mappedBy('user'), - collectionMembersCollection: () => p.oneToMany(CollectionMembers).mappedBy('user'), - collectionPlaceRatingsCollection: () => p.oneToMany(CollectionPlaceRatings).mappedBy('user'), - collectionPlacesCollection: () => p.oneToMany(CollectionPlaces).mappedBy('owner'), - collectionPlacesCollection1: () => p.oneToMany(CollectionPlaces).mappedBy('savedBy'), - collectionsCollection: () => p.oneToMany(Collections).mappedBy('owner'), - dawarichConnections: () => p.oneToOne(DawarichConnections).ref().mappedBy('user'), - dawarichVisitSuggestionsCollection: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('user'), - hiddenCountriesCollection: () => p.oneToMany(HiddenCountries).mappedBy('user'), - hiddenRegionsCollection: () => p.oneToMany(HiddenRegions).mappedBy('user'), - idempotencyKeysCollection: () => p.oneToMany(IdempotencyKeys).mappedBy('user'), - inviteTokensCollection: () => p.oneToMany(InviteTokens).mappedBy('createdBy'), - journeyBooksCollection: () => p.oneToMany(JourneyBooks).mappedBy('createdBy'), - journeyBooksCollection1: () => p.oneToMany(JourneyBooks).mappedBy('updatedBy'), - journeyContributorsCollection: () => p.oneToMany(JourneyContributors).mappedBy('user'), - journeyEntriesCollection: () => p.oneToMany(JourneyEntries).mappedBy('author'), - journeyShareTokensCollection: () => p.oneToMany(JourneyShareTokens).mappedBy('createdBy'), - journeysCollection: () => p.oneToMany(Journeys).mappedBy('user'), - mcpTokensCollection: () => p.oneToMany(McpTokens).mappedBy('user'), - notificationChannelPreferencesCollection: () => p.oneToMany(NotificationChannelPreferences).mappedBy('user'), - notificationsCollection: () => p.oneToMany(Notifications).mappedBy('sender'), - notificationsCollection1: () => p.oneToMany(Notifications).mappedBy('recipient'), - oauthClientsCollection: () => p.oneToMany(OauthClients).mappedBy('user'), - oauthConsentsCollection: () => p.oneToMany(OauthConsents).mappedBy('user'), - oauthTokensCollection: () => p.oneToMany(OauthTokens).mappedBy('user'), - packingBagsCollection: () => p.oneToMany(PackingBags).mappedBy('user'), - packingBagMembersInverse: () => p.manyToMany(PackingBags).mappedBy('packingBagMembers'), - packingCategoryAssigneesCollection: () => p.oneToMany(PackingCategoryAssignees).mappedBy('user'), - packingItemContributorsCollection: () => p.oneToMany(PackingItemContributors).mappedBy('user'), - packingItemsCollection: () => p.oneToMany(PackingItems).mappedBy('owner'), - packingItemContributorsInverse: () => p.manyToMany(PackingItems).mappedBy('packingItemContributors'), - packingItemRecipientsInverse: () => p.manyToMany(PackingItems).mappedBy('packingItemRecipients'), - packingTemplatesCollection: () => p.oneToMany(PackingTemplates).mappedBy('createdBy'), - passwordResetTokensCollection: () => p.oneToMany(PasswordResetTokens).mappedBy('user'), - placeRatingsCollection: () => p.oneToMany(PlaceRatings).mappedBy('user'), - reservationTravelersCollection: () => p.oneToMany(ReservationTravelers).mappedBy('user'), - settingsCollection: () => p.oneToMany(Settings).mappedBy('user'), - shareTokensCollection: () => p.oneToMany(ShareTokens).mappedBy('createdBy'), - tagsCollection: () => p.oneToMany(Tags).mappedBy('user'), - todoCategoryAssigneesCollection: () => p.oneToMany(TodoCategoryAssignees).mappedBy('user'), - todoItemsCollection: () => p.oneToMany(TodoItems).mappedBy('assignedUser'), - trekPhotosCollection: () => p.oneToMany(TrekPhotos).mappedBy('owner'), - tripAlbumLinksCollection: () => p.oneToMany(TripAlbumLinks).mappedBy('user'), - tripFilesCollection: () => p.oneToMany(TripFiles).mappedBy('uploadedBy'), - tripInviteTokensCollection: () => p.oneToMany(TripInviteTokens).mappedBy('createdBy'), - tripMembersCollection: () => p.oneToMany(TripMembers).mappedBy('user'), - tripMembersCollection1: () => p.oneToMany(TripMembers).mappedBy('invitedBy'), - tripPhotosCollection: () => p.oneToMany(TripPhotos).mappedBy('user'), - tripsCollection: () => p.oneToMany(Trips).mappedBy('user'), - userNoticeDismissalsCollection: () => p.oneToMany(UserNoticeDismissals).mappedBy('user'), - vacayEntriesCollection: () => p.oneToMany(VacayEntries).mappedBy('user'), - vacayPlanMembersCollection: () => p.oneToMany(VacayPlanMembers).mappedBy('user'), - vacayPlansCollection: () => p.oneToMany(VacayPlans).mappedBy('owner'), - vacaySharesCollection: () => p.oneToMany(VacayShares).mappedBy('owner'), - vacaySharesCollection1: () => p.oneToMany(VacayShares).mappedBy('user'), - vacayUserColorsCollection: () => p.oneToMany(VacayUserColors).mappedBy('user'), - vacayUserSettings: () => p.oneToOne(VacayUserSettings).ref().mappedBy('user'), - vacayUserYearsCollection: () => p.oneToMany(VacayUserYears).mappedBy('user'), - visitedCountriesCollection: () => p.oneToMany(VisitedCountries).mappedBy('user'), - visitedRegionsCollection: () => p.oneToMany(VisitedRegions).mappedBy('user'), - webauthnChallengesCollection: () => p.oneToMany(WebauthnChallenges).mappedBy('user'), - webauthnCredentialsCollection: () => p.oneToMany(WebauthnCredentials).mappedBy('user'), + oidc_sub: p.text().nullable(), + oidc_issuer: p.text().nullable(), + last_login: p.type(DbTimestampType).nullable(), + mfa_enabled: p.integer().nullable(), + mfa_secret: p.text().nullable(), + mfa_backup_codes: p.text().nullable(), + immich_url: p.text().nullable(), + immich_access_token: p.text().nullable(), + synology_url: p.text().nullable(), + synology_username: p.text().nullable(), + synology_password: p.text().nullable(), + synology_sid: p.text().nullable(), + must_change_password: p.integer().nullable(), + password_version: p.integer().default(0), + feed_token: p.text().nullable(), + is_guest: p.integer().default(0), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + updated_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + immich_api_key: p.text().nullable(), + synology_skip_ssl: p.integer().default(0), + synology_did: p.text().nullable(), + first_seen_version: p.text().default('0.0.0'), + login_count: p.integer().default(0), + immich_auto_upload: p.integer().default(0), + airtrail_url: p.text().nullable(), + airtrail_api_key: p.text().nullable(), + airtrail_allow_insecure_tls: p.integer().nullable(), + airtrail_write_enabled: p.integer().nullable(), + display_name: p.text().nullable(), + assignment_participants_collection: () => p.oneToMany(AssignmentParticipants).mappedBy('user').hidden(), + audit_log_collection: () => p.oneToMany(AuditLog).mappedBy('user').hidden(), + bucket_list_collection: () => p.oneToMany(BucketList).mappedBy('user').hidden(), + budget_item_members_collection: () => p.oneToMany(BudgetItemMembers).mappedBy('user').hidden(), + budget_item_payers_collection: () => p.oneToMany(BudgetItemPayers).mappedBy('user').hidden(), + budget_items_collection: () => p.oneToMany(BudgetItems).mappedBy('paidByUser').hidden(), + budget_settlements_collection: () => p.oneToMany(BudgetSettlements).mappedBy('fromUser').hidden(), + budget_settlements_collection1: () => p.oneToMany(BudgetSettlements).mappedBy('toUser').hidden(), + budget_settlements_collection2: () => p.oneToMany(BudgetSettlements).mappedBy('createdByUser').hidden(), + categories_collection: () => p.oneToMany(Categories).mappedBy('user').hidden(), + collab_links_collection: () => p.oneToMany(CollabLinks).mappedBy('user').hidden(), + collab_message_reactions_collection: () => p.oneToMany(CollabMessageReactions).mappedBy('user').hidden(), + collab_messages_collection: () => p.oneToMany(CollabMessages).mappedBy('user').hidden(), + collab_notes_collection: () => p.oneToMany(CollabNotes).mappedBy('user').hidden(), + collab_poll_votes_collection: () => p.oneToMany(CollabPollVotes).mappedBy('user').hidden(), + collab_polls_collection: () => p.oneToMany(CollabPolls).mappedBy('user').hidden(), + collection_members_collection: () => p.oneToMany(CollectionMembers).mappedBy('user').hidden(), + collection_place_ratings_collection: () => p.oneToMany(CollectionPlaceRatings).mappedBy('user').hidden(), + collection_places_collection: () => p.oneToMany(CollectionPlaces).mappedBy('owner').hidden(), + collection_places_collection1: () => p.oneToMany(CollectionPlaces).mappedBy('savedByRef').hidden(), + collections_collection: () => p.oneToMany(Collections).mappedBy('owner').hidden(), + dawarich_connections: () => p.oneToOne(DawarichConnections).ref().mappedBy('user').hidden(), + dawarich_visit_suggestions_collection: () => p.oneToMany(DawarichVisitSuggestions).mappedBy('user').hidden(), + document_connections_collection: () => p.oneToMany(DocumentConnections).mappedBy('ownerUser').hidden(), + hidden_countries_collection: () => p.oneToMany(HiddenCountries).mappedBy('user').hidden(), + hidden_regions_collection: () => p.oneToMany(HiddenRegions).mappedBy('user').hidden(), + idempotency_keys_collection: () => p.oneToMany(IdempotencyKeys).mappedBy('user').hidden(), + invite_tokens_collection: () => p.oneToMany(InviteTokens).mappedBy('createdByRef').hidden(), + journey_books_collection: () => p.oneToMany(JourneyBooks).mappedBy('updatedByRef').hidden(), + journey_books_collection1: () => p.oneToMany(JourneyBooks).mappedBy('createdByRef').hidden(), + journey_contributors_collection: () => p.oneToMany(JourneyContributors).mappedBy('user').hidden(), + journey_entries_collection: () => p.oneToMany(JourneyEntries).mappedBy('author').hidden(), + journey_share_tokens_collection: () => p.oneToMany(JourneyShareTokens).mappedBy('createdByRef').hidden(), + journeys_collection: () => p.oneToMany(Journeys).mappedBy('user').hidden(), + mcp_tokens_collection: () => p.oneToMany(McpTokens).mappedBy('user').hidden(), + notification_channel_preferences_collection: () => p.oneToMany(NotificationChannelPreferences).mappedBy('user').hidden(), + notifications_collection: () => p.oneToMany(Notifications).mappedBy('sender').hidden(), + notifications_collection1: () => p.oneToMany(Notifications).mappedBy('recipient').hidden(), + oauth_clients_collection: () => p.oneToMany(OauthClients).mappedBy('user').hidden(), + oauth_consents_collection: () => p.oneToMany(OauthConsents).mappedBy('user').hidden(), + oauth_tokens_collection: () => p.oneToMany(OauthTokens).mappedBy('user').hidden(), + packing_bags_collection: () => p.oneToMany(PackingBags).mappedBy('user').hidden(), + packing_bag_members_inverse: () => p.manyToMany(PackingBags).mappedBy('packing_bag_members').hidden(), + packing_category_assignees_collection: () => p.oneToMany(PackingCategoryAssignees).mappedBy('user').hidden(), + packing_item_contributors_collection: () => p.oneToMany(PackingItemContributors).mappedBy('user').hidden(), + packing_items_collection: () => p.oneToMany(PackingItems).mappedBy('owner').hidden(), + packing_item_contributors_inverse: () => p.manyToMany(PackingItems).mappedBy('packing_item_contributors').hidden(), + packing_item_recipients_inverse: () => p.manyToMany(PackingItems).mappedBy('packing_item_recipients').hidden(), + packing_templates_collection: () => p.oneToMany(PackingTemplates).mappedBy('createdByRef').hidden(), + password_reset_tokens_collection: () => p.oneToMany(PasswordResetTokens).mappedBy('user').hidden(), + place_ratings_collection: () => p.oneToMany(PlaceRatings).mappedBy('user').hidden(), + reservation_travelers_collection: () => p.oneToMany(ReservationTravelers).mappedBy('user').hidden(), + settings_collection: () => p.oneToMany(Settings).mappedBy('user').hidden(), + share_tokens_collection: () => p.oneToMany(ShareTokens).mappedBy('createdByRef').hidden(), + tags_collection: () => p.oneToMany(Tags).mappedBy('user').hidden(), + todo_category_assignees_collection: () => p.oneToMany(TodoCategoryAssignees).mappedBy('user').hidden(), + todo_items_collection: () => p.oneToMany(TodoItems).mappedBy('assignedUser').hidden(), + trek_photos_collection: () => p.oneToMany(TrekPhotos).mappedBy('owner').hidden(), + trip_album_links_collection: () => p.oneToMany(TripAlbumLinks).mappedBy('user').hidden(), + trip_document_links_collection: () => p.oneToMany(TripDocumentLinks).mappedBy('createdByRef').hidden(), + trip_files_collection: () => p.oneToMany(TripFiles).mappedBy('uploadedByRef').hidden(), + trip_invite_tokens_collection: () => p.oneToMany(TripInviteTokens).mappedBy('createdByRef').hidden(), + trip_members_collection: () => p.oneToMany(TripMembers).mappedBy('user').hidden(), + trip_members_collection1: () => p.oneToMany(TripMembers).mappedBy('invitedByRef').hidden(), + trip_photos_collection: () => p.oneToMany(TripPhotos).mappedBy('user').hidden(), + trips_collection: () => p.oneToMany(Trips).mappedBy('user').hidden(), + user_notice_dismissals_collection: () => p.oneToMany(UserNoticeDismissals).mappedBy('user').hidden(), + vacay_entries_collection: () => p.oneToMany(VacayEntries).mappedBy('user').hidden(), + vacay_plan_members_collection: () => p.oneToMany(VacayPlanMembers).mappedBy('user').hidden(), + vacay_plans_collection: () => p.oneToMany(VacayPlans).mappedBy('owner').hidden(), + vacay_shares_collection: () => p.oneToMany(VacayShares).mappedBy('owner').hidden(), + vacay_shares_collection1: () => p.oneToMany(VacayShares).mappedBy('user').hidden(), + vacay_user_colors_collection: () => p.oneToMany(VacayUserColors).mappedBy('user').hidden(), + vacay_user_settings: () => p.oneToOne(VacayUserSettings).ref().mappedBy('user').hidden(), + vacay_user_years_collection: () => p.oneToMany(VacayUserYears).mappedBy('user').hidden(), + visited_countries_collection: () => p.oneToMany(VisitedCountries).mappedBy('user').hidden(), + visited_regions_collection: () => p.oneToMany(VisitedRegions).mappedBy('user').hidden(), + webauthn_challenges_collection: () => p.oneToMany(WebauthnChallenges).mappedBy('user').hidden(), + webauthn_credentials_collection: () => p.oneToMany(WebauthnCredentials).mappedBy('user').hidden(), }, }); diff --git a/server/src/db/entities/VacayCompanyHolidays.entity.ts b/server/src/db/entities/VacayCompanyHolidays.entity.ts index 2475399fb..62242e0fd 100644 --- a/server/src/db/entities/VacayCompanyHolidays.entity.ts +++ b/server/src/db/entities/VacayCompanyHolidays.entity.ts @@ -1,21 +1,22 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayCompanyHolidaysRepository } from '../repositories/VacayCompanyHolidays.repository'; import { VacayPlans } from './VacayPlans.entity'; export class VacayCompanyHolidays { - id?: number | null; + id!: number & Opt; plan!: Ref; + plan_id!: number; date!: string; note?: string | null = ''; } -export class VacayCompanyHolidaysRepository extends EntityRepository {} - export const VacayCompanyHolidaysSchema = defineEntity({ class: VacayCompanyHolidays, repository: () => VacayCompanyHolidaysRepository, properties: { - id: p.integer().primary().autoincrement(), - plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade'), + id: p.integer().primary(), + plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade').hidden(), + plan_id: p.integer().persist(false), date: p.text(), note: p.text().nullable(), }, diff --git a/server/src/db/entities/VacayEntries.entity.ts b/server/src/db/entities/VacayEntries.entity.ts index 1f3fff853..70407d7c4 100644 --- a/server/src/db/entities/VacayEntries.entity.ts +++ b/server/src/db/entities/VacayEntries.entity.ts @@ -1,29 +1,32 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayEntriesRepository } from '../repositories/VacayEntries.repository'; import { Users } from './Users.entity'; import { VacayPlans } from './VacayPlans.entity'; export class VacayEntries { - id?: number | null; + id!: number & Opt; plan!: Ref; + plan_id!: number; user!: Ref; + user_id!: number; date!: string; note?: string | null = ''; fraction!: number & Opt; kind: string & Opt = 'vacation'; } -export class VacayEntriesRepository extends EntityRepository {} - export const VacayEntriesSchema = defineEntity({ class: VacayEntries, repository: () => VacayEntriesRepository, properties: { - id: p.integer().primary().autoincrement(), - plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade').hidden(), + plan_id: p.integer().persist(false), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), date: p.text(), note: p.text().nullable(), - fraction: p.double().default(1), - kind: p.text(), + fraction: p.double().defaultRaw(`1`), + kind: p.text().default('vacation'), }, }); diff --git a/server/src/db/entities/VacayHolidayCalendars.entity.ts b/server/src/db/entities/VacayHolidayCalendars.entity.ts index 1cd359426..d8be0329b 100644 --- a/server/src/db/entities/VacayHolidayCalendars.entity.ts +++ b/server/src/db/entities/VacayHolidayCalendars.entity.ts @@ -1,28 +1,29 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayHolidayCalendarsRepository } from '../repositories/VacayHolidayCalendars.repository'; import { VacayPlans } from './VacayPlans.entity'; export class VacayHolidayCalendars { - id?: number | null; + id!: number & Opt; plan!: Ref; + plan_id!: number; type: string & Opt = 'public_holiday'; region!: string; label?: string | null; color: string & Opt = '#fecaca'; - sortOrder: number & Opt = 0; + sort_order: number & Opt = 0; } -export class VacayHolidayCalendarsRepository extends EntityRepository {} - export const VacayHolidayCalendarsSchema = defineEntity({ class: VacayHolidayCalendars, repository: () => VacayHolidayCalendarsRepository, properties: { - id: p.integer().primary().autoincrement(), - plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade'), - type: p.text(), + id: p.integer().primary(), + plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade').hidden(), + plan_id: p.integer().persist(false), + type: p.text().default('public_holiday'), region: p.text(), label: p.text().nullable(), - color: p.text(), - sortOrder: p.integer(), + color: p.text().default('#fecaca'), + sort_order: p.integer().default(0), }, }); diff --git a/server/src/db/entities/VacayPlanMembers.entity.ts b/server/src/db/entities/VacayPlanMembers.entity.ts index b798b22a1..d8cd3389e 100644 --- a/server/src/db/entities/VacayPlanMembers.entity.ts +++ b/server/src/db/entities/VacayPlanMembers.entity.ts @@ -1,25 +1,29 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayPlanMembersRepository } from '../repositories/VacayPlanMembers.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; import { VacayPlans } from './VacayPlans.entity'; export class VacayPlanMembers { - id?: number | null; + id!: number & Opt; plan!: Ref; + plan_id!: number; user!: Ref; + user_id!: number; status?: string | null = 'pending'; - createdAt?: Date | null; + created_at?: string | null; } -export class VacayPlanMembersRepository extends EntityRepository {} - export const VacayPlanMembersSchema = defineEntity({ class: VacayPlanMembers, repository: () => VacayPlanMembersRepository, properties: { - id: p.integer().primary().autoincrement(), - plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), + id: p.integer().primary(), + plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade').hidden(), + plan_id: p.integer().persist(false), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), status: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/VacayPlans.entity.ts b/server/src/db/entities/VacayPlans.entity.ts index 3cf2b2571..04434e44f 100644 --- a/server/src/db/entities/VacayPlans.entity.ts +++ b/server/src/db/entities/VacayPlans.entity.ts @@ -1,4 +1,6 @@ -import { Collection, type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { Collection, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayPlansRepository } from '../repositories/VacayPlans.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; import { VacayCompanyHolidays } from './VacayCompanyHolidays.entity'; import { VacayEntries } from './VacayEntries.entity'; @@ -9,49 +11,49 @@ import { VacayUserYears } from './VacayUserYears.entity'; import { VacayYears } from './VacayYears.entity'; export class VacayPlans { - id?: number | null; + id!: number & Opt; owner!: Ref; - blockWeekends?: number | null = 1; - holidaysEnabled?: number | null = 0; - holidaysRegion?: string | null = ''; - schoolHolidaysEnabled?: number | null = 0; - companyHolidaysEnabled?: number | null = 1; - carryOverEnabled?: number | null = 1; - createdAt?: Date | null; - weekendDays?: string | null = '0,6'; - weekStart: number & Opt = 1; - vacayCompanyHolidaysCollection = new Collection(this); - vacayEntriesCollection = new Collection(this); - vacayHolidayCalendarsCollection = new Collection(this); - vacayPlanMembersCollection = new Collection(this); - vacayUserColorsCollection = new Collection(this); - vacayUserYearsCollection = new Collection(this); - vacayYearsCollection = new Collection(this); + owner_id!: number; + block_weekends?: number | null = 1; + holidays_enabled?: number | null = 0; + holidays_region?: string | null = ''; + school_holidays_enabled?: number | null = 0; + company_holidays_enabled?: number | null = 1; + carry_over_enabled?: number | null = 1; + created_at?: string | null; + weekend_days?: string | null = '0,6'; + week_start: number & Opt = 1; + vacay_company_holidays_collection = new Collection(this); + vacay_entries_collection = new Collection(this); + vacay_holiday_calendars_collection = new Collection(this); + vacay_plan_members_collection = new Collection(this); + vacay_user_colors_collection = new Collection(this); + vacay_user_years_collection = new Collection(this); + vacay_years_collection = new Collection(this); } -export class VacayPlansRepository extends EntityRepository {} - export const VacayPlansSchema = defineEntity({ class: VacayPlans, repository: () => VacayPlansRepository, properties: { - id: p.integer().primary().autoincrement(), - owner: () => p.manyToOne(Users).ref().deleteRule('cascade'), - blockWeekends: p.integer().nullable(), - holidaysEnabled: p.integer().nullable(), - holidaysRegion: p.text().nullable(), - schoolHolidaysEnabled: p.integer().nullable(), - companyHolidaysEnabled: p.integer().nullable(), - carryOverEnabled: p.integer().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - weekendDays: p.text().nullable(), - weekStart: p.integer(), - vacayCompanyHolidaysCollection: () => p.oneToMany(VacayCompanyHolidays).mappedBy('plan'), - vacayEntriesCollection: () => p.oneToMany(VacayEntries).mappedBy('plan'), - vacayHolidayCalendarsCollection: () => p.oneToMany(VacayHolidayCalendars).mappedBy('plan'), - vacayPlanMembersCollection: () => p.oneToMany(VacayPlanMembers).mappedBy('plan'), - vacayUserColorsCollection: () => p.oneToMany(VacayUserColors).mappedBy('plan'), - vacayUserYearsCollection: () => p.oneToMany(VacayUserYears).mappedBy('plan'), - vacayYearsCollection: () => p.oneToMany(VacayYears).mappedBy('plan'), + id: p.integer().primary(), + owner: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + owner_id: p.integer().persist(false), + block_weekends: p.integer().nullable(), + holidays_enabled: p.integer().nullable(), + holidays_region: p.text().nullable(), + school_holidays_enabled: p.integer().nullable(), + company_holidays_enabled: p.integer().nullable(), + carry_over_enabled: p.integer().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + weekend_days: p.text().nullable(), + week_start: p.integer().default(1), + vacay_company_holidays_collection: () => p.oneToMany(VacayCompanyHolidays).mappedBy('plan').hidden(), + vacay_entries_collection: () => p.oneToMany(VacayEntries).mappedBy('plan').hidden(), + vacay_holiday_calendars_collection: () => p.oneToMany(VacayHolidayCalendars).mappedBy('plan').hidden(), + vacay_plan_members_collection: () => p.oneToMany(VacayPlanMembers).mappedBy('plan').hidden(), + vacay_user_colors_collection: () => p.oneToMany(VacayUserColors).mappedBy('plan').hidden(), + vacay_user_years_collection: () => p.oneToMany(VacayUserYears).mappedBy('plan').hidden(), + vacay_years_collection: () => p.oneToMany(VacayYears).mappedBy('plan').hidden(), }, }); diff --git a/server/src/db/entities/VacayShares.entity.ts b/server/src/db/entities/VacayShares.entity.ts index f752f0ba1..4b0629f2e 100644 --- a/server/src/db/entities/VacayShares.entity.ts +++ b/server/src/db/entities/VacayShares.entity.ts @@ -1,24 +1,28 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacaySharesRepository } from '../repositories/VacayShares.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class VacayShares { - id?: number | null; + id!: number & Opt; owner!: Ref; + owner_id!: number; user!: Ref; + user_id!: number; hidden: number & Opt = 0; - createdAt?: Date | null; + created_at?: string | null; } -export class VacaySharesRepository extends EntityRepository {} - export const VacaySharesSchema = defineEntity({ class: VacayShares, repository: () => VacaySharesRepository, properties: { - id: p.integer().primary().autoincrement(), - owner: () => p.manyToOne(Users).ref().deleteRule('cascade'), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_vacay_shares_user'), - hidden: p.integer(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + owner: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + owner_id: p.integer().persist(false), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_vacay_shares_user'), + user_id: p.integer().persist(false).index('idx_vacay_shares_user'), + hidden: p.integer().default(0), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/VacayUserColors.entity.ts b/server/src/db/entities/VacayUserColors.entity.ts index 55915e91e..7ed465809 100644 --- a/server/src/db/entities/VacayUserColors.entity.ts +++ b/server/src/db/entities/VacayUserColors.entity.ts @@ -1,23 +1,26 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayUserColorsRepository } from '../repositories/VacayUserColors.repository'; import { Users } from './Users.entity'; import { VacayPlans } from './VacayPlans.entity'; export class VacayUserColors { - id?: number | null; + id!: number & Opt; user!: Ref; + user_id!: number; plan!: Ref; + plan_id!: number; color?: string | null = '#6366f1'; } -export class VacayUserColorsRepository extends EntityRepository {} - export const VacayUserColorsSchema = defineEntity({ class: VacayUserColors, repository: () => VacayUserColorsRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade').hidden(), + plan_id: p.integer().persist(false), color: p.text().nullable(), }, }); diff --git a/server/src/db/entities/VacayUserSettings.entity.ts b/server/src/db/entities/VacayUserSettings.entity.ts index 096b6d5c8..285c25c70 100644 --- a/server/src/db/entities/VacayUserSettings.entity.ts +++ b/server/src/db/entities/VacayUserSettings.entity.ts @@ -16,7 +16,7 @@ export const VacayUserSettingsSchema = defineEntity({ class: VacayUserSettings, repository: () => VacayUserSettingsRepository, properties: { - user: () => p.oneToOne(Users).primary().ref().hidden().nullable(), + user: () => p.oneToOne(Users).primary().ref().nullable().hidden(), user_id: p.integer().nullable().persist(false), year_type: p.text().default('calendar'), year_start_month: p.integer().default(1), diff --git a/server/src/db/entities/VacayUserYears.entity.ts b/server/src/db/entities/VacayUserYears.entity.ts index d94d966a7..081238611 100644 --- a/server/src/db/entities/VacayUserYears.entity.ts +++ b/server/src/db/entities/VacayUserYears.entity.ts @@ -1,27 +1,30 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayUserYearsRepository } from '../repositories/VacayUserYears.repository'; import { Users } from './Users.entity'; import { VacayPlans } from './VacayPlans.entity'; export class VacayUserYears { - id?: number | null; + id!: number & Opt; user!: Ref; + user_id!: number; plan!: Ref; + plan_id!: number; year!: number; - vacationDays?: number | null = 30; - carriedOver?: number | null = 0; + vacation_days?: number | null = 30; + carried_over?: number | null = 0; } -export class VacayUserYearsRepository extends EntityRepository {} - export const VacayUserYearsSchema = defineEntity({ class: VacayUserYears, repository: () => VacayUserYearsRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade'), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade').hidden(), + plan_id: p.integer().persist(false), year: p.integer(), - vacationDays: p.integer().nullable(), - carriedOver: p.integer().nullable(), + vacation_days: p.integer().nullable(), + carried_over: p.integer().nullable(), }, }); diff --git a/server/src/db/entities/VacayYears.entity.ts b/server/src/db/entities/VacayYears.entity.ts index a2a5d61af..ab6abb4c8 100644 --- a/server/src/db/entities/VacayYears.entity.ts +++ b/server/src/db/entities/VacayYears.entity.ts @@ -1,20 +1,21 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VacayYearsRepository } from '../repositories/VacayYears.repository'; import { VacayPlans } from './VacayPlans.entity'; export class VacayYears { - id?: number | null; + id!: number & Opt; plan!: Ref; + plan_id!: number; year!: number; } -export class VacayYearsRepository extends EntityRepository {} - export const VacayYearsSchema = defineEntity({ class: VacayYears, repository: () => VacayYearsRepository, properties: { - id: p.integer().primary().autoincrement(), - plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade'), + id: p.integer().primary(), + plan: () => p.manyToOne(VacayPlans).ref().deleteRule('cascade').hidden(), + plan_id: p.integer().persist(false), year: p.integer(), }, }); diff --git a/server/src/db/entities/VisitedCountries.entity.ts b/server/src/db/entities/VisitedCountries.entity.ts index f1dbd780b..e7d302d3e 100644 --- a/server/src/db/entities/VisitedCountries.entity.ts +++ b/server/src/db/entities/VisitedCountries.entity.ts @@ -1,24 +1,26 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VisitedCountriesRepository } from '../repositories/VisitedCountries.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class VisitedCountries { - id?: number | null; + id!: number & Opt; user!: Ref; - countryCode!: string; - createdAt?: Date | null; + user_id!: number; + country_code!: string; + created_at?: string | null; source: string & Opt = 'manual'; } -export class VisitedCountriesRepository extends EntityRepository {} - export const VisitedCountriesSchema = defineEntity({ class: VisitedCountries, repository: () => VisitedCountriesRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - countryCode: p.text(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - source: p.text(), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + country_code: p.text(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + source: p.text().default('manual'), }, }); diff --git a/server/src/db/entities/VisitedRegions.entity.ts b/server/src/db/entities/VisitedRegions.entity.ts index 6a0fa2dfe..46ee4a595 100644 --- a/server/src/db/entities/VisitedRegions.entity.ts +++ b/server/src/db/entities/VisitedRegions.entity.ts @@ -1,26 +1,28 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { VisitedRegionsRepository } from '../repositories/VisitedRegions.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class VisitedRegions { - id?: number | null; + id!: number & Opt; user!: Ref; - regionCode!: string; - regionName!: string; - countryCode!: string; - createdAt?: Date | null; + user_id!: number; + region_code!: string; + region_name!: string; + country_code!: string; + created_at?: string | null; } -export class VisitedRegionsRepository extends EntityRepository {} - export const VisitedRegionsSchema = defineEntity({ class: VisitedRegions, repository: () => VisitedRegionsRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade'), - regionCode: p.text(), - regionName: p.text(), - countryCode: p.text().index('idx_visited_regions_country'), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden(), + user_id: p.integer().persist(false), + region_code: p.text(), + region_name: p.text(), + country_code: p.text().index('idx_visited_regions_country'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/WebauthnChallenges.entity.ts b/server/src/db/entities/WebauthnChallenges.entity.ts index 2c6ebd4ad..7f2e29988 100644 --- a/server/src/db/entities/WebauthnChallenges.entity.ts +++ b/server/src/db/entities/WebauthnChallenges.entity.ts @@ -1,26 +1,28 @@ -import { type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { WebauthnChallengesRepository } from '../repositories/WebauthnChallenges.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class WebauthnChallenges { - id?: number | null; + id!: number & Opt; challenge!: string; user?: Ref | null; + user_id?: number | null; type!: string; - expiresAt!: number; - createdAt?: Date | null; + expires_at!: number; + created_at?: string | null; } -export class WebauthnChallengesRepository extends EntityRepository {} - export const WebauthnChallengesSchema = defineEntity({ class: WebauthnChallenges, repository: () => WebauthnChallengesRepository, properties: { - id: p.integer().primary().autoincrement(), + id: p.integer().primary(), challenge: p.text(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').nullable(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').nullable().hidden(), + user_id: p.integer().nullable().persist(false), type: p.text(), - expiresAt: p.integer().index('idx_webauthn_challenges_expires'), - createdAt: p.datetime().nullable().onCreate(() => new Date()), + expires_at: p.integer().index('idx_webauthn_challenges_expires'), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), }, }); diff --git a/server/src/db/entities/WebauthnCredentials.entity.ts b/server/src/db/entities/WebauthnCredentials.entity.ts index d1fdd7df8..e82dbd3d9 100644 --- a/server/src/db/entities/WebauthnCredentials.entity.ts +++ b/server/src/db/entities/WebauthnCredentials.entity.ts @@ -1,38 +1,40 @@ -import { type Opt, type Ref, defineEntity, p, EntityRepository } from '@mikro-orm/core'; +import { type Opt, type Ref, defineEntity, p } from '@mikro-orm/core'; +import { WebauthnCredentialsRepository } from '../repositories/WebauthnCredentials.repository'; +import { DbTimestampType } from '../types'; import { Users } from './Users.entity'; export class WebauthnCredentials { - id?: number | null; + id!: number & Opt; user!: Ref; - credentialId!: string; - publicKey!: Buffer; + user_id!: number; + credential_id!: string; + public_key!: Buffer; counter: number & Opt = 0; transports?: string | null; - deviceType?: string | null; - backedUp: number & Opt = 0; + device_type?: string | null; + backed_up: number & Opt = 0; name?: string | null; aaguid?: string | null; - createdAt?: Date | null; - lastUsedAt?: Date | null; + created_at?: string | null; + last_used_at?: string | null; } -export class WebauthnCredentialsRepository extends EntityRepository {} - export const WebauthnCredentialsSchema = defineEntity({ class: WebauthnCredentials, repository: () => WebauthnCredentialsRepository, properties: { - id: p.integer().primary().autoincrement(), - user: () => p.manyToOne(Users).ref().deleteRule('cascade').index('idx_webauthn_credentials_user'), - credentialId: p.text(), - publicKey: p.blob(), - counter: p.integer(), + id: p.integer().primary(), + user: () => p.manyToOne(Users).ref().deleteRule('cascade').hidden().index('idx_webauthn_credentials_user'), + user_id: p.integer().persist(false).index('idx_webauthn_credentials_user'), + credential_id: p.text(), + public_key: p.blob(), + counter: p.integer().default(0), transports: p.text().nullable(), - deviceType: p.text().nullable(), - backedUp: p.integer(), + device_type: p.text().nullable(), + backed_up: p.integer().default(0), name: p.text().nullable(), aaguid: p.text().nullable(), - createdAt: p.datetime().nullable().onCreate(() => new Date()), - lastUsedAt: p.datetime().nullable(), + created_at: p.type(DbTimestampType).nullable().defaultRaw(`CURRENT_TIMESTAMP`), + last_used_at: p.type(DbTimestampType).nullable(), }, }); diff --git a/server/src/db/entities/index.ts b/server/src/db/entities/index.ts index 8381179cc..3df3812f1 100644 --- a/server/src/db/entities/index.ts +++ b/server/src/db/entities/index.ts @@ -14,8 +14,8 @@ import { CollabLinksSchema } from './CollabLinks.entity'; import { CollabMessageReactionsSchema } from './CollabMessageReactions.entity'; import { CollabMessagesSchema } from './CollabMessages.entity'; import { CollabNotesSchema } from './CollabNotes.entity'; -import { CollabPollsSchema } from './CollabPolls.entity'; import { CollabPollVotesSchema } from './CollabPollVotes.entity'; +import { CollabPollsSchema } from './CollabPolls.entity'; import { CollectionLabelsSchema } from './CollectionLabels.entity'; import { CollectionMembersSchema } from './CollectionMembers.entity'; import { CollectionPlaceRatingsSchema } from './CollectionPlaceRatings.entity'; @@ -27,6 +27,10 @@ import { DayAccommodationsSchema } from './DayAccommodations.entity'; import { DayAssignmentsSchema } from './DayAssignments.entity'; import { DayNotesSchema } from './DayNotes.entity'; import { DaysSchema } from './Days.entity'; +import { DocumentConnectionsSchema } from './DocumentConnections.entity'; +import { DocumentProviderFieldsSchema } from './DocumentProviderFields.entity'; +import { DocumentProvidersSchema } from './DocumentProviders.entity'; +import { DocumentSyncItemsSchema } from './DocumentSyncItems.entity'; import { FileLinksSchema } from './FileLinks.entity'; import { GooglePlacePhotoMetaSchema } from './GooglePlacePhotoMeta.entity'; import { HiddenCountriesSchema } from './HiddenCountries.entity'; @@ -38,9 +42,9 @@ import { JourneyContributorsSchema } from './JourneyContributors.entity'; import { JourneyEntriesSchema } from './JourneyEntries.entity'; import { JourneyEntryPhotosSchema } from './JourneyEntryPhotos.entity'; import { JourneyPhotosSchema } from './JourneyPhotos.entity'; -import { JourneysSchema } from './Journeys.entity'; import { JourneyShareTokensSchema } from './JourneyShareTokens.entity'; import { JourneyTripsSchema } from './JourneyTrips.entity'; +import { JourneysSchema } from './Journeys.entity'; import { McpTokensSchema } from './McpTokens.entity'; import { MigrationsSchema } from './Migrations.entity'; import { NotificationChannelPreferencesSchema } from './NotificationChannelPreferences.entity'; @@ -62,8 +66,8 @@ import { PhotosSchema } from './Photos.entity'; import { PlaceDetailsCacheSchema } from './PlaceDetailsCache.entity'; import { PlaceRatingsSchema } from './PlaceRatings.entity'; import { PlaceRegionsSchema } from './PlaceRegions.entity'; -import { PlacesSchema } from './Places.entity'; import { PlaceShadowPicksSchema } from './PlaceShadowPicks.entity'; +import { PlacesSchema } from './Places.entity'; import { PluginActionsSchema } from './PluginActions.entity'; import { PluginCapabilityAuditSchema } from './PluginCapabilityAudit.entity'; import { PluginEgressHostsSchema } from './PluginEgressHosts.entity'; @@ -73,14 +77,14 @@ import { PluginMetaMigrationsSchema } from './PluginMetaMigrations.entity'; import { PluginOauthStateSchema } from './PluginOauthState.entity'; import { PluginOauthTokensSchema } from './PluginOauthTokens.entity'; import { PluginScheduledTasksSchema } from './PluginScheduledTasks.entity'; -import { PluginsSchema } from './Plugins.entity'; import { PluginSettingsFieldsSchema } from './PluginSettingsFields.entity'; import { PluginUserConfigSchema } from './PluginUserConfig.entity'; import { PluginUserErasureQueueSchema } from './PluginUserErasureQueue.entity'; +import { PluginsSchema } from './Plugins.entity'; import { ReservationDayPositionsSchema } from './ReservationDayPositions.entity'; import { ReservationEndpointsSchema } from './ReservationEndpoints.entity'; -import { ReservationsSchema } from './Reservations.entity'; import { ReservationTravelersSchema } from './ReservationTravelers.entity'; +import { ReservationsSchema } from './Reservations.entity'; import { RoadtripDayBoundariesSchema } from './RoadtripDayBoundaries.entity'; import { RoadtripDayTracksSchema } from './RoadtripDayTracks.entity'; import { RoadtripPreferencesSchema } from './RoadtripPreferences.entity'; @@ -98,6 +102,7 @@ import { TodoItemsSchema } from './TodoItems.entity'; import { TrekPhotoCacheMetaSchema } from './TrekPhotoCacheMeta.entity'; import { TrekPhotosSchema } from './TrekPhotos.entity'; import { TripAlbumLinksSchema } from './TripAlbumLinks.entity'; +import { TripDocumentLinksSchema } from './TripDocumentLinks.entity'; import { TripFilesSchema } from './TripFiles.entity'; import { TripInviteTokensSchema } from './TripInviteTokens.entity'; import { TripMembersSchema } from './TripMembers.entity'; @@ -120,12 +125,6 @@ import { VisitedRegionsSchema } from './VisitedRegions.entity'; import { WebauthnChallengesSchema } from './WebauthnChallenges.entity'; import { WebauthnCredentialsSchema } from './WebauthnCredentials.entity'; -/** - * Every entity the ORM knows, listed explicitly so discovery never depends on a - * filesystem glob (which fails under Node's ESM resolver in the vitest global - * setup and would silently drop an entity a build forgot to emit). - * `tests/unit/db/entities-index.test.ts` refuses a file this list misses. - */ export const ALL_ENTITIES: readonly EntitySchema[] = [ AddonsSchema, AppSettingsSchema, @@ -142,8 +141,8 @@ export const ALL_ENTITIES: readonly EntitySchema[] = [ CollabMessageReactionsSchema, CollabMessagesSchema, CollabNotesSchema, - CollabPollsSchema, CollabPollVotesSchema, + CollabPollsSchema, CollectionLabelsSchema, CollectionMembersSchema, CollectionPlaceRatingsSchema, @@ -155,6 +154,10 @@ export const ALL_ENTITIES: readonly EntitySchema[] = [ DayAssignmentsSchema, DayNotesSchema, DaysSchema, + DocumentConnectionsSchema, + DocumentProviderFieldsSchema, + DocumentProvidersSchema, + DocumentSyncItemsSchema, FileLinksSchema, GooglePlacePhotoMetaSchema, HiddenCountriesSchema, @@ -166,9 +169,9 @@ export const ALL_ENTITIES: readonly EntitySchema[] = [ JourneyEntriesSchema, JourneyEntryPhotosSchema, JourneyPhotosSchema, - JourneysSchema, JourneyShareTokensSchema, JourneyTripsSchema, + JourneysSchema, McpTokensSchema, MigrationsSchema, NotificationChannelPreferencesSchema, @@ -190,8 +193,8 @@ export const ALL_ENTITIES: readonly EntitySchema[] = [ PlaceDetailsCacheSchema, PlaceRatingsSchema, PlaceRegionsSchema, - PlacesSchema, PlaceShadowPicksSchema, + PlacesSchema, PluginActionsSchema, PluginCapabilityAuditSchema, PluginEgressHostsSchema, @@ -201,14 +204,14 @@ export const ALL_ENTITIES: readonly EntitySchema[] = [ PluginOauthStateSchema, PluginOauthTokensSchema, PluginScheduledTasksSchema, - PluginsSchema, PluginSettingsFieldsSchema, PluginUserConfigSchema, PluginUserErasureQueueSchema, + PluginsSchema, ReservationDayPositionsSchema, ReservationEndpointsSchema, - ReservationsSchema, ReservationTravelersSchema, + ReservationsSchema, RoadtripDayBoundariesSchema, RoadtripDayTracksSchema, RoadtripPreferencesSchema, @@ -226,6 +229,7 @@ export const ALL_ENTITIES: readonly EntitySchema[] = [ TrekPhotoCacheMetaSchema, TrekPhotosSchema, TripAlbumLinksSchema, + TripDocumentLinksSchema, TripFilesSchema, TripInviteTokensSchema, TripMembersSchema, diff --git a/server/src/db/repositories/Addons.repository.ts b/server/src/db/repositories/Addons.repository.ts new file mode 100644 index 000000000..8ca0d698d --- /dev/null +++ b/server/src/db/repositories/Addons.repository.ts @@ -0,0 +1,4 @@ +import type { Addons } from '../entities/Addons.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class AddonsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/AppSettings.repository.ts b/server/src/db/repositories/AppSettings.repository.ts new file mode 100644 index 000000000..84bcfc8b5 --- /dev/null +++ b/server/src/db/repositories/AppSettings.repository.ts @@ -0,0 +1,4 @@ +import type { AppSettings } from '../entities/AppSettings.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class AppSettingsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/AssignmentParticipants.repository.ts b/server/src/db/repositories/AssignmentParticipants.repository.ts new file mode 100644 index 000000000..a441cbc06 --- /dev/null +++ b/server/src/db/repositories/AssignmentParticipants.repository.ts @@ -0,0 +1,4 @@ +import type { AssignmentParticipants } from '../entities/AssignmentParticipants.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class AssignmentParticipantsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/AuditLog.repository.ts b/server/src/db/repositories/AuditLog.repository.ts new file mode 100644 index 000000000..4e3929448 --- /dev/null +++ b/server/src/db/repositories/AuditLog.repository.ts @@ -0,0 +1,4 @@ +import type { AuditLog } from '../entities/AuditLog.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class AuditLogRepository extends EntityRepository {} diff --git a/server/src/db/repositories/BucketList.repository.ts b/server/src/db/repositories/BucketList.repository.ts new file mode 100644 index 000000000..bd5f6cceb --- /dev/null +++ b/server/src/db/repositories/BucketList.repository.ts @@ -0,0 +1,4 @@ +import type { BucketList } from '../entities/BucketList.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class BucketListRepository extends EntityRepository {} diff --git a/server/src/db/repositories/BudgetItemMembers.repository.ts b/server/src/db/repositories/BudgetItemMembers.repository.ts new file mode 100644 index 000000000..33d6a96e8 --- /dev/null +++ b/server/src/db/repositories/BudgetItemMembers.repository.ts @@ -0,0 +1,4 @@ +import type { BudgetItemMembers } from '../entities/BudgetItemMembers.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class BudgetItemMembersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/BudgetItemPayers.repository.ts b/server/src/db/repositories/BudgetItemPayers.repository.ts new file mode 100644 index 000000000..b834e75d1 --- /dev/null +++ b/server/src/db/repositories/BudgetItemPayers.repository.ts @@ -0,0 +1,4 @@ +import type { BudgetItemPayers } from '../entities/BudgetItemPayers.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class BudgetItemPayersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/BudgetItems.repository.ts b/server/src/db/repositories/BudgetItems.repository.ts new file mode 100644 index 000000000..7dda3e117 --- /dev/null +++ b/server/src/db/repositories/BudgetItems.repository.ts @@ -0,0 +1,4 @@ +import type { BudgetItems } from '../entities/BudgetItems.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class BudgetItemsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/BudgetSettlements.repository.ts b/server/src/db/repositories/BudgetSettlements.repository.ts new file mode 100644 index 000000000..f117c9a33 --- /dev/null +++ b/server/src/db/repositories/BudgetSettlements.repository.ts @@ -0,0 +1,4 @@ +import type { BudgetSettlements } from '../entities/BudgetSettlements.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class BudgetSettlementsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Categories.repository.ts b/server/src/db/repositories/Categories.repository.ts new file mode 100644 index 000000000..63b6e40ed --- /dev/null +++ b/server/src/db/repositories/Categories.repository.ts @@ -0,0 +1,4 @@ +import type { Categories } from '../entities/Categories.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CategoriesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollabLinks.repository.ts b/server/src/db/repositories/CollabLinks.repository.ts new file mode 100644 index 000000000..9f3948010 --- /dev/null +++ b/server/src/db/repositories/CollabLinks.repository.ts @@ -0,0 +1,4 @@ +import type { CollabLinks } from '../entities/CollabLinks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollabLinksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollabMessageReactions.repository.ts b/server/src/db/repositories/CollabMessageReactions.repository.ts new file mode 100644 index 000000000..02d449b08 --- /dev/null +++ b/server/src/db/repositories/CollabMessageReactions.repository.ts @@ -0,0 +1,4 @@ +import type { CollabMessageReactions } from '../entities/CollabMessageReactions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollabMessageReactionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollabMessages.repository.ts b/server/src/db/repositories/CollabMessages.repository.ts new file mode 100644 index 000000000..9f666b1d1 --- /dev/null +++ b/server/src/db/repositories/CollabMessages.repository.ts @@ -0,0 +1,4 @@ +import type { CollabMessages } from '../entities/CollabMessages.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollabMessagesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollabNotes.repository.ts b/server/src/db/repositories/CollabNotes.repository.ts new file mode 100644 index 000000000..55b042aba --- /dev/null +++ b/server/src/db/repositories/CollabNotes.repository.ts @@ -0,0 +1,4 @@ +import type { CollabNotes } from '../entities/CollabNotes.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollabNotesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollabPollVotes.repository.ts b/server/src/db/repositories/CollabPollVotes.repository.ts new file mode 100644 index 000000000..7cbd6b49d --- /dev/null +++ b/server/src/db/repositories/CollabPollVotes.repository.ts @@ -0,0 +1,4 @@ +import type { CollabPollVotes } from '../entities/CollabPollVotes.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollabPollVotesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollabPolls.repository.ts b/server/src/db/repositories/CollabPolls.repository.ts new file mode 100644 index 000000000..570d906e2 --- /dev/null +++ b/server/src/db/repositories/CollabPolls.repository.ts @@ -0,0 +1,4 @@ +import type { CollabPolls } from '../entities/CollabPolls.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollabPollsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollectionLabels.repository.ts b/server/src/db/repositories/CollectionLabels.repository.ts new file mode 100644 index 000000000..2c0bcbddb --- /dev/null +++ b/server/src/db/repositories/CollectionLabels.repository.ts @@ -0,0 +1,4 @@ +import type { CollectionLabels } from '../entities/CollectionLabels.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollectionLabelsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollectionMembers.repository.ts b/server/src/db/repositories/CollectionMembers.repository.ts new file mode 100644 index 000000000..a5051939e --- /dev/null +++ b/server/src/db/repositories/CollectionMembers.repository.ts @@ -0,0 +1,4 @@ +import type { CollectionMembers } from '../entities/CollectionMembers.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollectionMembersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollectionPlaceRatings.repository.ts b/server/src/db/repositories/CollectionPlaceRatings.repository.ts new file mode 100644 index 000000000..49a415ec0 --- /dev/null +++ b/server/src/db/repositories/CollectionPlaceRatings.repository.ts @@ -0,0 +1,4 @@ +import type { CollectionPlaceRatings } from '../entities/CollectionPlaceRatings.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollectionPlaceRatingsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/CollectionPlaces.repository.ts b/server/src/db/repositories/CollectionPlaces.repository.ts new file mode 100644 index 000000000..0d0d9f355 --- /dev/null +++ b/server/src/db/repositories/CollectionPlaces.repository.ts @@ -0,0 +1,4 @@ +import type { CollectionPlaces } from '../entities/CollectionPlaces.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollectionPlacesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Collections.repository.ts b/server/src/db/repositories/Collections.repository.ts new file mode 100644 index 000000000..2946d880d --- /dev/null +++ b/server/src/db/repositories/Collections.repository.ts @@ -0,0 +1,4 @@ +import type { Collections } from '../entities/Collections.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class CollectionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DawarichConnections.repository.ts b/server/src/db/repositories/DawarichConnections.repository.ts new file mode 100644 index 000000000..c597c8bfa --- /dev/null +++ b/server/src/db/repositories/DawarichConnections.repository.ts @@ -0,0 +1,4 @@ +import type { DawarichConnections } from '../entities/DawarichConnections.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DawarichConnectionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DawarichVisitSuggestions.repository.ts b/server/src/db/repositories/DawarichVisitSuggestions.repository.ts new file mode 100644 index 000000000..f2bac51d7 --- /dev/null +++ b/server/src/db/repositories/DawarichVisitSuggestions.repository.ts @@ -0,0 +1,4 @@ +import type { DawarichVisitSuggestions } from '../entities/DawarichVisitSuggestions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DawarichVisitSuggestionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DayAccommodations.repository.ts b/server/src/db/repositories/DayAccommodations.repository.ts new file mode 100644 index 000000000..592616e15 --- /dev/null +++ b/server/src/db/repositories/DayAccommodations.repository.ts @@ -0,0 +1,4 @@ +import type { DayAccommodations } from '../entities/DayAccommodations.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DayAccommodationsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DayAssignments.repository.ts b/server/src/db/repositories/DayAssignments.repository.ts new file mode 100644 index 000000000..297674a8b --- /dev/null +++ b/server/src/db/repositories/DayAssignments.repository.ts @@ -0,0 +1,4 @@ +import type { DayAssignments } from '../entities/DayAssignments.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DayAssignmentsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DocumentConnections.repository.ts b/server/src/db/repositories/DocumentConnections.repository.ts new file mode 100644 index 000000000..2d8729b10 --- /dev/null +++ b/server/src/db/repositories/DocumentConnections.repository.ts @@ -0,0 +1,4 @@ +import type { DocumentConnections } from '../entities/DocumentConnections.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DocumentConnectionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DocumentProviderFields.repository.ts b/server/src/db/repositories/DocumentProviderFields.repository.ts new file mode 100644 index 000000000..dcb654a47 --- /dev/null +++ b/server/src/db/repositories/DocumentProviderFields.repository.ts @@ -0,0 +1,4 @@ +import type { DocumentProviderFields } from '../entities/DocumentProviderFields.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DocumentProviderFieldsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DocumentProviders.repository.ts b/server/src/db/repositories/DocumentProviders.repository.ts new file mode 100644 index 000000000..10c071ef3 --- /dev/null +++ b/server/src/db/repositories/DocumentProviders.repository.ts @@ -0,0 +1,4 @@ +import type { DocumentProviders } from '../entities/DocumentProviders.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DocumentProvidersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/DocumentSyncItems.repository.ts b/server/src/db/repositories/DocumentSyncItems.repository.ts new file mode 100644 index 000000000..bc0bf3263 --- /dev/null +++ b/server/src/db/repositories/DocumentSyncItems.repository.ts @@ -0,0 +1,4 @@ +import type { DocumentSyncItems } from '../entities/DocumentSyncItems.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class DocumentSyncItemsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/FileLinks.repository.ts b/server/src/db/repositories/FileLinks.repository.ts new file mode 100644 index 000000000..f2a0449c0 --- /dev/null +++ b/server/src/db/repositories/FileLinks.repository.ts @@ -0,0 +1,4 @@ +import type { FileLinks } from '../entities/FileLinks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class FileLinksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/GooglePlacePhotoMeta.repository.ts b/server/src/db/repositories/GooglePlacePhotoMeta.repository.ts new file mode 100644 index 000000000..991f1167b --- /dev/null +++ b/server/src/db/repositories/GooglePlacePhotoMeta.repository.ts @@ -0,0 +1,4 @@ +import type { GooglePlacePhotoMeta } from '../entities/GooglePlacePhotoMeta.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class GooglePlacePhotoMetaRepository extends EntityRepository {} diff --git a/server/src/db/repositories/HiddenCountries.repository.ts b/server/src/db/repositories/HiddenCountries.repository.ts new file mode 100644 index 000000000..3904e2f0e --- /dev/null +++ b/server/src/db/repositories/HiddenCountries.repository.ts @@ -0,0 +1,4 @@ +import type { HiddenCountries } from '../entities/HiddenCountries.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class HiddenCountriesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/HiddenRegions.repository.ts b/server/src/db/repositories/HiddenRegions.repository.ts new file mode 100644 index 000000000..99289a507 --- /dev/null +++ b/server/src/db/repositories/HiddenRegions.repository.ts @@ -0,0 +1,4 @@ +import type { HiddenRegions } from '../entities/HiddenRegions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class HiddenRegionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/IdempotencyKeys.repository.ts b/server/src/db/repositories/IdempotencyKeys.repository.ts new file mode 100644 index 000000000..dca7a242c --- /dev/null +++ b/server/src/db/repositories/IdempotencyKeys.repository.ts @@ -0,0 +1,4 @@ +import type { IdempotencyKeys } from '../entities/IdempotencyKeys.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class IdempotencyKeysRepository extends EntityRepository {} diff --git a/server/src/db/repositories/InviteTokens.repository.ts b/server/src/db/repositories/InviteTokens.repository.ts new file mode 100644 index 000000000..68aa8d0c2 --- /dev/null +++ b/server/src/db/repositories/InviteTokens.repository.ts @@ -0,0 +1,4 @@ +import type { InviteTokens } from '../entities/InviteTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class InviteTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/JourneyBooks.repository.ts b/server/src/db/repositories/JourneyBooks.repository.ts new file mode 100644 index 000000000..504a76a82 --- /dev/null +++ b/server/src/db/repositories/JourneyBooks.repository.ts @@ -0,0 +1,4 @@ +import type { JourneyBooks } from '../entities/JourneyBooks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneyBooksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/JourneyContributors.repository.ts b/server/src/db/repositories/JourneyContributors.repository.ts new file mode 100644 index 000000000..096f9fda2 --- /dev/null +++ b/server/src/db/repositories/JourneyContributors.repository.ts @@ -0,0 +1,4 @@ +import type { JourneyContributors } from '../entities/JourneyContributors.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneyContributorsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/JourneyEntries.repository.ts b/server/src/db/repositories/JourneyEntries.repository.ts new file mode 100644 index 000000000..96fcd06c0 --- /dev/null +++ b/server/src/db/repositories/JourneyEntries.repository.ts @@ -0,0 +1,4 @@ +import type { JourneyEntries } from '../entities/JourneyEntries.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneyEntriesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/JourneyEntryPhotos.repository.ts b/server/src/db/repositories/JourneyEntryPhotos.repository.ts new file mode 100644 index 000000000..81b8bda92 --- /dev/null +++ b/server/src/db/repositories/JourneyEntryPhotos.repository.ts @@ -0,0 +1,4 @@ +import type { JourneyEntryPhotos } from '../entities/JourneyEntryPhotos.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneyEntryPhotosRepository extends EntityRepository {} diff --git a/server/src/db/repositories/JourneyPhotos.repository.ts b/server/src/db/repositories/JourneyPhotos.repository.ts new file mode 100644 index 000000000..191de482d --- /dev/null +++ b/server/src/db/repositories/JourneyPhotos.repository.ts @@ -0,0 +1,4 @@ +import type { JourneyPhotos } from '../entities/JourneyPhotos.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneyPhotosRepository extends EntityRepository {} diff --git a/server/src/db/repositories/JourneyShareTokens.repository.ts b/server/src/db/repositories/JourneyShareTokens.repository.ts new file mode 100644 index 000000000..2565419d2 --- /dev/null +++ b/server/src/db/repositories/JourneyShareTokens.repository.ts @@ -0,0 +1,4 @@ +import type { JourneyShareTokens } from '../entities/JourneyShareTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneyShareTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/JourneyTrips.repository.ts b/server/src/db/repositories/JourneyTrips.repository.ts new file mode 100644 index 000000000..f1de6b039 --- /dev/null +++ b/server/src/db/repositories/JourneyTrips.repository.ts @@ -0,0 +1,4 @@ +import type { JourneyTrips } from '../entities/JourneyTrips.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneyTripsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Journeys.repository.ts b/server/src/db/repositories/Journeys.repository.ts new file mode 100644 index 000000000..764970d72 --- /dev/null +++ b/server/src/db/repositories/Journeys.repository.ts @@ -0,0 +1,4 @@ +import type { Journeys } from '../entities/Journeys.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class JourneysRepository extends EntityRepository {} diff --git a/server/src/db/repositories/McpTokens.repository.ts b/server/src/db/repositories/McpTokens.repository.ts new file mode 100644 index 000000000..872b1f2ae --- /dev/null +++ b/server/src/db/repositories/McpTokens.repository.ts @@ -0,0 +1,4 @@ +import type { McpTokens } from '../entities/McpTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class McpTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Migrations.repository.ts b/server/src/db/repositories/Migrations.repository.ts new file mode 100644 index 000000000..c3655cb2f --- /dev/null +++ b/server/src/db/repositories/Migrations.repository.ts @@ -0,0 +1,4 @@ +import type { Migrations } from '../entities/Migrations.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class MigrationsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/NotificationChannelPreferences.repository.ts b/server/src/db/repositories/NotificationChannelPreferences.repository.ts new file mode 100644 index 000000000..d554a4cfb --- /dev/null +++ b/server/src/db/repositories/NotificationChannelPreferences.repository.ts @@ -0,0 +1,4 @@ +import type { NotificationChannelPreferences } from '../entities/NotificationChannelPreferences.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class NotificationChannelPreferencesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Notifications.repository.ts b/server/src/db/repositories/Notifications.repository.ts new file mode 100644 index 000000000..4cdb296e5 --- /dev/null +++ b/server/src/db/repositories/Notifications.repository.ts @@ -0,0 +1,4 @@ +import type { Notifications } from '../entities/Notifications.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class NotificationsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/OauthClients.repository.ts b/server/src/db/repositories/OauthClients.repository.ts new file mode 100644 index 000000000..8dee1e0b1 --- /dev/null +++ b/server/src/db/repositories/OauthClients.repository.ts @@ -0,0 +1,4 @@ +import type { OauthClients } from '../entities/OauthClients.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class OauthClientsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/OauthConsents.repository.ts b/server/src/db/repositories/OauthConsents.repository.ts new file mode 100644 index 000000000..1a5b4a8a7 --- /dev/null +++ b/server/src/db/repositories/OauthConsents.repository.ts @@ -0,0 +1,4 @@ +import type { OauthConsents } from '../entities/OauthConsents.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class OauthConsentsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/OauthTokens.repository.ts b/server/src/db/repositories/OauthTokens.repository.ts new file mode 100644 index 000000000..a86354057 --- /dev/null +++ b/server/src/db/repositories/OauthTokens.repository.ts @@ -0,0 +1,4 @@ +import type { OauthTokens } from '../entities/OauthTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class OauthTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PackingBags.repository.ts b/server/src/db/repositories/PackingBags.repository.ts new file mode 100644 index 000000000..6d319f938 --- /dev/null +++ b/server/src/db/repositories/PackingBags.repository.ts @@ -0,0 +1,4 @@ +import type { PackingBags } from '../entities/PackingBags.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PackingBagsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PackingCategoryAssignees.repository.ts b/server/src/db/repositories/PackingCategoryAssignees.repository.ts new file mode 100644 index 000000000..5c5b61863 --- /dev/null +++ b/server/src/db/repositories/PackingCategoryAssignees.repository.ts @@ -0,0 +1,4 @@ +import type { PackingCategoryAssignees } from '../entities/PackingCategoryAssignees.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PackingCategoryAssigneesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PackingItemContributors.repository.ts b/server/src/db/repositories/PackingItemContributors.repository.ts new file mode 100644 index 000000000..b5cd81ef7 --- /dev/null +++ b/server/src/db/repositories/PackingItemContributors.repository.ts @@ -0,0 +1,4 @@ +import type { PackingItemContributors } from '../entities/PackingItemContributors.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PackingItemContributorsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PackingItems.repository.ts b/server/src/db/repositories/PackingItems.repository.ts new file mode 100644 index 000000000..c80366e75 --- /dev/null +++ b/server/src/db/repositories/PackingItems.repository.ts @@ -0,0 +1,4 @@ +import type { PackingItems } from '../entities/PackingItems.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PackingItemsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PackingTemplateCategories.repository.ts b/server/src/db/repositories/PackingTemplateCategories.repository.ts new file mode 100644 index 000000000..8718ef311 --- /dev/null +++ b/server/src/db/repositories/PackingTemplateCategories.repository.ts @@ -0,0 +1,4 @@ +import type { PackingTemplateCategories } from '../entities/PackingTemplateCategories.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PackingTemplateCategoriesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PackingTemplateItems.repository.ts b/server/src/db/repositories/PackingTemplateItems.repository.ts new file mode 100644 index 000000000..782cd44c2 --- /dev/null +++ b/server/src/db/repositories/PackingTemplateItems.repository.ts @@ -0,0 +1,4 @@ +import type { PackingTemplateItems } from '../entities/PackingTemplateItems.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PackingTemplateItemsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PackingTemplates.repository.ts b/server/src/db/repositories/PackingTemplates.repository.ts new file mode 100644 index 000000000..aa37f129a --- /dev/null +++ b/server/src/db/repositories/PackingTemplates.repository.ts @@ -0,0 +1,4 @@ +import type { PackingTemplates } from '../entities/PackingTemplates.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PackingTemplatesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PasswordResetTokens.repository.ts b/server/src/db/repositories/PasswordResetTokens.repository.ts new file mode 100644 index 000000000..e6f047cf2 --- /dev/null +++ b/server/src/db/repositories/PasswordResetTokens.repository.ts @@ -0,0 +1,4 @@ +import type { PasswordResetTokens } from '../entities/PasswordResetTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PasswordResetTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PhotoProviderFields.repository.ts b/server/src/db/repositories/PhotoProviderFields.repository.ts new file mode 100644 index 000000000..5e0467960 --- /dev/null +++ b/server/src/db/repositories/PhotoProviderFields.repository.ts @@ -0,0 +1,4 @@ +import type { PhotoProviderFields } from '../entities/PhotoProviderFields.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PhotoProviderFieldsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PhotoProviders.repository.ts b/server/src/db/repositories/PhotoProviders.repository.ts new file mode 100644 index 000000000..8a800814f --- /dev/null +++ b/server/src/db/repositories/PhotoProviders.repository.ts @@ -0,0 +1,4 @@ +import type { PhotoProviders } from '../entities/PhotoProviders.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PhotoProvidersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Photos.repository.ts b/server/src/db/repositories/Photos.repository.ts new file mode 100644 index 000000000..ebae2fa64 --- /dev/null +++ b/server/src/db/repositories/Photos.repository.ts @@ -0,0 +1,4 @@ +import type { Photos } from '../entities/Photos.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PhotosRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PlaceDetailsCache.repository.ts b/server/src/db/repositories/PlaceDetailsCache.repository.ts new file mode 100644 index 000000000..79faa88e2 --- /dev/null +++ b/server/src/db/repositories/PlaceDetailsCache.repository.ts @@ -0,0 +1,4 @@ +import type { PlaceDetailsCache } from '../entities/PlaceDetailsCache.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PlaceDetailsCacheRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PlaceRatings.repository.ts b/server/src/db/repositories/PlaceRatings.repository.ts new file mode 100644 index 000000000..a3bd830b9 --- /dev/null +++ b/server/src/db/repositories/PlaceRatings.repository.ts @@ -0,0 +1,4 @@ +import type { PlaceRatings } from '../entities/PlaceRatings.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PlaceRatingsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PlaceRegions.repository.ts b/server/src/db/repositories/PlaceRegions.repository.ts new file mode 100644 index 000000000..d52c85ded --- /dev/null +++ b/server/src/db/repositories/PlaceRegions.repository.ts @@ -0,0 +1,4 @@ +import type { PlaceRegions } from '../entities/PlaceRegions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PlaceRegionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PlaceShadowPicks.repository.ts b/server/src/db/repositories/PlaceShadowPicks.repository.ts new file mode 100644 index 000000000..69b886db0 --- /dev/null +++ b/server/src/db/repositories/PlaceShadowPicks.repository.ts @@ -0,0 +1,4 @@ +import type { PlaceShadowPicks } from '../entities/PlaceShadowPicks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PlaceShadowPicksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Places.repository.ts b/server/src/db/repositories/Places.repository.ts new file mode 100644 index 000000000..8e18821be --- /dev/null +++ b/server/src/db/repositories/Places.repository.ts @@ -0,0 +1,4 @@ +import type { Places } from '../entities/Places.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PlacesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginActions.repository.ts b/server/src/db/repositories/PluginActions.repository.ts new file mode 100644 index 000000000..9daef6c70 --- /dev/null +++ b/server/src/db/repositories/PluginActions.repository.ts @@ -0,0 +1,4 @@ +import type { PluginActions } from '../entities/PluginActions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginActionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginCapabilityAudit.repository.ts b/server/src/db/repositories/PluginCapabilityAudit.repository.ts new file mode 100644 index 000000000..d4a4c29fe --- /dev/null +++ b/server/src/db/repositories/PluginCapabilityAudit.repository.ts @@ -0,0 +1,4 @@ +import type { PluginCapabilityAudit } from '../entities/PluginCapabilityAudit.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginCapabilityAuditRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginEgressHosts.repository.ts b/server/src/db/repositories/PluginEgressHosts.repository.ts new file mode 100644 index 000000000..66b8463ff --- /dev/null +++ b/server/src/db/repositories/PluginEgressHosts.repository.ts @@ -0,0 +1,4 @@ +import type { PluginEgressHosts } from '../entities/PluginEgressHosts.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginEgressHostsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginEntityMetadata.repository.ts b/server/src/db/repositories/PluginEntityMetadata.repository.ts new file mode 100644 index 000000000..79ef31386 --- /dev/null +++ b/server/src/db/repositories/PluginEntityMetadata.repository.ts @@ -0,0 +1,4 @@ +import type { PluginEntityMetadata } from '../entities/PluginEntityMetadata.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginEntityMetadataRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginErrorLog.repository.ts b/server/src/db/repositories/PluginErrorLog.repository.ts new file mode 100644 index 000000000..087d9a69a --- /dev/null +++ b/server/src/db/repositories/PluginErrorLog.repository.ts @@ -0,0 +1,4 @@ +import type { PluginErrorLog } from '../entities/PluginErrorLog.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginErrorLogRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginMetaMigrations.repository.ts b/server/src/db/repositories/PluginMetaMigrations.repository.ts new file mode 100644 index 000000000..05f0e403c --- /dev/null +++ b/server/src/db/repositories/PluginMetaMigrations.repository.ts @@ -0,0 +1,4 @@ +import type { PluginMetaMigrations } from '../entities/PluginMetaMigrations.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginMetaMigrationsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginOauthState.repository.ts b/server/src/db/repositories/PluginOauthState.repository.ts new file mode 100644 index 000000000..48211f24c --- /dev/null +++ b/server/src/db/repositories/PluginOauthState.repository.ts @@ -0,0 +1,4 @@ +import type { PluginOauthState } from '../entities/PluginOauthState.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginOauthStateRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginOauthTokens.repository.ts b/server/src/db/repositories/PluginOauthTokens.repository.ts new file mode 100644 index 000000000..9c3be3162 --- /dev/null +++ b/server/src/db/repositories/PluginOauthTokens.repository.ts @@ -0,0 +1,4 @@ +import type { PluginOauthTokens } from '../entities/PluginOauthTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginOauthTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginScheduledTasks.repository.ts b/server/src/db/repositories/PluginScheduledTasks.repository.ts new file mode 100644 index 000000000..c41303237 --- /dev/null +++ b/server/src/db/repositories/PluginScheduledTasks.repository.ts @@ -0,0 +1,4 @@ +import type { PluginScheduledTasks } from '../entities/PluginScheduledTasks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginScheduledTasksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginSettingsFields.repository.ts b/server/src/db/repositories/PluginSettingsFields.repository.ts new file mode 100644 index 000000000..f525c784b --- /dev/null +++ b/server/src/db/repositories/PluginSettingsFields.repository.ts @@ -0,0 +1,4 @@ +import type { PluginSettingsFields } from '../entities/PluginSettingsFields.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginSettingsFieldsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginUserConfig.repository.ts b/server/src/db/repositories/PluginUserConfig.repository.ts new file mode 100644 index 000000000..849cb756f --- /dev/null +++ b/server/src/db/repositories/PluginUserConfig.repository.ts @@ -0,0 +1,4 @@ +import type { PluginUserConfig } from '../entities/PluginUserConfig.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginUserConfigRepository extends EntityRepository {} diff --git a/server/src/db/repositories/PluginUserErasureQueue.repository.ts b/server/src/db/repositories/PluginUserErasureQueue.repository.ts new file mode 100644 index 000000000..b91b4548e --- /dev/null +++ b/server/src/db/repositories/PluginUserErasureQueue.repository.ts @@ -0,0 +1,4 @@ +import type { PluginUserErasureQueue } from '../entities/PluginUserErasureQueue.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginUserErasureQueueRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Plugins.repository.ts b/server/src/db/repositories/Plugins.repository.ts new file mode 100644 index 000000000..479d6be39 --- /dev/null +++ b/server/src/db/repositories/Plugins.repository.ts @@ -0,0 +1,4 @@ +import type { Plugins } from '../entities/Plugins.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class PluginsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/ReservationDayPositions.repository.ts b/server/src/db/repositories/ReservationDayPositions.repository.ts new file mode 100644 index 000000000..ea3dd5c42 --- /dev/null +++ b/server/src/db/repositories/ReservationDayPositions.repository.ts @@ -0,0 +1,4 @@ +import type { ReservationDayPositions } from '../entities/ReservationDayPositions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class ReservationDayPositionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/ReservationEndpoints.repository.ts b/server/src/db/repositories/ReservationEndpoints.repository.ts new file mode 100644 index 000000000..cf5cfb62b --- /dev/null +++ b/server/src/db/repositories/ReservationEndpoints.repository.ts @@ -0,0 +1,4 @@ +import type { ReservationEndpoints } from '../entities/ReservationEndpoints.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class ReservationEndpointsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/ReservationTravelers.repository.ts b/server/src/db/repositories/ReservationTravelers.repository.ts new file mode 100644 index 000000000..9a77822a1 --- /dev/null +++ b/server/src/db/repositories/ReservationTravelers.repository.ts @@ -0,0 +1,4 @@ +import type { ReservationTravelers } from '../entities/ReservationTravelers.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class ReservationTravelersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Reservations.repository.ts b/server/src/db/repositories/Reservations.repository.ts new file mode 100644 index 000000000..72a992688 --- /dev/null +++ b/server/src/db/repositories/Reservations.repository.ts @@ -0,0 +1,4 @@ +import type { Reservations } from '../entities/Reservations.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class ReservationsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/RoadtripDayBoundaries.repository.ts b/server/src/db/repositories/RoadtripDayBoundaries.repository.ts new file mode 100644 index 000000000..7f275564a --- /dev/null +++ b/server/src/db/repositories/RoadtripDayBoundaries.repository.ts @@ -0,0 +1,4 @@ +import type { RoadtripDayBoundaries } from '../entities/RoadtripDayBoundaries.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class RoadtripDayBoundariesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/RoadtripDayTracks.repository.ts b/server/src/db/repositories/RoadtripDayTracks.repository.ts new file mode 100644 index 000000000..c166aa35c --- /dev/null +++ b/server/src/db/repositories/RoadtripDayTracks.repository.ts @@ -0,0 +1,4 @@ +import type { RoadtripDayTracks } from '../entities/RoadtripDayTracks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class RoadtripDayTracksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/RoadtripPreferences.repository.ts b/server/src/db/repositories/RoadtripPreferences.repository.ts new file mode 100644 index 000000000..cc759aa0e --- /dev/null +++ b/server/src/db/repositories/RoadtripPreferences.repository.ts @@ -0,0 +1,4 @@ +import type { RoadtripPreferences } from '../entities/RoadtripPreferences.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class RoadtripPreferencesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/RoadtripVias.repository.ts b/server/src/db/repositories/RoadtripVias.repository.ts new file mode 100644 index 000000000..96d7c7575 --- /dev/null +++ b/server/src/db/repositories/RoadtripVias.repository.ts @@ -0,0 +1,4 @@ +import type { RoadtripVias } from '../entities/RoadtripVias.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class RoadtripViasRepository extends EntityRepository {} diff --git a/server/src/db/repositories/RouteUsageDaily.repository.ts b/server/src/db/repositories/RouteUsageDaily.repository.ts new file mode 100644 index 000000000..ab0be4bb6 --- /dev/null +++ b/server/src/db/repositories/RouteUsageDaily.repository.ts @@ -0,0 +1,4 @@ +import type { RouteUsageDaily } from '../entities/RouteUsageDaily.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class RouteUsageDailyRepository extends EntityRepository {} diff --git a/server/src/db/repositories/SchemaVersion.repository.ts b/server/src/db/repositories/SchemaVersion.repository.ts new file mode 100644 index 000000000..7c6c36d10 --- /dev/null +++ b/server/src/db/repositories/SchemaVersion.repository.ts @@ -0,0 +1,4 @@ +import type { SchemaVersion } from '../entities/SchemaVersion.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class SchemaVersionRepository extends EntityRepository {} diff --git a/server/src/db/repositories/SchoolHolidayCountries.repository.ts b/server/src/db/repositories/SchoolHolidayCountries.repository.ts new file mode 100644 index 000000000..bb847e2ec --- /dev/null +++ b/server/src/db/repositories/SchoolHolidayCountries.repository.ts @@ -0,0 +1,4 @@ +import type { SchoolHolidayCountries } from '../entities/SchoolHolidayCountries.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class SchoolHolidayCountriesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/SchoolHolidayPeriods.repository.ts b/server/src/db/repositories/SchoolHolidayPeriods.repository.ts new file mode 100644 index 000000000..718600436 --- /dev/null +++ b/server/src/db/repositories/SchoolHolidayPeriods.repository.ts @@ -0,0 +1,4 @@ +import type { SchoolHolidayPeriods } from '../entities/SchoolHolidayPeriods.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class SchoolHolidayPeriodsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/SchoolHolidayRegions.repository.ts b/server/src/db/repositories/SchoolHolidayRegions.repository.ts new file mode 100644 index 000000000..5d069dbdb --- /dev/null +++ b/server/src/db/repositories/SchoolHolidayRegions.repository.ts @@ -0,0 +1,4 @@ +import type { SchoolHolidayRegions } from '../entities/SchoolHolidayRegions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class SchoolHolidayRegionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Settings.repository.ts b/server/src/db/repositories/Settings.repository.ts new file mode 100644 index 000000000..c22855775 --- /dev/null +++ b/server/src/db/repositories/Settings.repository.ts @@ -0,0 +1,4 @@ +import type { Settings } from '../entities/Settings.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class SettingsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/ShareTokens.repository.ts b/server/src/db/repositories/ShareTokens.repository.ts new file mode 100644 index 000000000..5de1ea260 --- /dev/null +++ b/server/src/db/repositories/ShareTokens.repository.ts @@ -0,0 +1,4 @@ +import type { ShareTokens } from '../entities/ShareTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class ShareTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Tags.repository.ts b/server/src/db/repositories/Tags.repository.ts new file mode 100644 index 000000000..2104195f5 --- /dev/null +++ b/server/src/db/repositories/Tags.repository.ts @@ -0,0 +1,4 @@ +import type { Tags } from '../entities/Tags.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TagsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TodoCategoryAssignees.repository.ts b/server/src/db/repositories/TodoCategoryAssignees.repository.ts new file mode 100644 index 000000000..ae9ae8c7a --- /dev/null +++ b/server/src/db/repositories/TodoCategoryAssignees.repository.ts @@ -0,0 +1,4 @@ +import type { TodoCategoryAssignees } from '../entities/TodoCategoryAssignees.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TodoCategoryAssigneesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TodoItems.repository.ts b/server/src/db/repositories/TodoItems.repository.ts new file mode 100644 index 000000000..b2cbb0a2a --- /dev/null +++ b/server/src/db/repositories/TodoItems.repository.ts @@ -0,0 +1,4 @@ +import type { TodoItems } from '../entities/TodoItems.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TodoItemsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TrekPhotoCacheMeta.repository.ts b/server/src/db/repositories/TrekPhotoCacheMeta.repository.ts new file mode 100644 index 000000000..36edec01e --- /dev/null +++ b/server/src/db/repositories/TrekPhotoCacheMeta.repository.ts @@ -0,0 +1,4 @@ +import type { TrekPhotoCacheMeta } from '../entities/TrekPhotoCacheMeta.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TrekPhotoCacheMetaRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TrekPhotos.repository.ts b/server/src/db/repositories/TrekPhotos.repository.ts new file mode 100644 index 000000000..90805908c --- /dev/null +++ b/server/src/db/repositories/TrekPhotos.repository.ts @@ -0,0 +1,4 @@ +import type { TrekPhotos } from '../entities/TrekPhotos.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TrekPhotosRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TripAlbumLinks.repository.ts b/server/src/db/repositories/TripAlbumLinks.repository.ts new file mode 100644 index 000000000..55ce4912d --- /dev/null +++ b/server/src/db/repositories/TripAlbumLinks.repository.ts @@ -0,0 +1,4 @@ +import type { TripAlbumLinks } from '../entities/TripAlbumLinks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TripAlbumLinksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TripDocumentLinks.repository.ts b/server/src/db/repositories/TripDocumentLinks.repository.ts new file mode 100644 index 000000000..a969d9414 --- /dev/null +++ b/server/src/db/repositories/TripDocumentLinks.repository.ts @@ -0,0 +1,4 @@ +import type { TripDocumentLinks } from '../entities/TripDocumentLinks.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TripDocumentLinksRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TripFiles.repository.ts b/server/src/db/repositories/TripFiles.repository.ts new file mode 100644 index 000000000..4dc77ba81 --- /dev/null +++ b/server/src/db/repositories/TripFiles.repository.ts @@ -0,0 +1,4 @@ +import type { TripFiles } from '../entities/TripFiles.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TripFilesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TripInviteTokens.repository.ts b/server/src/db/repositories/TripInviteTokens.repository.ts new file mode 100644 index 000000000..a0acc7716 --- /dev/null +++ b/server/src/db/repositories/TripInviteTokens.repository.ts @@ -0,0 +1,4 @@ +import type { TripInviteTokens } from '../entities/TripInviteTokens.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TripInviteTokensRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TripMembers.repository.ts b/server/src/db/repositories/TripMembers.repository.ts new file mode 100644 index 000000000..f3a386838 --- /dev/null +++ b/server/src/db/repositories/TripMembers.repository.ts @@ -0,0 +1,4 @@ +import type { TripMembers } from '../entities/TripMembers.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TripMembersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/TripPhotos.repository.ts b/server/src/db/repositories/TripPhotos.repository.ts new file mode 100644 index 000000000..d50d9b221 --- /dev/null +++ b/server/src/db/repositories/TripPhotos.repository.ts @@ -0,0 +1,4 @@ +import type { TripPhotos } from '../entities/TripPhotos.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class TripPhotosRepository extends EntityRepository {} diff --git a/server/src/db/repositories/UserNoticeDismissals.repository.ts b/server/src/db/repositories/UserNoticeDismissals.repository.ts new file mode 100644 index 000000000..098ebe1e5 --- /dev/null +++ b/server/src/db/repositories/UserNoticeDismissals.repository.ts @@ -0,0 +1,4 @@ +import type { UserNoticeDismissals } from '../entities/UserNoticeDismissals.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class UserNoticeDismissalsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/Users.repository.ts b/server/src/db/repositories/Users.repository.ts new file mode 100644 index 000000000..38e63a4b2 --- /dev/null +++ b/server/src/db/repositories/Users.repository.ts @@ -0,0 +1,4 @@ +import type { Users } from '../entities/Users.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class UsersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayCompanyHolidays.repository.ts b/server/src/db/repositories/VacayCompanyHolidays.repository.ts new file mode 100644 index 000000000..47834c177 --- /dev/null +++ b/server/src/db/repositories/VacayCompanyHolidays.repository.ts @@ -0,0 +1,4 @@ +import type { VacayCompanyHolidays } from '../entities/VacayCompanyHolidays.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayCompanyHolidaysRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayEntries.repository.ts b/server/src/db/repositories/VacayEntries.repository.ts new file mode 100644 index 000000000..faae865e4 --- /dev/null +++ b/server/src/db/repositories/VacayEntries.repository.ts @@ -0,0 +1,4 @@ +import type { VacayEntries } from '../entities/VacayEntries.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayEntriesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayHolidayCalendars.repository.ts b/server/src/db/repositories/VacayHolidayCalendars.repository.ts new file mode 100644 index 000000000..181118c55 --- /dev/null +++ b/server/src/db/repositories/VacayHolidayCalendars.repository.ts @@ -0,0 +1,4 @@ +import type { VacayHolidayCalendars } from '../entities/VacayHolidayCalendars.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayHolidayCalendarsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayPlanMembers.repository.ts b/server/src/db/repositories/VacayPlanMembers.repository.ts new file mode 100644 index 000000000..68eaffd82 --- /dev/null +++ b/server/src/db/repositories/VacayPlanMembers.repository.ts @@ -0,0 +1,4 @@ +import type { VacayPlanMembers } from '../entities/VacayPlanMembers.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayPlanMembersRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayPlans.repository.ts b/server/src/db/repositories/VacayPlans.repository.ts new file mode 100644 index 000000000..53ba81469 --- /dev/null +++ b/server/src/db/repositories/VacayPlans.repository.ts @@ -0,0 +1,4 @@ +import type { VacayPlans } from '../entities/VacayPlans.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayPlansRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayShares.repository.ts b/server/src/db/repositories/VacayShares.repository.ts new file mode 100644 index 000000000..327a332c9 --- /dev/null +++ b/server/src/db/repositories/VacayShares.repository.ts @@ -0,0 +1,4 @@ +import type { VacayShares } from '../entities/VacayShares.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacaySharesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayUserColors.repository.ts b/server/src/db/repositories/VacayUserColors.repository.ts new file mode 100644 index 000000000..81217a8ad --- /dev/null +++ b/server/src/db/repositories/VacayUserColors.repository.ts @@ -0,0 +1,4 @@ +import type { VacayUserColors } from '../entities/VacayUserColors.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayUserColorsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayUserYears.repository.ts b/server/src/db/repositories/VacayUserYears.repository.ts new file mode 100644 index 000000000..6de7df02f --- /dev/null +++ b/server/src/db/repositories/VacayUserYears.repository.ts @@ -0,0 +1,4 @@ +import type { VacayUserYears } from '../entities/VacayUserYears.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayUserYearsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VacayYears.repository.ts b/server/src/db/repositories/VacayYears.repository.ts new file mode 100644 index 000000000..038708285 --- /dev/null +++ b/server/src/db/repositories/VacayYears.repository.ts @@ -0,0 +1,4 @@ +import type { VacayYears } from '../entities/VacayYears.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VacayYearsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VisitedCountries.repository.ts b/server/src/db/repositories/VisitedCountries.repository.ts new file mode 100644 index 000000000..04cb510a6 --- /dev/null +++ b/server/src/db/repositories/VisitedCountries.repository.ts @@ -0,0 +1,4 @@ +import type { VisitedCountries } from '../entities/VisitedCountries.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VisitedCountriesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/VisitedRegions.repository.ts b/server/src/db/repositories/VisitedRegions.repository.ts new file mode 100644 index 000000000..67a41349f --- /dev/null +++ b/server/src/db/repositories/VisitedRegions.repository.ts @@ -0,0 +1,4 @@ +import type { VisitedRegions } from '../entities/VisitedRegions.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class VisitedRegionsRepository extends EntityRepository {} diff --git a/server/src/db/repositories/WebauthnChallenges.repository.ts b/server/src/db/repositories/WebauthnChallenges.repository.ts new file mode 100644 index 000000000..e89bd57cf --- /dev/null +++ b/server/src/db/repositories/WebauthnChallenges.repository.ts @@ -0,0 +1,4 @@ +import type { WebauthnChallenges } from '../entities/WebauthnChallenges.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class WebauthnChallengesRepository extends EntityRepository {} diff --git a/server/src/db/repositories/WebauthnCredentials.repository.ts b/server/src/db/repositories/WebauthnCredentials.repository.ts new file mode 100644 index 000000000..2c8a0bbd6 --- /dev/null +++ b/server/src/db/repositories/WebauthnCredentials.repository.ts @@ -0,0 +1,4 @@ +import type { WebauthnCredentials } from '../entities/WebauthnCredentials.entity'; +import { EntityRepository } from '@mikro-orm/sql'; + +export class WebauthnCredentialsRepository extends EntityRepository {} diff --git a/server/tests/unit/db/entities-index.test.ts b/server/tests/unit/db/entities-index.test.ts index 7c6e1e093..f90656258 100644 --- a/server/tests/unit/db/entities-index.test.ts +++ b/server/tests/unit/db/entities-index.test.ts @@ -1,10 +1,13 @@ -import { EntitySchema } from '@mikro-orm/core'; +import { EntitySchema, type EntityRepository } from '@mikro-orm/core'; import fs from 'node:fs'; import path from 'node:path'; -import { describe, expect, it } from 'vitest'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { ALL_ENTITIES } from '../../../src/db/entities'; +import { createSnapshotTestDb } from '../../helpers/db-mock'; +import { createTestOrm, type TestOrm } from '../../helpers/test-orm'; const ENTITIES_DIR = path.join(__dirname, '../../../src/db/entities'); +const REPOSITORIES_DIR = path.join(__dirname, '../../../src/db/repositories'); describe('ALL_ENTITIES', () => { it('ENT-001: lists exactly one schema per *.entity.ts file', () => { @@ -20,4 +23,65 @@ describe('ALL_ENTITIES', () => { expect(typeof schema.meta.class).toBe('function'); } }); + + /** + * Plan 2 Task 3: every one of the 125 entities the migrated schema + * describes (120 rewritten + the 5 document-sync tables added this task) + * is registered, and no two share a class name (a silent duplicate would + * shadow one of them in `orm.getMetadata()`, exactly the kind of drift + * `entity-schema-parity.test.ts` can't see — it iterates the metadata map, + * which de-duplicates by class name). + */ + it('ENT-003: exactly 125 entities, every class name unique', () => { + expect(ALL_ENTITIES.length).toBe(125); + const names = ALL_ENTITIES.map((s) => s.meta.className); + expect(new Set(names).size).toBe(names.length); + }); + + /** + * Task 1's review flagged this binding as otherwise unpinned: dropping an + * entity's `repository: () => XRepository` mutation stayed green in every + * gate up to here (task-1-review.md, minor 1). `em.getRepository(X)` must + * return an instance of the exact repository class + * `src/db/repositories/.repository.ts` exports, for every entity — + * the 120 the generator wrote a stub for this task plus the 5 pre-existing, + * hand-written ones (`Days`, `DayNotes`, `Trips`, `BudgetCategoryOrder`, + * `VacayUserSettings`) it left untouched. + */ + describe('ENT-004: em.getRepository(X) is an instance of X.repository.ts', () => { + let t: TestOrm; + const testDb = createSnapshotTestDb(); + + beforeAll(async () => { + t = await createTestOrm(testDb); + }); + + afterAll(async () => { + await t.close(); + testDb.close(); + }); + + it('every entity resolves to its own repository class', async () => { + const failures: string[] = []; + for (const schema of ALL_ENTITIES) { + const className = schema.meta.className; + const repoFile = path.join(REPOSITORIES_DIR, `${className}.repository.ts`); + if (!fs.existsSync(repoFile)) { + failures.push(`${className}: no src/db/repositories/${className}.repository.ts file`); + continue; + } + const mod: Record = await import(/* @vite-ignore */ `../../../src/db/repositories/${className}.repository`); + const RepoClass = mod[`${className}Repository`]; + if (typeof RepoClass !== 'function') { + failures.push(`${className}: repository module has no exported ${className}Repository class`); + continue; + } + const repo: EntityRepository = t.em.getRepository(schema.class as new () => object); + if (!(repo instanceof (RepoClass as abstract new (...args: never[]) => unknown))) { + failures.push(`${className}: em.getRepository() did not return a ${className}Repository instance`); + } + } + expect(failures).toEqual([]); + }); + }); }); diff --git a/server/tests/unit/db/entity-schema-parity.test.ts b/server/tests/unit/db/entity-schema-parity.test.ts index dfb5f7663..20487eb61 100644 --- a/server/tests/unit/db/entity-schema-parity.test.ts +++ b/server/tests/unit/db/entity-schema-parity.test.ts @@ -34,20 +34,16 @@ afterAll(async () => { }); /** - * Document-sync tables that have no entity yet — Plan 2 Task 3 adds them - * (`@mikro-orm/entity-generator` off the migrated schema, per the plan). The - * "every db table has an entity" assertion below reports these as expected - * missing instead of failing on them, but ALSO fails the moment one of them - * gains a real entity while staying listed here — so Task 3 has to empty - * this array, not just stop tripping the check. + * Tables with no entity yet. Plan 2 Task 0 named the 5 document-sync tables + * here; Task 3 added their entities (`DocumentProviders`, + * `DocumentProviderFields`, `DocumentConnections`, `TripDocumentLinks`, + * `DocumentSyncItems`), so the set is empty. PARITY-007's "every db table + * has an entity" assertion reports anything listed here as expected missing + * instead of failing on it; PARITY-008 fails the moment a listed table + * actually gains an entity, so a future author has to empty this set again + * rather than silently leaving a stale entry behind. */ -const ENTITIES_STILL_MISSING = [ - 'document_providers', - 'document_provider_fields', - 'document_connections', - 'trip_document_links', - 'document_sync_items', -]; +const ENTITIES_STILL_MISSING: string[] = []; interface DbColumn { cid: number; @@ -223,20 +219,21 @@ describe('entity ↔ migrated-schema parity', () => { }); /** - * Column defaults are report-only, not a gate: 82 timestamp columns stamp - * their default with an `onCreate(() => new Date())` hook rather than - * `.defaultRaw('CURRENT_TIMESTAMP')` (Plan 2's D2 removes `onCreate` in - * favour of `DbTimestampType` + `defaultRaw`, but that is Task 2/3's job, - * not this gate's), so the entity side reports no default at all for - * those columns today — confirmed by running this comparison during - * development: 93 of 994 compared columns "mismatch", and every single one - * is either that onCreate-vs-CURRENT_TIMESTAMP gap or a quoting spelling - * difference (`'0'` vs `false`, `NULL` vs absent) that carries no schema - * information. Turning this into a hard assertion today would make the - * gate red for reasons Task 0 was never asked to fix. Kept here, skipped, - * so Task 2/3 has a starting point once `onCreate` is gone. + * Column defaults, now a real gate: Task 2/3's generator rewrite removed + * every `onCreate(() => new Date())` hook in favour of `DbTimestampType` + + * `defaultRaw('CURRENT_TIMESTAMP')` (Plan 2's D2), which is what unblocked + * this test — Task 0 left it `it.skip`'d and report-only with 93 of 994 + * columns "mismatching," all of them that same onCreate-vs-CURRENT_TIMESTAMP + * gap or a quoting spelling difference carrying no schema information. + * `normaliseDefault` below folds those spellings together (quote style, a + * wrapping paren SQLite adds around a non-literal `DEFAULT (expr)` that + * `PRAGMA table_info` sometimes strips and the generator's own + * `prop.defaultRaw` sometimes doesn't, `datetime('now')`/`CURRENT_TIMESTAMP`, + * and `p.boolean()`'s literal `true`/`false` class-field default against + * SQLite's `0`/`1` — the only boolean column in the schema today, + * `addons.enabled`). Only real schema drift survives that. */ - it.skip('PARITY-005 (report-only, deferred to Task 2/3): column defaults agree after normalisation', () => { + it('PARITY-005: column defaults agree after normalisation', () => { const failures: string[] = []; for (const meta of tableBackedMetas()) { const table = meta.tableName; @@ -308,23 +305,30 @@ describe('entity ↔ migrated-schema parity', () => { /** * FK targets/deleteRule and index names, against `PRAGMA foreign_key_list` * and `PRAGMA index_list` — the plan's second, allow-listed check - * (Task 0, Step 3). Run during development: deleteRule disagrees on 11 of - * 180 owning relations (`trip_members.invited_by` entity=set null vs - * db=no action, `roadtrip_day_tracks.day_id` entity=set null vs db=cascade, + * (Task 0, Step 3). Task 0 found deleteRule disagreeing on 11 of 180 + * owning relations; Task 3's rewrite fixed one of those eleven as a side + * effect (`school_holiday_regions.country` now has a real, explicit + * `joinColumn`, so it reports a genuine FK row) and re-ran this check + * against the other 124 rewritten/added entities, composite-PK relations + * included (`packing_item_contributors`, `vacay_user_settings`, + * `document_connections`, `trip_document_links` — their `.entity.ts` + * source never spells `.deleteRule(...)` on those relations, but MikroORM + * discovery still resolves the correct rule at runtime, confirmed by + * running this check, so they are not drift): the count is now exactly 10, + * unchanged in substance from Task 0's list minus the one now-fixed row + * (`trip_members.invited_by` entity=set null vs db=no action, + * `roadtrip_day_tracks.day_id` entity=set null vs db=cascade, * `reservation_travelers.reservation_id`/`.user_id` and * `assignment_participants.assignment_id`/`.user_id` entity=no action vs * db=cascade, `oauth_tokens.parent_token_id` entity=set null vs db=no * action, `journey_contributors.user_id` entity=cascade vs db=no action, * `budget_settlements.created_by_user_id`/`budget_items.paid_by_user_id` - * entity=set null vs db=no action, and `school_holiday_regions.country` - * itself, which this task's fix makes an explicit `joinColumn` but which - * still reports no FK row — SQLite only lists a foreign key for a column - * the migration declared with a `REFERENCES` clause, and this one predates - * that). None of these are in Task 0's scope (exactly 4 named drifts); an - * allow-list would need 11 one-line entries for drift this task was not - * asked to fix, and index-name parity looked clean on inspection but was - * not exhaustively checked. Left skipped, with the findings above, for - * Plan 4 to turn into either fixes or a real allow-list. + * entity=set null vs db=no action). None of these are in Task 0's or + * Task 3's scope; an allow-list would need 10 one-line entries for drift + * neither task was asked to fix, and index-name parity looked clean on + * inspection but was not exhaustively checked. Left skipped, with the + * findings above, for Plan 4 to turn into either fixes or a real + * allow-list. */ it.skip('PARITY-009 (report-only, deferred to Plan 4): FK deleteRule and index names agree', () => { const failures: string[] = []; @@ -355,15 +359,76 @@ describe('entity ↔ migrated-schema parity', () => { } expect(failures).toEqual([]); }); + + /** + * D1's own rule (the naming strategy derives the same column from a + * camelCase or a snake_case property, so a column-level check can never + * see the difference): every persisted scalar property's name must equal + * its single column name. Relations are exempt by kind (an owning + * relation legitimately renames itself away from its column, e.g. + * `SchoolHolidayRegions.countryRef` + `.joinColumn('country')` — Task 2's + * rule 5); their FK twin scalars are `kind === SCALAR` and stay covered + * here. The same test asserts every single-column integer primary key is + * `autoincrement` in the discovered metadata — Task 2's Rule 3 doesn't + * spell `.autoincrement()` in the builder chain for every case (relying on + * `MetadataDiscovery#initAutoincrement`'s own `??= true` default for an + * integer PK with no explicit value), so nothing until now pinned that the + * default actually fires. Composite and text primary keys are untouched by + * design (Task 0/1) and excluded here by construction (more than one + * primary prop, or a non-integer type). + */ + it('PARITY-010: persisted scalar property names equal their single column name; integer id PKs are autoincrement', () => { + const failures: string[] = []; + for (const meta of tableBackedMetas()) { + for (const prop of meta.props) { + const isRelation = prop.kind !== undefined && prop.kind !== ReferenceKind.SCALAR; + if (isRelation) continue; + if (prop.persist === false && prop.fieldNames.length === 0) continue; // an embeddable/virtual scalar with no column at all + if (prop.fieldNames.length !== 1 || prop.name !== prop.fieldNames[0]) { + failures.push( + `${meta.className}.${prop.name}: property name does not equal its single column name (fieldNames=${JSON.stringify(prop.fieldNames)})`, + ); + } + } + // A genuinely single-column primary key only — a composite PK (e.g. + // RoadtripDayBoundaries' PRIMARY KEY (trip_id, day_number)) can have an + // all-integer shape without ever being SQLite's single-column + // `INTEGER PRIMARY KEY` rowid alias, so it must never autoincrement; + // `getPrimaryProps()` must report exactly one prop, unfiltered, before + // this check applies at all. + const primaryProps = meta.getPrimaryProps(); + if (primaryProps.length === 1) { + const pk = primaryProps[0]; + const isIntegerScalarPk = + (pk.kind === undefined || pk.kind === ReferenceKind.SCALAR) && normaliseColumnType(pk.columnTypes[0] ?? '') === 'integer'; + if (isIntegerScalarPk && pk.autoincrement !== true) { + failures.push(`${meta.className}.${pk.name}: integer primary key is not autoincrement`); + } + } + } + expect(failures).toEqual([]); + }); }); -/** Strips SQL string-literal quoting and folds SQLite's `CURRENT_TIMESTAMP`/`datetime('now')` spellings together. Used only by the skipped, report-only PARITY-005. */ +/** + * Strips SQL string-literal quoting and a single wrapping paren pair (SQLite + * requires `DEFAULT (expr)` for a non-literal expression in the migration's + * own DDL; `PRAGMA table_info` and the generator's introspected + * `prop.defaultRaw` don't always agree on keeping that outer pair), folds + * SQLite's `CURRENT_TIMESTAMP`/`datetime('now')` spellings together, and + * folds a `p.boolean()` property's literal `true`/`false` default onto + * SQLite's `1`/`0` (SQLite has no boolean storage class — see + * `BOOLEAN_COLUMNS` in `scripts/generate-entities.ts`). Used by PARITY-005. + */ function normaliseDefault(value: string | null): string | null { if (value == null) return null; let s = value.trim(); + if (s.startsWith('(') && s.endsWith(')')) s = s.slice(1, -1).trim(); if (s.startsWith("'") && s.endsWith("'")) s = s.slice(1, -1); s = s.toLowerCase(); if (s === "datetime('now')" || s === 'current_timestamp') s = '__now__'; + if (s === 'true') s = '1'; + if (s === 'false') s = '0'; return s; } diff --git a/server/tests/unit/db/generate-entities.test.ts b/server/tests/unit/db/generate-entities.test.ts index baec7db94..5c12a447b 100644 --- a/server/tests/unit/db/generate-entities.test.ts +++ b/server/tests/unit/db/generate-entities.test.ts @@ -732,23 +732,25 @@ function normalizeForDiff(source: string): string { } /** - * Not a KNOWN_DIFFS item — a consequence of validating against a reference - * file that predates Task 3. The five document-sync tables have no entity of - * their own yet, but `Trips` genuinely has FK relations pointing at two of - * them (`document_connections.trip_id`, `trip_document_links.trip_id`) in - * the migrated schema, so `bidirectionalRelations` correctly discovers them - * regardless of whether the target class exists in `src/db/entities/` today. - * * Dated ratchet (Fix round 1, task-2-review.md I7 — same shape as * `entity-schema-parity.test.ts`'s `ENTITIES_STILL_MISSING`, added - * 2026-09-22): Task 3 adds those five entities and these extra - * imports/collections on `Trips` become required, correct output. - * PENDING-ENTITIES-001 below fails the moment any of these five already has - * an entity file, forcing Task 3 to empty this list (and update - * VALIDATE-001's tolerance) in the same change — it must not silently keep - * tolerating output that is now wrong. + * 2026-09-22): while the five document-sync tables had no entity of their + * own, `Trips` still genuinely had FK relations pointing at two of them + * (`document_connections.trip_id`, `trip_document_links.trip_id`) in the + * migrated schema, so `bidirectionalRelations` correctly discovered them + * regardless of whether the target class existed in `src/db/entities/` yet — + * this list told `VALIDATE-001` to tolerate those extra lines against a + * `Trips.entity.ts` reference file that predated them. + * + * Plan 2 Task 3 added `DocumentProviders`/`DocumentProviderFields`/ + * `DocumentConnections`/`TripDocumentLinks`/`DocumentSyncItems`, so those + * lines are now required, correct output on every side of the comparison — + * emptied per PENDING-ENTITIES-001's own instruction. Left `[]` rather than + * deleted: `stripPendingEntityRelations` is a no-op on an empty list (see its + * guard clause below), and the ratchet test keeps proving that fact rather + * than being removed along with what it was guarding. */ -const PENDING_ENTITIES = ['DocumentProviders', 'DocumentProviderFields', 'DocumentConnections', 'TripDocumentLinks', 'DocumentSyncItems']; +const PENDING_ENTITIES: string[] = []; function stripPendingEntityRelations(generatedSource: string): string { if (PENDING_ENTITIES.length === 0) return generatedSource;