feat:rating

This commit is contained in:
2025-12-16 15:22:09 +01:00
parent abed2792dc
commit 851a9dfa2d
9 changed files with 1338 additions and 1 deletions

View File

@@ -1,4 +1,4 @@
import { pgTable, integer, text, timestamp, boolean, jsonb } from 'drizzle-orm/pg-core';
import { pgTable, integer, text, timestamp, boolean, jsonb, real } from 'drizzle-orm/pg-core';
export const user = pgTable('user', {
id: text('id').primaryKey(),
@@ -30,6 +30,8 @@ export const location = pgTable('location', {
latitude: text('latitude').notNull(), // Using text for precision
longitude: text('longitude').notNull(), // Using text for precision
locationName: text('location_name'), // e.g., "Café Belga, Brussels"
averageRating: integer('average_rating'), // Average rating (1-5 scale, stored as integer * 100 for precision)
ratingCount: integer('rating_count').default(0), // Total number of finds with ratings at this location
createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).defaultNow().notNull()
});
@@ -45,6 +47,8 @@ export const find = pgTable('find', {
title: text('title').notNull(),
description: text('description'),
category: text('category'), // e.g., "cafe", "restaurant", "park", "landmark"
rating: integer('rating'), // Average rating for this find (1-5 stars, stored as integer * 100)
ratingCount: integer('rating_count').default(0), // Number of ratings for this find
isPublic: integer('is_public').default(1), // Using integer for boolean (1 = true, 0 = false)
createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).defaultNow().notNull(),
updatedAt: timestamp('updated_at', { withTimezone: true, mode: 'date' }).defaultNow().notNull()
@@ -75,6 +79,19 @@ export const findLike = pgTable('find_like', {
createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).defaultNow().notNull()
});
export const findRating = pgTable('find_rating', {
id: text('id').primaryKey(),
findId: text('find_id')
.notNull()
.references(() => find.id, { onDelete: 'cascade' }),
userId: text('user_id')
.notNull()
.references(() => user.id, { onDelete: 'cascade' }),
rating: integer('rating').notNull(), // 1-5 stars (stored as 100-500 for precision)
createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).defaultNow().notNull(),
updatedAt: timestamp('updated_at', { withTimezone: true, mode: 'date' }).defaultNow().notNull()
});
export const friendship = pgTable('friendship', {
id: text('id').primaryKey(),
userId: text('user_id')
@@ -146,6 +163,7 @@ export type Location = typeof location.$inferSelect;
export type Find = typeof find.$inferSelect;
export type FindMedia = typeof findMedia.$inferSelect;
export type FindLike = typeof findLike.$inferSelect;
export type FindRating = typeof findRating.$inferSelect;
export type FindComment = typeof findComment.$inferSelect;
export type Friendship = typeof friendship.$inferSelect;
export type Notification = typeof notification.$inferSelect;
@@ -156,6 +174,7 @@ export type LocationInsert = typeof location.$inferInsert;
export type FindInsert = typeof find.$inferInsert;
export type FindMediaInsert = typeof findMedia.$inferInsert;
export type FindLikeInsert = typeof findLike.$inferInsert;
export type FindRatingInsert = typeof findRating.$inferInsert;
export type FindCommentInsert = typeof findComment.$inferInsert;
export type FriendshipInsert = typeof friendship.$inferInsert;
export type NotificationInsert = typeof notification.$inferInsert;