@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 +135 -2
- package/dist/index.d.cts +85 -3
- package/dist/index.d.ts +85 -3
- package/dist/index.js +124 -1
- package/package.json +2 -2
- package/prisma/migrations/20251231075738_init/migration.sql +112 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +30 -0
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.
|
|
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.
|
|
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;
|
package/prisma/schema.prisma
CHANGED
|
@@ -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
|
+
}
|