@opprs/db-prisma 0.5.2 → 0.6.0-canary.05fc34c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -24,14 +24,18 @@ __export(index_exports, {
24
24
  countPlayers: () => countPlayers,
25
25
  countResults: () => countResults,
26
26
  countTournaments: () => countTournaments,
27
+ countUsers: () => countUsers,
27
28
  createManyResults: () => createManyResults,
28
29
  createPlayer: () => createPlayer,
29
30
  createResult: () => createResult,
30
31
  createTournament: () => createTournament,
32
+ createUser: () => createUser,
33
+ createUserWithPlayer: () => createUserWithPlayer,
31
34
  deletePlayer: () => deletePlayer,
32
35
  deleteResult: () => deleteResult,
33
36
  deleteResultsByTournament: () => deleteResultsByTournament,
34
37
  deleteTournament: () => deleteTournament,
38
+ deleteUser: () => deleteUser,
35
39
  disconnect: () => disconnect,
36
40
  findPlayerByEmail: () => findPlayerByEmail,
37
41
  findPlayerByExternalId: () => findPlayerByExternalId,
@@ -43,6 +47,8 @@ __export(index_exports, {
43
47
  findTournamentByExternalId: () => findTournamentByExternalId,
44
48
  findTournamentById: () => findTournamentById,
45
49
  findTournaments: () => findTournaments,
50
+ findUserByEmail: () => findUserByEmail,
51
+ findUserById: () => findUserById,
46
52
  getMajorTournaments: () => getMajorTournaments,
47
53
  getPlayerResults: () => getPlayerResults,
48
54
  getPlayerStats: () => getPlayerStats,
@@ -57,6 +63,8 @@ __export(index_exports, {
57
63
  getTournamentWithResults: () => getTournamentWithResults,
58
64
  getTournamentsByBoosterType: () => getTournamentsByBoosterType,
59
65
  getTournamentsByDateRange: () => getTournamentsByDateRange,
66
+ getUserByEmailWithPlayer: () => getUserByEmailWithPlayer,
67
+ getUserWithPlayer: () => getUserWithPlayer,
60
68
  prisma: () => prisma,
61
69
  recalculateTimeDecay: () => recalculateTimeDecay,
62
70
  searchPlayers: () => searchPlayers,
@@ -66,7 +74,9 @@ __export(index_exports, {
66
74
  updatePlayerRating: () => updatePlayerRating,
67
75
  updateResult: () => updateResult,
68
76
  updateResultPoints: () => updateResultPoints,
69
- updateTournament: () => updateTournament
77
+ updateTournament: () => updateTournament,
78
+ updateUser: () => updateUser,
79
+ updateUserRefreshToken: () => updateUserRefreshToken
70
80
  });
71
81
  module.exports = __toCommonJS(index_exports);
72
82
 
@@ -521,20 +531,137 @@ async function recalculateTimeDecay(referenceDate = /* @__PURE__ */ new Date())
521
531
  });
522
532
  return Promise.all(updates);
523
533
  }
534
+
535
+ // src/users.ts
536
+ async function createUser(data) {
537
+ return prisma.user.create({
538
+ data
539
+ });
540
+ }
541
+ async function createUserWithPlayer(userData, playerData) {
542
+ return prisma.$transaction(async (tx) => {
543
+ const player = await tx.player.create({
544
+ data: {
545
+ name: playerData.name,
546
+ email: playerData.email
547
+ }
548
+ });
549
+ const user = await tx.user.create({
550
+ data: {
551
+ ...userData,
552
+ playerId: player.id
553
+ },
554
+ include: {
555
+ player: {
556
+ select: {
557
+ id: true,
558
+ name: true,
559
+ rating: true,
560
+ ratingDeviation: true,
561
+ ranking: true,
562
+ isRated: true,
563
+ eventCount: true
564
+ }
565
+ }
566
+ }
567
+ });
568
+ return user;
569
+ });
570
+ }
571
+ async function findUserById(id, include) {
572
+ return prisma.user.findUnique({
573
+ where: { id },
574
+ include
575
+ });
576
+ }
577
+ async function findUserByEmail(email, include) {
578
+ return prisma.user.findUnique({
579
+ where: { email },
580
+ include
581
+ });
582
+ }
583
+ async function getUserWithPlayer(id) {
584
+ const user = await prisma.user.findUnique({
585
+ where: { id },
586
+ include: {
587
+ player: {
588
+ select: {
589
+ id: true,
590
+ name: true,
591
+ rating: true,
592
+ ratingDeviation: true,
593
+ ranking: true,
594
+ isRated: true,
595
+ eventCount: true
596
+ }
597
+ }
598
+ }
599
+ });
600
+ if (!user) {
601
+ return null;
602
+ }
603
+ return user;
604
+ }
605
+ async function getUserByEmailWithPlayer(email) {
606
+ const user = await prisma.user.findUnique({
607
+ where: { email },
608
+ include: {
609
+ player: {
610
+ select: {
611
+ id: true,
612
+ name: true,
613
+ rating: true,
614
+ ratingDeviation: true,
615
+ ranking: true,
616
+ isRated: true,
617
+ eventCount: true
618
+ }
619
+ }
620
+ }
621
+ });
622
+ if (!user) {
623
+ return null;
624
+ }
625
+ return user;
626
+ }
627
+ async function updateUser(id, data) {
628
+ return prisma.user.update({
629
+ where: { id },
630
+ data
631
+ });
632
+ }
633
+ async function updateUserRefreshToken(id, refreshTokenHash) {
634
+ return prisma.user.update({
635
+ where: { id },
636
+ data: { refreshTokenHash }
637
+ });
638
+ }
639
+ async function deleteUser(id) {
640
+ return prisma.user.delete({
641
+ where: { id }
642
+ });
643
+ }
644
+ async function countUsers(where) {
645
+ return prisma.user.count({ where });
646
+ }
524
647
  // Annotate the CommonJS export names for ESM import in node:
525
648
  0 && (module.exports = {
526
649
  connect,
527
650
  countPlayers,
528
651
  countResults,
529
652
  countTournaments,
653
+ countUsers,
530
654
  createManyResults,
531
655
  createPlayer,
532
656
  createResult,
533
657
  createTournament,
658
+ createUser,
659
+ createUserWithPlayer,
534
660
  deletePlayer,
535
661
  deleteResult,
536
662
  deleteResultsByTournament,
537
663
  deleteTournament,
664
+ deleteUser,
538
665
  disconnect,
539
666
  findPlayerByEmail,
540
667
  findPlayerByExternalId,
@@ -546,6 +673,8 @@ async function recalculateTimeDecay(referenceDate = /* @__PURE__ */ new Date())
546
673
  findTournamentByExternalId,
547
674
  findTournamentById,
548
675
  findTournaments,
676
+ findUserByEmail,
677
+ findUserById,
549
678
  getMajorTournaments,
550
679
  getPlayerResults,
551
680
  getPlayerStats,
@@ -560,6 +689,8 @@ async function recalculateTimeDecay(referenceDate = /* @__PURE__ */ new Date())
560
689
  getTournamentWithResults,
561
690
  getTournamentsByBoosterType,
562
691
  getTournamentsByDateRange,
692
+ getUserByEmailWithPlayer,
693
+ getUserWithPlayer,
563
694
  prisma,
564
695
  recalculateTimeDecay,
565
696
  searchPlayers,
@@ -569,5 +700,7 @@ async function recalculateTimeDecay(referenceDate = /* @__PURE__ */ new Date())
569
700
  updatePlayerRating,
570
701
  updateResult,
571
702
  updateResultPoints,
572
- updateTournament
703
+ updateTournament,
704
+ updateUser,
705
+ updateUserRefreshToken
573
706
  });
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _prisma_client_runtime_library from '@prisma/client/runtime/library';
2
2
  import * as _prisma_client from '@prisma/client';
3
- import { PrismaClient, Player, Prisma, EventBoosterType, Tournament, TournamentResult } from '@prisma/client';
4
- export { EventBoosterType, Player, Prisma, Tournament, TournamentResult } from '@prisma/client';
3
+ import { PrismaClient, Player, Prisma, EventBoosterType, Tournament, TournamentResult, User } from '@prisma/client';
4
+ export { EventBoosterType, Player, Prisma, Role, Tournament, TournamentResult, User } from '@prisma/client';
5
5
 
6
6
  declare const prisma: PrismaClient<_prisma_client.Prisma.PrismaClientOptions, never, _prisma_client_runtime_library.DefaultArgs>;
7
7
  /**
@@ -546,6 +546,88 @@ declare function recalculateTimeDecay(referenceDate?: Date): Promise<{
546
546
  efficiency: number | null;
547
547
  }[]>;
548
548
 
549
+ /**
550
+ * Input for creating a new user
551
+ */
552
+ interface CreateUserInput {
553
+ email: string;
554
+ passwordHash: string;
555
+ playerId?: string;
556
+ role?: 'USER' | 'ADMIN';
557
+ }
558
+ /**
559
+ * Input for updating a user
560
+ */
561
+ interface UpdateUserInput {
562
+ email?: string;
563
+ passwordHash?: string;
564
+ playerId?: string;
565
+ role?: 'USER' | 'ADMIN';
566
+ refreshTokenHash?: string | null;
567
+ }
568
+ /**
569
+ * User with linked player profile
570
+ */
571
+ interface UserWithPlayer {
572
+ id: string;
573
+ email: string;
574
+ role: 'USER' | 'ADMIN';
575
+ createdAt: Date;
576
+ updatedAt: Date;
577
+ player: {
578
+ id: string;
579
+ name: string | null;
580
+ rating: number;
581
+ ratingDeviation: number;
582
+ ranking: number | null;
583
+ isRated: boolean;
584
+ eventCount: number;
585
+ } | null;
586
+ }
587
+ /**
588
+ * Creates a new user
589
+ */
590
+ declare function createUser(data: CreateUserInput): Promise<User>;
591
+ /**
592
+ * Creates a user with a linked player in a transaction
593
+ */
594
+ declare function createUserWithPlayer(userData: Omit<CreateUserInput, 'playerId'>, playerData: {
595
+ name?: string;
596
+ email?: string;
597
+ }): Promise<UserWithPlayer>;
598
+ /**
599
+ * Finds a user by ID
600
+ */
601
+ declare function findUserById(id: string, include?: Prisma.UserInclude): Promise<User | null>;
602
+ /**
603
+ * Finds a user by email
604
+ */
605
+ declare function findUserByEmail(email: string, include?: Prisma.UserInclude): Promise<User | null>;
606
+ /**
607
+ * Gets a user with their linked player profile
608
+ */
609
+ declare function getUserWithPlayer(id: string): Promise<UserWithPlayer | null>;
610
+ /**
611
+ * Gets a user by email with their linked player profile
612
+ */
613
+ declare function getUserByEmailWithPlayer(email: string): Promise<UserWithPlayer | null>;
614
+ /**
615
+ * Updates a user
616
+ */
617
+ declare function updateUser(id: string, data: UpdateUserInput): Promise<User>;
618
+ /**
619
+ * Updates a user's refresh token hash
620
+ */
621
+ declare function updateUserRefreshToken(id: string, refreshTokenHash: string | null): Promise<User>;
622
+ /**
623
+ * Deletes a user
624
+ */
625
+ declare function deleteUser(id: string): Promise<User>;
626
+ /**
627
+ * Counts total users
628
+ */
629
+ declare function countUsers(where?: Prisma.UserWhereInput): Promise<number>;
630
+
549
631
  /**
550
632
  * Re-export Prisma generated types
551
633
  */
@@ -605,4 +687,4 @@ interface ConnectionStatus {
605
687
  error?: string;
606
688
  }
607
689
 
608
- export { type ConnectionStatus, type CreatePlayerInput, type CreateResultInput, type CreateTournamentInput, type FindPlayersOptions, type FindResultsOptions, type FindTournamentsOptions, type PlayerStatistics, type PlayerWithResults, type TournamentResultWithTournament, type TournamentStatistics, type UpdatePlayerInput, type UpdateResultInput, type UpdateTournamentInput, connect, countPlayers, countResults, countTournaments, createManyResults, createPlayer, createResult, createTournament, deletePlayer, deleteResult, deleteResultsByTournament, deleteTournament, disconnect, findPlayerByEmail, findPlayerByExternalId, findPlayerById, findPlayers, findResultById, findResultByPlayerAndTournament, findResults, findTournamentByExternalId, findTournamentById, findTournaments, getMajorTournaments, getPlayerResults, getPlayerStats, getPlayerTopFinishes, getPlayerWithResults, getRatedPlayers, getRecentTournaments, getTopPlayersByRanking, getTopPlayersByRating, getTournamentResults, getTournamentStats, getTournamentWithResults, getTournamentsByBoosterType, getTournamentsByDateRange, prisma, recalculateTimeDecay, searchPlayers, searchTournaments, testConnection, updatePlayer, updatePlayerRating, updateResult, updateResultPoints, updateTournament };
690
+ export { type ConnectionStatus, type CreatePlayerInput, type CreateResultInput, type CreateTournamentInput, type CreateUserInput, type FindPlayersOptions, type FindResultsOptions, type FindTournamentsOptions, type PlayerStatistics, type PlayerWithResults, type TournamentResultWithTournament, type TournamentStatistics, type UpdatePlayerInput, type UpdateResultInput, type UpdateTournamentInput, type UpdateUserInput, type UserWithPlayer, connect, countPlayers, countResults, countTournaments, countUsers, createManyResults, createPlayer, createResult, createTournament, createUser, createUserWithPlayer, deletePlayer, deleteResult, deleteResultsByTournament, deleteTournament, deleteUser, disconnect, findPlayerByEmail, findPlayerByExternalId, findPlayerById, findPlayers, findResultById, findResultByPlayerAndTournament, findResults, findTournamentByExternalId, findTournamentById, findTournaments, findUserByEmail, findUserById, getMajorTournaments, getPlayerResults, getPlayerStats, getPlayerTopFinishes, getPlayerWithResults, getRatedPlayers, getRecentTournaments, getTopPlayersByRanking, getTopPlayersByRating, getTournamentResults, getTournamentStats, getTournamentWithResults, getTournamentsByBoosterType, getTournamentsByDateRange, getUserByEmailWithPlayer, getUserWithPlayer, prisma, recalculateTimeDecay, searchPlayers, searchTournaments, testConnection, updatePlayer, updatePlayerRating, updateResult, updateResultPoints, updateTournament, updateUser, updateUserRefreshToken };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _prisma_client_runtime_library from '@prisma/client/runtime/library';
2
2
  import * as _prisma_client from '@prisma/client';
3
- import { PrismaClient, Player, Prisma, EventBoosterType, Tournament, TournamentResult } from '@prisma/client';
4
- export { EventBoosterType, Player, Prisma, Tournament, TournamentResult } from '@prisma/client';
3
+ import { PrismaClient, Player, Prisma, EventBoosterType, Tournament, TournamentResult, User } from '@prisma/client';
4
+ export { EventBoosterType, Player, Prisma, Role, Tournament, TournamentResult, User } from '@prisma/client';
5
5
 
6
6
  declare const prisma: PrismaClient<_prisma_client.Prisma.PrismaClientOptions, never, _prisma_client_runtime_library.DefaultArgs>;
7
7
  /**
@@ -546,6 +546,88 @@ declare function recalculateTimeDecay(referenceDate?: Date): Promise<{
546
546
  efficiency: number | null;
547
547
  }[]>;
548
548
 
549
+ /**
550
+ * Input for creating a new user
551
+ */
552
+ interface CreateUserInput {
553
+ email: string;
554
+ passwordHash: string;
555
+ playerId?: string;
556
+ role?: 'USER' | 'ADMIN';
557
+ }
558
+ /**
559
+ * Input for updating a user
560
+ */
561
+ interface UpdateUserInput {
562
+ email?: string;
563
+ passwordHash?: string;
564
+ playerId?: string;
565
+ role?: 'USER' | 'ADMIN';
566
+ refreshTokenHash?: string | null;
567
+ }
568
+ /**
569
+ * User with linked player profile
570
+ */
571
+ interface UserWithPlayer {
572
+ id: string;
573
+ email: string;
574
+ role: 'USER' | 'ADMIN';
575
+ createdAt: Date;
576
+ updatedAt: Date;
577
+ player: {
578
+ id: string;
579
+ name: string | null;
580
+ rating: number;
581
+ ratingDeviation: number;
582
+ ranking: number | null;
583
+ isRated: boolean;
584
+ eventCount: number;
585
+ } | null;
586
+ }
587
+ /**
588
+ * Creates a new user
589
+ */
590
+ declare function createUser(data: CreateUserInput): Promise<User>;
591
+ /**
592
+ * Creates a user with a linked player in a transaction
593
+ */
594
+ declare function createUserWithPlayer(userData: Omit<CreateUserInput, 'playerId'>, playerData: {
595
+ name?: string;
596
+ email?: string;
597
+ }): Promise<UserWithPlayer>;
598
+ /**
599
+ * Finds a user by ID
600
+ */
601
+ declare function findUserById(id: string, include?: Prisma.UserInclude): Promise<User | null>;
602
+ /**
603
+ * Finds a user by email
604
+ */
605
+ declare function findUserByEmail(email: string, include?: Prisma.UserInclude): Promise<User | null>;
606
+ /**
607
+ * Gets a user with their linked player profile
608
+ */
609
+ declare function getUserWithPlayer(id: string): Promise<UserWithPlayer | null>;
610
+ /**
611
+ * Gets a user by email with their linked player profile
612
+ */
613
+ declare function getUserByEmailWithPlayer(email: string): Promise<UserWithPlayer | null>;
614
+ /**
615
+ * Updates a user
616
+ */
617
+ declare function updateUser(id: string, data: UpdateUserInput): Promise<User>;
618
+ /**
619
+ * Updates a user's refresh token hash
620
+ */
621
+ declare function updateUserRefreshToken(id: string, refreshTokenHash: string | null): Promise<User>;
622
+ /**
623
+ * Deletes a user
624
+ */
625
+ declare function deleteUser(id: string): Promise<User>;
626
+ /**
627
+ * Counts total users
628
+ */
629
+ declare function countUsers(where?: Prisma.UserWhereInput): Promise<number>;
630
+
549
631
  /**
550
632
  * Re-export Prisma generated types
551
633
  */
@@ -605,4 +687,4 @@ interface ConnectionStatus {
605
687
  error?: string;
606
688
  }
607
689
 
608
- export { type ConnectionStatus, type CreatePlayerInput, type CreateResultInput, type CreateTournamentInput, type FindPlayersOptions, type FindResultsOptions, type FindTournamentsOptions, type PlayerStatistics, type PlayerWithResults, type TournamentResultWithTournament, type TournamentStatistics, type UpdatePlayerInput, type UpdateResultInput, type UpdateTournamentInput, connect, countPlayers, countResults, countTournaments, createManyResults, createPlayer, createResult, createTournament, deletePlayer, deleteResult, deleteResultsByTournament, deleteTournament, disconnect, findPlayerByEmail, findPlayerByExternalId, findPlayerById, findPlayers, findResultById, findResultByPlayerAndTournament, findResults, findTournamentByExternalId, findTournamentById, findTournaments, getMajorTournaments, getPlayerResults, getPlayerStats, getPlayerTopFinishes, getPlayerWithResults, getRatedPlayers, getRecentTournaments, getTopPlayersByRanking, getTopPlayersByRating, getTournamentResults, getTournamentStats, getTournamentWithResults, getTournamentsByBoosterType, getTournamentsByDateRange, prisma, recalculateTimeDecay, searchPlayers, searchTournaments, testConnection, updatePlayer, updatePlayerRating, updateResult, updateResultPoints, updateTournament };
690
+ export { type ConnectionStatus, type CreatePlayerInput, type CreateResultInput, type CreateTournamentInput, type CreateUserInput, type FindPlayersOptions, type FindResultsOptions, type FindTournamentsOptions, type PlayerStatistics, type PlayerWithResults, type TournamentResultWithTournament, type TournamentStatistics, type UpdatePlayerInput, type UpdateResultInput, type UpdateTournamentInput, type UpdateUserInput, type UserWithPlayer, connect, countPlayers, countResults, countTournaments, countUsers, createManyResults, createPlayer, createResult, createTournament, createUser, createUserWithPlayer, deletePlayer, deleteResult, deleteResultsByTournament, deleteTournament, deleteUser, disconnect, findPlayerByEmail, findPlayerByExternalId, findPlayerById, findPlayers, findResultById, findResultByPlayerAndTournament, findResults, findTournamentByExternalId, findTournamentById, findTournaments, findUserByEmail, findUserById, getMajorTournaments, getPlayerResults, getPlayerStats, getPlayerTopFinishes, getPlayerWithResults, getRatedPlayers, getRecentTournaments, getTopPlayersByRanking, getTopPlayersByRating, getTournamentResults, getTournamentStats, getTournamentWithResults, getTournamentsByBoosterType, getTournamentsByDateRange, getUserByEmailWithPlayer, getUserWithPlayer, prisma, recalculateTimeDecay, searchPlayers, searchTournaments, testConnection, updatePlayer, updatePlayerRating, updateResult, updateResultPoints, updateTournament, updateUser, updateUserRefreshToken };
package/dist/index.js CHANGED
@@ -449,19 +449,136 @@ async function recalculateTimeDecay(referenceDate = /* @__PURE__ */ new Date())
449
449
  });
450
450
  return Promise.all(updates);
451
451
  }
452
+
453
+ // src/users.ts
454
+ async function createUser(data) {
455
+ return prisma.user.create({
456
+ data
457
+ });
458
+ }
459
+ async function createUserWithPlayer(userData, playerData) {
460
+ return prisma.$transaction(async (tx) => {
461
+ const player = await tx.player.create({
462
+ data: {
463
+ name: playerData.name,
464
+ email: playerData.email
465
+ }
466
+ });
467
+ const user = await tx.user.create({
468
+ data: {
469
+ ...userData,
470
+ playerId: player.id
471
+ },
472
+ include: {
473
+ player: {
474
+ select: {
475
+ id: true,
476
+ name: true,
477
+ rating: true,
478
+ ratingDeviation: true,
479
+ ranking: true,
480
+ isRated: true,
481
+ eventCount: true
482
+ }
483
+ }
484
+ }
485
+ });
486
+ return user;
487
+ });
488
+ }
489
+ async function findUserById(id, include) {
490
+ return prisma.user.findUnique({
491
+ where: { id },
492
+ include
493
+ });
494
+ }
495
+ async function findUserByEmail(email, include) {
496
+ return prisma.user.findUnique({
497
+ where: { email },
498
+ include
499
+ });
500
+ }
501
+ async function getUserWithPlayer(id) {
502
+ const user = await prisma.user.findUnique({
503
+ where: { id },
504
+ include: {
505
+ player: {
506
+ select: {
507
+ id: true,
508
+ name: true,
509
+ rating: true,
510
+ ratingDeviation: true,
511
+ ranking: true,
512
+ isRated: true,
513
+ eventCount: true
514
+ }
515
+ }
516
+ }
517
+ });
518
+ if (!user) {
519
+ return null;
520
+ }
521
+ return user;
522
+ }
523
+ async function getUserByEmailWithPlayer(email) {
524
+ const user = await prisma.user.findUnique({
525
+ where: { email },
526
+ include: {
527
+ player: {
528
+ select: {
529
+ id: true,
530
+ name: true,
531
+ rating: true,
532
+ ratingDeviation: true,
533
+ ranking: true,
534
+ isRated: true,
535
+ eventCount: true
536
+ }
537
+ }
538
+ }
539
+ });
540
+ if (!user) {
541
+ return null;
542
+ }
543
+ return user;
544
+ }
545
+ async function updateUser(id, data) {
546
+ return prisma.user.update({
547
+ where: { id },
548
+ data
549
+ });
550
+ }
551
+ async function updateUserRefreshToken(id, refreshTokenHash) {
552
+ return prisma.user.update({
553
+ where: { id },
554
+ data: { refreshTokenHash }
555
+ });
556
+ }
557
+ async function deleteUser(id) {
558
+ return prisma.user.delete({
559
+ where: { id }
560
+ });
561
+ }
562
+ async function countUsers(where) {
563
+ return prisma.user.count({ where });
564
+ }
452
565
  export {
453
566
  connect,
454
567
  countPlayers,
455
568
  countResults,
456
569
  countTournaments,
570
+ countUsers,
457
571
  createManyResults,
458
572
  createPlayer,
459
573
  createResult,
460
574
  createTournament,
575
+ createUser,
576
+ createUserWithPlayer,
461
577
  deletePlayer,
462
578
  deleteResult,
463
579
  deleteResultsByTournament,
464
580
  deleteTournament,
581
+ deleteUser,
465
582
  disconnect,
466
583
  findPlayerByEmail,
467
584
  findPlayerByExternalId,
@@ -473,6 +590,8 @@ export {
473
590
  findTournamentByExternalId,
474
591
  findTournamentById,
475
592
  findTournaments,
593
+ findUserByEmail,
594
+ findUserById,
476
595
  getMajorTournaments,
477
596
  getPlayerResults,
478
597
  getPlayerStats,
@@ -487,6 +606,8 @@ export {
487
606
  getTournamentWithResults,
488
607
  getTournamentsByBoosterType,
489
608
  getTournamentsByDateRange,
609
+ getUserByEmailWithPlayer,
610
+ getUserWithPlayer,
490
611
  prisma,
491
612
  recalculateTimeDecay,
492
613
  searchPlayers,
@@ -496,5 +617,7 @@ export {
496
617
  updatePlayerRating,
497
618
  updateResult,
498
619
  updateResultPoints,
499
- updateTournament
620
+ updateTournament,
621
+ updateUser,
622
+ updateUserRefreshToken
500
623
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opprs/db-prisma",
3
- "version": "0.5.2",
3
+ "version": "0.6.0-canary.05fc34c",
4
4
  "description": "Database backend for OPPR (Open Pinball Player Ranking System) using Prisma and PostgreSQL",
5
5
  "keywords": [
6
6
  "oppr",
@@ -54,7 +54,7 @@
54
54
  "vitest": "^4.0.16"
55
55
  },
56
56
  "peerDependencies": {
57
- "@opprs/core": "^0.5.2"
57
+ "@opprs/core": "^0.6.0-canary.05fc34c"
58
58
  },
59
59
  "engines": {
60
60
  "node": ">=18.0.0"
@@ -0,0 +1,112 @@
1
+ -- CreateEnum
2
+ CREATE TYPE "EventBoosterType" AS ENUM ('NONE', 'CERTIFIED', 'CERTIFIED_PLUS', 'CHAMPIONSHIP_SERIES', 'MAJOR');
3
+
4
+ -- CreateTable
5
+ CREATE TABLE "Player" (
6
+ "id" TEXT NOT NULL,
7
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
8
+ "updatedAt" TIMESTAMP(3) NOT NULL,
9
+ "externalId" TEXT,
10
+ "name" TEXT,
11
+ "email" TEXT,
12
+ "rating" DOUBLE PRECISION NOT NULL DEFAULT 1500,
13
+ "ratingDeviation" DOUBLE PRECISION NOT NULL DEFAULT 200,
14
+ "ranking" INTEGER,
15
+ "isRated" BOOLEAN NOT NULL DEFAULT false,
16
+ "eventCount" INTEGER NOT NULL DEFAULT 0,
17
+ "lastRatingUpdate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
18
+ "lastEventDate" TIMESTAMP(3),
19
+
20
+ CONSTRAINT "Player_pkey" PRIMARY KEY ("id")
21
+ );
22
+
23
+ -- CreateTable
24
+ CREATE TABLE "Tournament" (
25
+ "id" TEXT NOT NULL,
26
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
27
+ "updatedAt" TIMESTAMP(3) NOT NULL,
28
+ "externalId" TEXT,
29
+ "name" TEXT NOT NULL,
30
+ "location" TEXT,
31
+ "date" TIMESTAMP(3) NOT NULL,
32
+ "tgpConfig" JSONB,
33
+ "eventBooster" "EventBoosterType" NOT NULL DEFAULT 'NONE',
34
+ "allowsOptOut" BOOLEAN NOT NULL DEFAULT false,
35
+ "baseValue" DOUBLE PRECISION,
36
+ "tvaRating" DOUBLE PRECISION,
37
+ "tvaRanking" DOUBLE PRECISION,
38
+ "totalTVA" DOUBLE PRECISION,
39
+ "tgp" DOUBLE PRECISION,
40
+ "eventBoosterMultiplier" DOUBLE PRECISION,
41
+ "firstPlaceValue" DOUBLE PRECISION,
42
+
43
+ CONSTRAINT "Tournament_pkey" PRIMARY KEY ("id")
44
+ );
45
+
46
+ -- CreateTable
47
+ CREATE TABLE "TournamentResult" (
48
+ "id" TEXT NOT NULL,
49
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
50
+ "updatedAt" TIMESTAMP(3) NOT NULL,
51
+ "playerId" TEXT NOT NULL,
52
+ "tournamentId" TEXT NOT NULL,
53
+ "position" INTEGER NOT NULL,
54
+ "optedOut" BOOLEAN NOT NULL DEFAULT false,
55
+ "linearPoints" DOUBLE PRECISION DEFAULT 0,
56
+ "dynamicPoints" DOUBLE PRECISION DEFAULT 0,
57
+ "totalPoints" DOUBLE PRECISION,
58
+ "ageInDays" INTEGER DEFAULT 0,
59
+ "decayMultiplier" DOUBLE PRECISION DEFAULT 1.0,
60
+ "decayedPoints" DOUBLE PRECISION,
61
+ "efficiency" DOUBLE PRECISION,
62
+
63
+ CONSTRAINT "TournamentResult_pkey" PRIMARY KEY ("id")
64
+ );
65
+
66
+ -- CreateIndex
67
+ CREATE UNIQUE INDEX "Player_externalId_key" ON "Player"("externalId");
68
+
69
+ -- CreateIndex
70
+ CREATE UNIQUE INDEX "Player_email_key" ON "Player"("email");
71
+
72
+ -- CreateIndex
73
+ CREATE INDEX "Player_email_idx" ON "Player"("email");
74
+
75
+ -- CreateIndex
76
+ CREATE INDEX "Player_externalId_idx" ON "Player"("externalId");
77
+
78
+ -- CreateIndex
79
+ CREATE INDEX "Player_rating_idx" ON "Player"("rating");
80
+
81
+ -- CreateIndex
82
+ CREATE INDEX "Player_ranking_idx" ON "Player"("ranking");
83
+
84
+ -- CreateIndex
85
+ CREATE UNIQUE INDEX "Tournament_externalId_key" ON "Tournament"("externalId");
86
+
87
+ -- CreateIndex
88
+ CREATE INDEX "Tournament_date_idx" ON "Tournament"("date");
89
+
90
+ -- CreateIndex
91
+ CREATE INDEX "Tournament_eventBooster_idx" ON "Tournament"("eventBooster");
92
+
93
+ -- CreateIndex
94
+ CREATE INDEX "Tournament_externalId_idx" ON "Tournament"("externalId");
95
+
96
+ -- CreateIndex
97
+ CREATE INDEX "TournamentResult_playerId_idx" ON "TournamentResult"("playerId");
98
+
99
+ -- CreateIndex
100
+ CREATE INDEX "TournamentResult_tournamentId_idx" ON "TournamentResult"("tournamentId");
101
+
102
+ -- CreateIndex
103
+ CREATE INDEX "TournamentResult_position_idx" ON "TournamentResult"("position");
104
+
105
+ -- CreateIndex
106
+ CREATE UNIQUE INDEX "TournamentResult_playerId_tournamentId_key" ON "TournamentResult"("playerId", "tournamentId");
107
+
108
+ -- AddForeignKey
109
+ ALTER TABLE "TournamentResult" ADD CONSTRAINT "TournamentResult_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE CASCADE ON UPDATE CASCADE;
110
+
111
+ -- AddForeignKey
112
+ ALTER TABLE "TournamentResult" ADD CONSTRAINT "TournamentResult_tournamentId_fkey" FOREIGN KEY ("tournamentId") REFERENCES "Tournament"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "postgresql"
@@ -34,6 +34,7 @@ model Player {
34
34
 
35
35
  // Relations
36
36
  tournamentResults TournamentResult[]
37
+ user User?
37
38
 
38
39
  @@index([email])
39
40
  @@index([externalId])
@@ -121,3 +122,32 @@ enum EventBoosterType {
121
122
  CHAMPIONSHIP_SERIES
122
123
  MAJOR
123
124
  }
125
+
126
+ // Enum for user roles
127
+ enum Role {
128
+ USER
129
+ ADMIN
130
+ }
131
+
132
+ // User model - represents an authenticated user account
133
+ model User {
134
+ id String @id @default(cuid())
135
+ createdAt DateTime @default(now())
136
+ updatedAt DateTime @updatedAt
137
+
138
+ // Authentication
139
+ email String @unique
140
+ passwordHash String
141
+
142
+ // Authorization
143
+ role Role @default(USER)
144
+
145
+ // Link to Player profile
146
+ playerId String? @unique
147
+ player Player? @relation(fields: [playerId], references: [id], onDelete: SetNull)
148
+
149
+ // Session management (for token revocation)
150
+ refreshTokenHash String?
151
+
152
+ @@index([email])
153
+ }