Release 202507030838

This commit is contained in:
pluja
2025-07-03 08:38:11 +00:00
parent 01488b8b3b
commit a545726abf
28 changed files with 1044 additions and 282 deletions

View File

@@ -0,0 +1,15 @@
-- AlterEnum
-- This migration adds more than one value to an enum.
-- With PostgreSQL versions 11 and earlier, this is not possible
-- in a single migration. This can be worked around by creating
-- multiple migrations, each migration adding only one value to
-- the enum.
ALTER TYPE "NotificationType" ADD VALUE 'ACCOUNT_DELETION_WARNING_30_DAYS';
ALTER TYPE "NotificationType" ADD VALUE 'ACCOUNT_DELETION_WARNING_15_DAYS';
ALTER TYPE "NotificationType" ADD VALUE 'ACCOUNT_DELETION_WARNING_5_DAYS';
ALTER TYPE "NotificationType" ADD VALUE 'ACCOUNT_DELETION_WARNING_1_DAY';
-- AlterTable
ALTER TABLE "User" ADD COLUMN "scheduledDeletionAt" DATE;

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Category" ADD COLUMN "namePluralLong" TEXT;

View File

@@ -144,6 +144,10 @@ enum NotificationType {
ACCOUNT_STATUS_CHANGE
EVENT_CREATED
SERVICE_VERIFICATION_STATUS_CHANGE
ACCOUNT_DELETION_WARNING_30_DAYS
ACCOUNT_DELETION_WARNING_15_DAYS
ACCOUNT_DELETION_WARNING_5_DAYS
ACCOUNT_DELETION_WARNING_1_DAY
}
enum CommentStatusChange {
@@ -498,20 +502,22 @@ model InternalServiceNote {
}
model User {
id Int @id @default(autoincrement())
name String @unique
displayName String?
link String?
picture String?
spammer Boolean @default(false)
verified Boolean @default(false)
admin Boolean @default(false)
moderator Boolean @default(false)
verifiedLink String?
secretTokenHash String @unique
feedId String @unique @default(cuid(2))
id Int @id @default(autoincrement())
name String @unique
displayName String?
link String?
picture String?
spammer Boolean @default(false)
verified Boolean @default(false)
admin Boolean @default(false)
moderator Boolean @default(false)
verifiedLink String?
secretTokenHash String @unique
feedId String @unique @default(cuid(2))
/// Computed via trigger. Do not update through prisma.
totalKarma Int @default(0)
totalKarma Int @default(0)
/// Date when user is scheduled for deletion due to inactivity
scheduledDeletionAt DateTime? @db.Date
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@ -609,10 +615,11 @@ model VerificationStep {
}
model Category {
id Int @id @default(autoincrement())
name String @unique
icon String
slug String @unique
id Int @id @default(autoincrement())
name String @unique
namePluralLong String?
icon String
slug String @unique
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt

View File

@@ -141,81 +141,97 @@ const generateFakeAttribute = () => {
const categoriesToCreate = [
{
name: 'Exchange',
namePluralLong: 'Exchanges',
slug: 'exchange',
icon: 'ri:arrow-left-right-fill',
},
{
name: 'VPN',
namePluralLong: 'VPNs',
slug: 'vpn',
icon: 'ri:door-lock-fill',
},
{
name: 'Email',
namePluralLong: 'Email providers',
slug: 'email',
icon: 'ri:mail-fill',
},
{
name: 'Hosting',
namePluralLong: 'Hostings',
slug: 'hosting',
icon: 'ri:server-fill',
},
{
name: 'VPS',
namePluralLong: 'VPS providers',
slug: 'vps',
icon: 'ri:function-add-fill',
},
{
name: 'Gift Cards',
namePluralLong: 'Gift cards',
slug: 'gift-cards',
icon: 'ri:gift-line',
},
{
name: 'Goods',
namePluralLong: 'Goods providers',
slug: 'goods',
icon: 'ri:shopping-basket-fill',
},
{
name: 'Travel',
namePluralLong: 'Travel services',
slug: 'travel',
icon: 'ri:plane-fill',
},
{
name: 'SMS',
namePluralLong: 'SMS providers',
slug: 'sms',
icon: 'ri:message-2-fill',
},
{
name: 'Store',
namePluralLong: 'Stores',
slug: 'store',
icon: 'ri:store-2-line',
},
{
name: 'Tool',
namePluralLong: 'Tools',
slug: 'tool',
icon: 'ri:tools-fill',
},
{
name: 'Market',
namePluralLong: 'Markets',
slug: 'market',
icon: 'ri:price-tag-3-line',
},
{
name: 'Aggregator',
namePluralLong: 'Aggregators',
slug: 'aggregator',
icon: 'ri:list-ordered',
},
{
name: 'AI',
namePluralLong: 'AI services',
slug: 'ai',
icon: 'ri:ai-generate-2',
},
{
name: 'CEX',
namePluralLong: 'CEXs',
slug: 'cex',
icon: 'ri:rotate-lock-fill',
},
{
name: 'DEX',
namePluralLong: 'DEXs',
slug: 'dex',
icon: 'ri:fediverse-line',
},

View File

@@ -275,35 +275,39 @@ CREATE OR REPLACE FUNCTION handle_suggestion_status_change()
RETURNS TRIGGER AS $$
DECLARE
service_name TEXT;
service_visibility "ServiceVisibility";
is_user_admin_or_moderator BOOLEAN;
BEGIN
-- Award karma for first approval
-- Check that OLD.status is not NULL to handle the initial creation case if needed,
-- and ensure it wasn't already APPROVED.
IF OLD.status IS DISTINCT FROM 'APPROVED' AND NEW.status = 'APPROVED' THEN
-- Check if the user is an admin or moderator
SELECT (admin = true OR moderator = true)
FROM "User"
WHERE id = NEW."userId"
INTO is_user_admin_or_moderator;
-- Fetch service details for the description
SELECT name, visibility INTO service_name, service_visibility FROM "Service" WHERE id = NEW."serviceId";
-- Only award karma if the user is NOT an admin/moderator
IF NOT COALESCE(is_user_admin_or_moderator, false) THEN
-- Fetch service name for the description
SELECT name INTO service_name FROM "Service" WHERE id = NEW."serviceId";
-- Only award karma if the service is public
IF service_visibility = 'PUBLIC' THEN
-- Check if the user is an admin or moderator
SELECT (admin = true OR moderator = true)
FROM "User"
WHERE id = NEW."userId"
INTO is_user_admin_or_moderator;
-- Only award karma if the user is NOT an admin/moderator
IF NOT COALESCE(is_user_admin_or_moderator, false) THEN
-- Insert karma transaction, linking it to the suggestion
PERFORM insert_karma_transaction(
NEW."userId",
10,
'SUGGESTION_APPROVED',
NULL, -- p_comment_id (not applicable)
format('Your suggestion for service ''%s'' has been approved!', service_name),
NEW.id -- p_suggestion_id
);
-- Insert karma transaction, linking it to the suggestion
PERFORM insert_karma_transaction(
NEW."userId",
10,
'SUGGESTION_APPROVED',
NULL, -- p_comment_id (not applicable)
format('Your suggestion for service ''%s'' has been approved!', service_name),
NEW.id -- p_suggestion_id
);
-- Update user's total karma
PERFORM update_user_karma(NEW."userId", 10);
-- Update user's total karma
PERFORM update_user_karma(NEW."userId", 10);
END IF;
END IF;
END IF;