Add house leaderboard feature: Integrate house leaderboard functionality in LeaderboardPage and LeaderboardSection components. Update userStatsService to fetch house leaderboard data, and enhance UI to display house rankings, scores, and member details. Update Prisma schema to include house-related models and relationships, and seed database with initial house data.
Some checks failed
Deploy with Docker Compose / deploy (push) Has been cancelled

This commit is contained in:
Julien Froidefond
2025-12-17 13:35:18 +01:00
parent cb02b494f4
commit 85ee812ab1
36 changed files with 5422 additions and 13 deletions

View File

@@ -52,3 +52,23 @@ export type SitePreferences = Prisma.SitePreferencesModel
*
*/
export type Challenge = Prisma.ChallengeModel
/**
* Model House
*
*/
export type House = Prisma.HouseModel
/**
* Model HouseMembership
*
*/
export type HouseMembership = Prisma.HouseMembershipModel
/**
* Model HouseInvitation
*
*/
export type HouseInvitation = Prisma.HouseInvitationModel
/**
* Model HouseRequest
*
*/
export type HouseRequest = Prisma.HouseRequestModel

View File

@@ -74,3 +74,23 @@ export type SitePreferences = Prisma.SitePreferencesModel
*
*/
export type Challenge = Prisma.ChallengeModel
/**
* Model House
*
*/
export type House = Prisma.HouseModel
/**
* Model HouseMembership
*
*/
export type HouseMembership = Prisma.HouseMembershipModel
/**
* Model HouseInvitation
*
*/
export type HouseInvitation = Prisma.HouseInvitationModel
/**
* Model HouseRequest
*
*/
export type HouseRequest = Prisma.HouseRequestModel

View File

@@ -270,6 +270,57 @@ export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type EnumHouseRoleFilter<$PrismaModel = never> = {
equals?: $Enums.HouseRole | Prisma.EnumHouseRoleFieldRefInput<$PrismaModel>
in?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
notIn?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumHouseRoleFilter<$PrismaModel> | $Enums.HouseRole
}
export type EnumHouseRoleWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.HouseRole | Prisma.EnumHouseRoleFieldRefInput<$PrismaModel>
in?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
notIn?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumHouseRoleWithAggregatesFilter<$PrismaModel> | $Enums.HouseRole
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumHouseRoleFilter<$PrismaModel>
_max?: Prisma.NestedEnumHouseRoleFilter<$PrismaModel>
}
export type EnumInvitationStatusFilter<$PrismaModel = never> = {
equals?: $Enums.InvitationStatus | Prisma.EnumInvitationStatusFieldRefInput<$PrismaModel>
in?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumInvitationStatusFilter<$PrismaModel> | $Enums.InvitationStatus
}
export type EnumInvitationStatusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.InvitationStatus | Prisma.EnumInvitationStatusFieldRefInput<$PrismaModel>
in?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumInvitationStatusWithAggregatesFilter<$PrismaModel> | $Enums.InvitationStatus
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumInvitationStatusFilter<$PrismaModel>
_max?: Prisma.NestedEnumInvitationStatusFilter<$PrismaModel>
}
export type EnumRequestStatusFilter<$PrismaModel = never> = {
equals?: $Enums.RequestStatus | Prisma.EnumRequestStatusFieldRefInput<$PrismaModel>
in?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumRequestStatusFilter<$PrismaModel> | $Enums.RequestStatus
}
export type EnumRequestStatusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.RequestStatus | Prisma.EnumRequestStatusFieldRefInput<$PrismaModel>
in?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumRequestStatusWithAggregatesFilter<$PrismaModel> | $Enums.RequestStatus
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumRequestStatusFilter<$PrismaModel>
_max?: Prisma.NestedEnumRequestStatusFilter<$PrismaModel>
}
export type NestedStringFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
@@ -539,4 +590,55 @@ export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type NestedEnumHouseRoleFilter<$PrismaModel = never> = {
equals?: $Enums.HouseRole | Prisma.EnumHouseRoleFieldRefInput<$PrismaModel>
in?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
notIn?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumHouseRoleFilter<$PrismaModel> | $Enums.HouseRole
}
export type NestedEnumHouseRoleWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.HouseRole | Prisma.EnumHouseRoleFieldRefInput<$PrismaModel>
in?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
notIn?: $Enums.HouseRole[] | Prisma.ListEnumHouseRoleFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumHouseRoleWithAggregatesFilter<$PrismaModel> | $Enums.HouseRole
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumHouseRoleFilter<$PrismaModel>
_max?: Prisma.NestedEnumHouseRoleFilter<$PrismaModel>
}
export type NestedEnumInvitationStatusFilter<$PrismaModel = never> = {
equals?: $Enums.InvitationStatus | Prisma.EnumInvitationStatusFieldRefInput<$PrismaModel>
in?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumInvitationStatusFilter<$PrismaModel> | $Enums.InvitationStatus
}
export type NestedEnumInvitationStatusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.InvitationStatus | Prisma.EnumInvitationStatusFieldRefInput<$PrismaModel>
in?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.InvitationStatus[] | Prisma.ListEnumInvitationStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumInvitationStatusWithAggregatesFilter<$PrismaModel> | $Enums.InvitationStatus
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumInvitationStatusFilter<$PrismaModel>
_max?: Prisma.NestedEnumInvitationStatusFilter<$PrismaModel>
}
export type NestedEnumRequestStatusFilter<$PrismaModel = never> = {
equals?: $Enums.RequestStatus | Prisma.EnumRequestStatusFieldRefInput<$PrismaModel>
in?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumRequestStatusFilter<$PrismaModel> | $Enums.RequestStatus
}
export type NestedEnumRequestStatusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.RequestStatus | Prisma.EnumRequestStatusFieldRefInput<$PrismaModel>
in?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
notIn?: $Enums.RequestStatus[] | Prisma.ListEnumRequestStatusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumRequestStatusWithAggregatesFilter<$PrismaModel> | $Enums.RequestStatus
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumRequestStatusFilter<$PrismaModel>
_max?: Prisma.NestedEnumRequestStatusFilter<$PrismaModel>
}

View File

@@ -52,3 +52,32 @@ export const ChallengeStatus = {
} as const
export type ChallengeStatus = (typeof ChallengeStatus)[keyof typeof ChallengeStatus]
export const HouseRole = {
OWNER: 'OWNER',
ADMIN: 'ADMIN',
MEMBER: 'MEMBER'
} as const
export type HouseRole = (typeof HouseRole)[keyof typeof HouseRole]
export const InvitationStatus = {
PENDING: 'PENDING',
ACCEPTED: 'ACCEPTED',
REJECTED: 'REJECTED',
CANCELLED: 'CANCELLED'
} as const
export type InvitationStatus = (typeof InvitationStatus)[keyof typeof InvitationStatus]
export const RequestStatus = {
PENDING: 'PENDING',
ACCEPTED: 'ACCEPTED',
REJECTED: 'REJECTED',
CANCELLED: 'CANCELLED'
} as const
export type RequestStatus = (typeof RequestStatus)[keyof typeof RequestStatus]

File diff suppressed because one or more lines are too long

View File

@@ -390,7 +390,11 @@ export const ModelName = {
EventRegistration: 'EventRegistration',
EventFeedback: 'EventFeedback',
SitePreferences: 'SitePreferences',
Challenge: 'Challenge'
Challenge: 'Challenge',
House: 'House',
HouseMembership: 'HouseMembership',
HouseInvitation: 'HouseInvitation',
HouseRequest: 'HouseRequest'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -406,7 +410,7 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
omit: GlobalOmitOptions
}
meta: {
modelProps: "user" | "userPreferences" | "event" | "eventRegistration" | "eventFeedback" | "sitePreferences" | "challenge"
modelProps: "user" | "userPreferences" | "event" | "eventRegistration" | "eventFeedback" | "sitePreferences" | "challenge" | "house" | "houseMembership" | "houseInvitation" | "houseRequest"
txIsolationLevel: TransactionIsolationLevel
}
model: {
@@ -928,6 +932,302 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
}
}
}
House: {
payload: Prisma.$HousePayload<ExtArgs>
fields: Prisma.HouseFieldRefs
operations: {
findUnique: {
args: Prisma.HouseFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload> | null
}
findUniqueOrThrow: {
args: Prisma.HouseFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>
}
findFirst: {
args: Prisma.HouseFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload> | null
}
findFirstOrThrow: {
args: Prisma.HouseFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>
}
findMany: {
args: Prisma.HouseFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>[]
}
create: {
args: Prisma.HouseCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>
}
createMany: {
args: Prisma.HouseCreateManyArgs<ExtArgs>
result: BatchPayload
}
createManyAndReturn: {
args: Prisma.HouseCreateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>[]
}
delete: {
args: Prisma.HouseDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>
}
update: {
args: Prisma.HouseUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>
}
deleteMany: {
args: Prisma.HouseDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.HouseUpdateManyArgs<ExtArgs>
result: BatchPayload
}
updateManyAndReturn: {
args: Prisma.HouseUpdateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>[]
}
upsert: {
args: Prisma.HouseUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HousePayload>
}
aggregate: {
args: Prisma.HouseAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateHouse>
}
groupBy: {
args: Prisma.HouseGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseGroupByOutputType>[]
}
count: {
args: Prisma.HouseCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseCountAggregateOutputType> | number
}
}
}
HouseMembership: {
payload: Prisma.$HouseMembershipPayload<ExtArgs>
fields: Prisma.HouseMembershipFieldRefs
operations: {
findUnique: {
args: Prisma.HouseMembershipFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload> | null
}
findUniqueOrThrow: {
args: Prisma.HouseMembershipFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>
}
findFirst: {
args: Prisma.HouseMembershipFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload> | null
}
findFirstOrThrow: {
args: Prisma.HouseMembershipFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>
}
findMany: {
args: Prisma.HouseMembershipFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>[]
}
create: {
args: Prisma.HouseMembershipCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>
}
createMany: {
args: Prisma.HouseMembershipCreateManyArgs<ExtArgs>
result: BatchPayload
}
createManyAndReturn: {
args: Prisma.HouseMembershipCreateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>[]
}
delete: {
args: Prisma.HouseMembershipDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>
}
update: {
args: Prisma.HouseMembershipUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>
}
deleteMany: {
args: Prisma.HouseMembershipDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.HouseMembershipUpdateManyArgs<ExtArgs>
result: BatchPayload
}
updateManyAndReturn: {
args: Prisma.HouseMembershipUpdateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>[]
}
upsert: {
args: Prisma.HouseMembershipUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseMembershipPayload>
}
aggregate: {
args: Prisma.HouseMembershipAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateHouseMembership>
}
groupBy: {
args: Prisma.HouseMembershipGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseMembershipGroupByOutputType>[]
}
count: {
args: Prisma.HouseMembershipCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseMembershipCountAggregateOutputType> | number
}
}
}
HouseInvitation: {
payload: Prisma.$HouseInvitationPayload<ExtArgs>
fields: Prisma.HouseInvitationFieldRefs
operations: {
findUnique: {
args: Prisma.HouseInvitationFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload> | null
}
findUniqueOrThrow: {
args: Prisma.HouseInvitationFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>
}
findFirst: {
args: Prisma.HouseInvitationFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload> | null
}
findFirstOrThrow: {
args: Prisma.HouseInvitationFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>
}
findMany: {
args: Prisma.HouseInvitationFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>[]
}
create: {
args: Prisma.HouseInvitationCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>
}
createMany: {
args: Prisma.HouseInvitationCreateManyArgs<ExtArgs>
result: BatchPayload
}
createManyAndReturn: {
args: Prisma.HouseInvitationCreateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>[]
}
delete: {
args: Prisma.HouseInvitationDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>
}
update: {
args: Prisma.HouseInvitationUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>
}
deleteMany: {
args: Prisma.HouseInvitationDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.HouseInvitationUpdateManyArgs<ExtArgs>
result: BatchPayload
}
updateManyAndReturn: {
args: Prisma.HouseInvitationUpdateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>[]
}
upsert: {
args: Prisma.HouseInvitationUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseInvitationPayload>
}
aggregate: {
args: Prisma.HouseInvitationAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateHouseInvitation>
}
groupBy: {
args: Prisma.HouseInvitationGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseInvitationGroupByOutputType>[]
}
count: {
args: Prisma.HouseInvitationCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseInvitationCountAggregateOutputType> | number
}
}
}
HouseRequest: {
payload: Prisma.$HouseRequestPayload<ExtArgs>
fields: Prisma.HouseRequestFieldRefs
operations: {
findUnique: {
args: Prisma.HouseRequestFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload> | null
}
findUniqueOrThrow: {
args: Prisma.HouseRequestFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>
}
findFirst: {
args: Prisma.HouseRequestFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload> | null
}
findFirstOrThrow: {
args: Prisma.HouseRequestFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>
}
findMany: {
args: Prisma.HouseRequestFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>[]
}
create: {
args: Prisma.HouseRequestCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>
}
createMany: {
args: Prisma.HouseRequestCreateManyArgs<ExtArgs>
result: BatchPayload
}
createManyAndReturn: {
args: Prisma.HouseRequestCreateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>[]
}
delete: {
args: Prisma.HouseRequestDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>
}
update: {
args: Prisma.HouseRequestUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>
}
deleteMany: {
args: Prisma.HouseRequestDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.HouseRequestUpdateManyArgs<ExtArgs>
result: BatchPayload
}
updateManyAndReturn: {
args: Prisma.HouseRequestUpdateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>[]
}
upsert: {
args: Prisma.HouseRequestUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$HouseRequestPayload>
}
aggregate: {
args: Prisma.HouseRequestAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateHouseRequest>
}
groupBy: {
args: Prisma.HouseRequestGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseRequestGroupByOutputType>[]
}
count: {
args: Prisma.HouseRequestCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.HouseRequestCountAggregateOutputType> | number
}
}
}
}
} & {
other: {
@@ -1078,6 +1378,54 @@ export const ChallengeScalarFieldEnum = {
export type ChallengeScalarFieldEnum = (typeof ChallengeScalarFieldEnum)[keyof typeof ChallengeScalarFieldEnum]
export const HouseScalarFieldEnum = {
id: 'id',
name: 'name',
description: 'description',
creatorId: 'creatorId',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type HouseScalarFieldEnum = (typeof HouseScalarFieldEnum)[keyof typeof HouseScalarFieldEnum]
export const HouseMembershipScalarFieldEnum = {
id: 'id',
houseId: 'houseId',
userId: 'userId',
role: 'role',
joinedAt: 'joinedAt'
} as const
export type HouseMembershipScalarFieldEnum = (typeof HouseMembershipScalarFieldEnum)[keyof typeof HouseMembershipScalarFieldEnum]
export const HouseInvitationScalarFieldEnum = {
id: 'id',
houseId: 'houseId',
inviterId: 'inviterId',
inviteeId: 'inviteeId',
status: 'status',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type HouseInvitationScalarFieldEnum = (typeof HouseInvitationScalarFieldEnum)[keyof typeof HouseInvitationScalarFieldEnum]
export const HouseRequestScalarFieldEnum = {
id: 'id',
houseId: 'houseId',
requesterId: 'requesterId',
status: 'status',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type HouseRequestScalarFieldEnum = (typeof HouseRequestScalarFieldEnum)[keyof typeof HouseRequestScalarFieldEnum]
export const SortOrder = {
asc: 'asc',
desc: 'desc'
@@ -1213,6 +1561,48 @@ export type ListEnumChallengeStatusFieldRefInput<$PrismaModel> = FieldRefInputTy
/**
* Reference to a field of type 'HouseRole'
*/
export type EnumHouseRoleFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'HouseRole'>
/**
* Reference to a field of type 'HouseRole[]'
*/
export type ListEnumHouseRoleFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'HouseRole[]'>
/**
* Reference to a field of type 'InvitationStatus'
*/
export type EnumInvitationStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'InvitationStatus'>
/**
* Reference to a field of type 'InvitationStatus[]'
*/
export type ListEnumInvitationStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'InvitationStatus[]'>
/**
* Reference to a field of type 'RequestStatus'
*/
export type EnumRequestStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'RequestStatus'>
/**
* Reference to a field of type 'RequestStatus[]'
*/
export type ListEnumRequestStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'RequestStatus[]'>
/**
* Reference to a field of type 'Float'
*/
@@ -1328,6 +1718,10 @@ export type GlobalOmitConfig = {
eventFeedback?: Prisma.EventFeedbackOmit
sitePreferences?: Prisma.SitePreferencesOmit
challenge?: Prisma.ChallengeOmit
house?: Prisma.HouseOmit
houseMembership?: Prisma.HouseMembershipOmit
houseInvitation?: Prisma.HouseInvitationOmit
houseRequest?: Prisma.HouseRequestOmit
}
/* Types for Logging */

View File

@@ -57,7 +57,11 @@ export const ModelName = {
EventRegistration: 'EventRegistration',
EventFeedback: 'EventFeedback',
SitePreferences: 'SitePreferences',
Challenge: 'Challenge'
Challenge: 'Challenge',
House: 'House',
HouseMembership: 'HouseMembership',
HouseInvitation: 'HouseInvitation',
HouseRequest: 'HouseRequest'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -187,6 +191,54 @@ export const ChallengeScalarFieldEnum = {
export type ChallengeScalarFieldEnum = (typeof ChallengeScalarFieldEnum)[keyof typeof ChallengeScalarFieldEnum]
export const HouseScalarFieldEnum = {
id: 'id',
name: 'name',
description: 'description',
creatorId: 'creatorId',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type HouseScalarFieldEnum = (typeof HouseScalarFieldEnum)[keyof typeof HouseScalarFieldEnum]
export const HouseMembershipScalarFieldEnum = {
id: 'id',
houseId: 'houseId',
userId: 'userId',
role: 'role',
joinedAt: 'joinedAt'
} as const
export type HouseMembershipScalarFieldEnum = (typeof HouseMembershipScalarFieldEnum)[keyof typeof HouseMembershipScalarFieldEnum]
export const HouseInvitationScalarFieldEnum = {
id: 'id',
houseId: 'houseId',
inviterId: 'inviterId',
inviteeId: 'inviteeId',
status: 'status',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type HouseInvitationScalarFieldEnum = (typeof HouseInvitationScalarFieldEnum)[keyof typeof HouseInvitationScalarFieldEnum]
export const HouseRequestScalarFieldEnum = {
id: 'id',
houseId: 'houseId',
requesterId: 'requesterId',
status: 'status',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type HouseRequestScalarFieldEnum = (typeof HouseRequestScalarFieldEnum)[keyof typeof HouseRequestScalarFieldEnum]
export const SortOrder = {
asc: 'asc',
desc: 'desc'

View File

@@ -15,4 +15,8 @@ export type * from './models/EventRegistration'
export type * from './models/EventFeedback'
export type * from './models/SitePreferences'
export type * from './models/Challenge'
export type * from './models/House'
export type * from './models/HouseMembership'
export type * from './models/HouseInvitation'
export type * from './models/HouseRequest'
export type * from './commonInputTypes'

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,120 @@
-- CreateEnum
CREATE TYPE "HouseRole" AS ENUM ('OWNER', 'ADMIN', 'MEMBER');
-- CreateEnum
CREATE TYPE "InvitationStatus" AS ENUM ('PENDING', 'ACCEPTED', 'REJECTED', 'CANCELLED');
-- CreateEnum
CREATE TYPE "RequestStatus" AS ENUM ('PENDING', 'ACCEPTED', 'REJECTED', 'CANCELLED');
-- CreateTable
CREATE TABLE "House" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"creatorId" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "House_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "HouseMembership" (
"id" TEXT NOT NULL,
"houseId" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"role" "HouseRole" NOT NULL DEFAULT 'MEMBER',
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "HouseMembership_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "HouseInvitation" (
"id" TEXT NOT NULL,
"houseId" TEXT NOT NULL,
"inviterId" TEXT NOT NULL,
"inviteeId" TEXT NOT NULL,
"status" "InvitationStatus" NOT NULL DEFAULT 'PENDING',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "HouseInvitation_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "HouseRequest" (
"id" TEXT NOT NULL,
"houseId" TEXT NOT NULL,
"requesterId" TEXT NOT NULL,
"status" "RequestStatus" NOT NULL DEFAULT 'PENDING',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "HouseRequest_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "House_creatorId_idx" ON "House"("creatorId");
-- CreateIndex
CREATE INDEX "House_name_idx" ON "House"("name");
-- CreateIndex
CREATE UNIQUE INDEX "HouseMembership_houseId_userId_key" ON "HouseMembership"("houseId", "userId");
-- CreateIndex
CREATE INDEX "HouseMembership_houseId_idx" ON "HouseMembership"("houseId");
-- CreateIndex
CREATE INDEX "HouseMembership_userId_idx" ON "HouseMembership"("userId");
-- CreateIndex
CREATE UNIQUE INDEX "HouseInvitation_houseId_inviteeId_key" ON "HouseInvitation"("houseId", "inviteeId");
-- CreateIndex
CREATE INDEX "HouseInvitation_houseId_idx" ON "HouseInvitation"("houseId");
-- CreateIndex
CREATE INDEX "HouseInvitation_inviteeId_idx" ON "HouseInvitation"("inviteeId");
-- CreateIndex
CREATE INDEX "HouseInvitation_status_idx" ON "HouseInvitation"("status");
-- CreateIndex
CREATE UNIQUE INDEX "HouseRequest_houseId_requesterId_key" ON "HouseRequest"("houseId", "requesterId");
-- CreateIndex
CREATE INDEX "HouseRequest_houseId_idx" ON "HouseRequest"("houseId");
-- CreateIndex
CREATE INDEX "HouseRequest_requesterId_idx" ON "HouseRequest"("requesterId");
-- CreateIndex
CREATE INDEX "HouseRequest_status_idx" ON "HouseRequest"("status");
-- AddForeignKey
ALTER TABLE "House" ADD CONSTRAINT "House_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "HouseMembership" ADD CONSTRAINT "HouseMembership_houseId_fkey" FOREIGN KEY ("houseId") REFERENCES "House"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "HouseMembership" ADD CONSTRAINT "HouseMembership_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "HouseInvitation" ADD CONSTRAINT "HouseInvitation_houseId_fkey" FOREIGN KEY ("houseId") REFERENCES "House"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "HouseInvitation" ADD CONSTRAINT "HouseInvitation_inviterId_fkey" FOREIGN KEY ("inviterId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "HouseInvitation" ADD CONSTRAINT "HouseInvitation_inviteeId_fkey" FOREIGN KEY ("inviteeId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "HouseRequest" ADD CONSTRAINT "HouseRequest_houseId_fkey" FOREIGN KEY ("houseId") REFERENCES "House"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "HouseRequest" ADD CONSTRAINT "HouseRequest_requesterId_fkey" FOREIGN KEY ("requesterId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@@ -31,6 +31,11 @@ model User {
challengesAsChallenged Challenge[] @relation("Challenged")
challengesAsAdmin Challenge[] @relation("AdminValidator")
challengesAsWinner Challenge[] @relation("ChallengeWinner")
houseMemberships HouseMembership[]
houseInvitationsSent HouseInvitation[] @relation("Inviter")
houseInvitationsReceived HouseInvitation[] @relation("Invitee")
houseRequestsSent HouseRequest[] @relation("Requester")
housesCreated House[] @relation("HouseCreator")
@@index([score])
@@index([email])
@@ -166,3 +171,87 @@ model Challenge {
@@index([status])
@@index([adminId])
}
model House {
id String @id @default(cuid())
name String
description String?
creatorId String
creator User @relation("HouseCreator", fields: [creatorId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
memberships HouseMembership[]
invitations HouseInvitation[]
requests HouseRequest[]
@@index([creatorId])
@@index([name])
}
model HouseMembership {
id String @id @default(cuid())
houseId String
userId String
role HouseRole @default(MEMBER)
joinedAt DateTime @default(now())
house House @relation(fields: [houseId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([houseId, userId])
@@index([houseId])
@@index([userId])
}
model HouseInvitation {
id String @id @default(cuid())
houseId String
inviterId String // Utilisateur qui envoie l'invitation
inviteeId String // Utilisateur invité
status InvitationStatus @default(PENDING)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
house House @relation(fields: [houseId], references: [id], onDelete: Cascade)
inviter User @relation("Inviter", fields: [inviterId], references: [id], onDelete: Cascade)
invitee User @relation("Invitee", fields: [inviteeId], references: [id], onDelete: Cascade)
@@unique([houseId, inviteeId])
@@index([houseId])
@@index([inviteeId])
@@index([status])
}
model HouseRequest {
id String @id @default(cuid())
houseId String
requesterId String // Utilisateur qui demande à rejoindre
status RequestStatus @default(PENDING)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
house House @relation(fields: [houseId], references: [id], onDelete: Cascade)
requester User @relation("Requester", fields: [requesterId], references: [id], onDelete: Cascade)
@@unique([houseId, requesterId])
@@index([houseId])
@@index([requesterId])
@@index([status])
}
enum HouseRole {
OWNER
ADMIN
MEMBER
}
enum InvitationStatus {
PENDING
ACCEPTED
REJECTED
CANCELLED
}
enum RequestStatus {
PENDING
ACCEPTED
REJECTED
CANCELLED
}

View File

@@ -238,7 +238,150 @@ async function main() {
})
);
console.log("Seed completed:", { admin, users, events });
// Créer les maisons Game of Thrones
const housesData = [
{
name: "Maison Stark",
description:
"Winter is Coming. La Maison Stark de Winterfell règne sur le Nord depuis des millénaires. Fiers, loyaux et honorables, les Stark sont connus pour leur sens de la justice et leur connexion avec les anciens dieux. Leur devise rappelle que l'hiver approche toujours.",
creatorId: users[0].id, // DragonSlayer99
},
{
name: "Maison Lannister",
description:
"Hear Me Roar. La Maison Lannister de Castral Roc est la plus riche des Sept Royaumes. Célèbres pour leur ruse, leur ambition et leur devise 'Un Lannister paie toujours ses dettes', ils contrôlent les terres de l'Ouest avec une main de fer.",
creatorId: users[1].id, // MineMaster
},
{
name: "Maison Targaryen",
description:
"Fire and Blood. Les Targaryen sont les derniers descendants des seigneurs dragons de Valyria. Maîtres des dragons et des flammes, ils ont conquis les Sept Royaumes il y a trois cents ans. Leur sang de feu coule dans leurs veines.",
creatorId: users[2].id, // CraftKing
},
{
name: "Maison Baratheon",
description:
"Ours is the Fury. La Maison Baratheon de Port-Réal règne sur les Terres de l'Orage. Fondée par Orys Baratheon, compagnon d'Aegon le Conquérant, cette maison est connue pour sa force, sa détermination et sa fureur au combat.",
creatorId: users[3].id, // ForestWalker
},
{
name: "Maison Tyrell",
description:
"Growing Strong. La Maison Tyrell de Hautjardin contrôle le Bief, la région la plus fertile des Sept Royaumes. Maîtres de l'agriculture et du commerce, ils sont réputés pour leur richesse, leur diplomatie et leur capacité à faire fleurir même les terres les plus arides.",
creatorId: users[4].id, // HolyGuardian
},
{
name: "Maison Martell",
description:
"Unbowed, Unbent, Unbroken. La Maison Martell de Dorne n'a jamais été conquise. Fiers et indépendants, les Martell gouvernent les terres du Sud avec sagesse. Leur résilience légendaire et leur refus de se soumettre font d'eux des alliés redoutables.",
creatorId: users[5].id, // TechSmith
},
{
name: "Maison Greyjoy",
description:
"We Do Not Sow. La Maison Greyjoy des Îles de Fer règne sur les mers. Fiers guerriers et pillards redoutés, les Greyjoy ne cultivent pas la terre mais prennent ce qu'ils veulent par la force. Leur devise reflète leur nature de conquérants des océans.",
creatorId: admin.id, // Admin crée seulement cette maison
},
];
// Supprimer toutes les maisons existantes avant de les recréer
await prisma.house.deleteMany({});
// Créer les maisons avec leurs membres
// On doit créer les maisons séquentiellement pour éviter les conflits de membres multiples
const houses = [];
const usedUserIds = new Set<string>();
for (let index = 0; index < housesData.length; index++) {
const houseData = housesData[index];
// Vérifier si le créateur est déjà utilisé
if (usedUserIds.has(houseData.creatorId)) {
// Trouver un utilisateur disponible
const availableUser = users.find((u) => !usedUserIds.has(u.id));
if (!availableUser) {
console.warn(
`Pas d'utilisateur disponible pour ${houseData.name}, utilisation de l'admin`
);
// Utiliser l'admin seulement si vraiment nécessaire
if (!usedUserIds.has(admin.id)) {
houseData.creatorId = admin.id;
} else {
console.error(
`Impossible de créer ${houseData.name}, tous les utilisateurs sont déjà dans une maison`
);
continue;
}
} else {
houseData.creatorId = availableUser.id;
}
}
const house = await prisma.house.create({
data: {
name: houseData.name,
description: houseData.description,
creatorId: houseData.creatorId,
memberships: {
create: {
userId: houseData.creatorId,
role: "OWNER",
},
},
},
});
usedUserIds.add(houseData.creatorId);
// Ajouter quelques membres supplémentaires pour certaines maisons
if (index === 0 && users.length > 1 && !usedUserIds.has(users[1].id)) {
// Stark : ajouter un membre
await prisma.houseMembership.create({
data: {
houseId: house.id,
userId: users[1].id,
role: "MEMBER",
},
});
usedUserIds.add(users[1].id);
}
if (index === 1 && users.length > 2 && !usedUserIds.has(users[2].id)) {
// Lannister : ajouter deux membres
await prisma.houseMembership.create({
data: {
houseId: house.id,
userId: users[2].id,
role: "MEMBER",
},
});
usedUserIds.add(users[2].id);
if (users.length > 3 && !usedUserIds.has(users[3].id)) {
await prisma.houseMembership.create({
data: {
houseId: house.id,
userId: users[3].id,
role: "ADMIN",
},
});
usedUserIds.add(users[3].id);
}
}
if (index === 2 && users.length > 4 && !usedUserIds.has(users[4].id)) {
// Targaryen : ajouter un membre
await prisma.houseMembership.create({
data: {
houseId: house.id,
userId: users[4].id,
role: "MEMBER",
},
});
usedUserIds.add(users[4].id);
}
houses.push(house);
}
console.log("Seed completed:", { admin, users, events, houses });
}
main()