- Become a paying member of Coders for Causes for just $5 a year (ends on 31st Dec{" "} - {new Date().getFullYear()}). There are many benefits to becoming a member which include: + Become a paying member of Coders for Causes for just $5 a year (ends one year from now). There are many + benefits to becoming a member which include:
- Become a paying member of Coders for Causes for just $5 a year (ends on 31st Dec{" "} - {new Date().getFullYear()}). There are many benefits to becoming a member which include: + Become a paying member of Coders for Causes for just $5 a year (ends one year from now). There are many + benefits to becoming a member which include:
- Become a paying member of Coders for Causes for just $5 a year (ends on 31st Dec{" "} - {new Date().getFullYear()} - ). There are many benefits to becoming a member which include: + Become a paying member of Coders for Causes for just $5 a year (ends one year from now ). There are many + benefits to becoming a member which include:
You're not a member with us yet. Become a paying member of Coders for Causes for just - $5 a year (ends on 31st Dec {new Date().getFullYear()}). There are many benefits to becoming - a member which include: + $5 a year (ends one year from now). There are many benefits to becoming a member which + include:
{
const currentUser = ctx.user
if (!currentUser) throw new Error("Not authenticated")
- // TODO: update clerk email
// TODO: Wrap in a transaction
try {
const clerk = await clerkClient()
diff --git a/src/server/db/migrations/0005_daffy_victor_mancha.sql b/src/server/db/migrations/0005_daffy_victor_mancha.sql
new file mode 100644
index 000000000..d14f50e32
--- /dev/null
+++ b/src/server/db/migrations/0005_daffy_victor_mancha.sql
@@ -0,0 +1 @@
+ALTER TABLE "cfc-website_user" ADD COLUMN "membership_expiry" timestamp;
\ No newline at end of file
diff --git a/src/server/db/migrations/meta/0005_snapshot.json b/src/server/db/migrations/meta/0005_snapshot.json
new file mode 100644
index 000000000..808aaf628
--- /dev/null
+++ b/src/server/db/migrations/meta/0005_snapshot.json
@@ -0,0 +1,473 @@
+{
+ "id": "87cdcee0-0af7-4bb4-835c-22aff0c7224b",
+ "prevId": "e6d773c5-ad78-4d33-a9e7-5a16440dac6e",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.cfc-website_payment": {
+ "name": "cfc-website_payment",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "amount": {
+ "name": "amount",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "currency": {
+ "name": "currency",
+ "type": "varchar(3)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'AUD'"
+ },
+ "label": {
+ "name": "label",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_id": {
+ "name": "event_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "user_id_idx": {
+ "name": "user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "event_id_idx": {
+ "name": "event_id_idx",
+ "columns": [
+ {
+ "expression": "event_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "cfc-website_payment_user_id_cfc-website_user_id_fk": {
+ "name": "cfc-website_payment_user_id_cfc-website_user_id_fk",
+ "tableFrom": "cfc-website_payment",
+ "tableTo": "cfc-website_user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cfc-website_project": {
+ "name": "cfc-website_project",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "icon": {
+ "name": "icon",
+ "type": "project_icon",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "logo_path": {
+ "name": "logo_path",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "img_path": {
+ "name": "img_path",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client": {
+ "name": "client",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "project_type",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "website_url": {
+ "name": "website_url",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github_url": {
+ "name": "github_url",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "impact": {
+ "name": "impact",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(1024)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tech": {
+ "name": "tech",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "members": {
+ "name": "members",
+ "type": "varchar(256)[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_application_open": {
+ "name": "is_application_open",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "application_url": {
+ "name": "application_url",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_public": {
+ "name": "is_public",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "name_idx": {
+ "name": "name_idx",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cfc-website_project_name_unique": {
+ "name": "cfc-website_project_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cfc-website_user": {
+ "name": "cfc-website_user",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "clerk_id": {
+ "name": "clerk_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "preferred_name": {
+ "name": "preferred_name",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pronouns": {
+ "name": "pronouns",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "student_number": {
+ "name": "student_number",
+ "type": "varchar(8)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "university": {
+ "name": "university",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github": {
+ "name": "github",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "discord": {
+ "name": "discord",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subscribe": {
+ "name": "subscribe",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "role": {
+ "name": "role",
+ "type": "role",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "square_customer_id": {
+ "name": "square_customer_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "membership_expiry": {
+ "name": "membership_expiry",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reminder_pending": {
+ "name": "reminder_pending",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {
+ "role_idx": {
+ "name": "role_idx",
+ "columns": [
+ {
+ "expression": "role",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cfc-website_user_clerk_id_unique": {
+ "name": "cfc-website_user_clerk_id_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "clerk_id"
+ ]
+ },
+ "cfc-website_user_email_unique": {
+ "name": "cfc-website_user_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ },
+ "cfc-website_user_square_customer_id_unique": {
+ "name": "cfc-website_user_square_customer_id_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "square_customer_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {
+ "public.project_icon": {
+ "name": "project_icon",
+ "schema": "public",
+ "values": [
+ "devices",
+ "computer",
+ "mobile"
+ ]
+ },
+ "public.role": {
+ "name": "role",
+ "schema": "public",
+ "values": [
+ "member",
+ "honorary",
+ "past",
+ "committee",
+ "admin"
+ ]
+ },
+ "public.project_type": {
+ "name": "project_type",
+ "schema": "public",
+ "values": [
+ "Mobile application",
+ "Progressive Web App (PWA)",
+ "Website"
+ ]
+ }
+ },
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/src/server/db/migrations/meta/_journal.json b/src/server/db/migrations/meta/_journal.json
index c9355ad71..7e15eff3f 100644
--- a/src/server/db/migrations/meta/_journal.json
+++ b/src/server/db/migrations/meta/_journal.json
@@ -36,6 +36,13 @@
"when": 1757090142089,
"tag": "0004_fine_ken_ellis",
"breakpoints": true
+ },
+ {
+ "idx": 5,
+ "version": "7",
+ "when": 1767083476016,
+ "tag": "0005_daffy_victor_mancha",
+ "breakpoints": true
}
]
}
\ No newline at end of file
diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts
index f43fe9cce..b4667f96d 100644
--- a/src/server/db/schema.ts
+++ b/src/server/db/schema.ts
@@ -36,7 +36,7 @@ export const User = pgTable(
subscribe: boolean("subscribe").default(true).notNull(),
role: roleEnum("role"),
square_customer_id: varchar("square_customer_id", { length: 32 }).unique().notNull(),
-
+ membership_expiry: timestamp("membership_expiry"),
createdAt: timestamp("created_at")
.$default(() => new Date())
.notNull(),
diff --git a/vercel.json b/vercel.json
index 14d7d260d..0b4104ba8 100644
--- a/vercel.json
+++ b/vercel.json
@@ -6,19 +6,19 @@
},
{
"path": "/api/cron/membership-renewal-reminder",
- "schedule": "59 15 1 1 *"
+ "schedule": "0 3 1 1 *"
},
{
"path": "/api/cron/membership-renewal-reminder",
- "schedule": "59 15 2 1 *"
+ "schedule": "0 3 2 1 *"
},
{
"path": "/api/cron/membership-renewal-reminder",
- "schedule": "59 15 3 1 *"
+ "schedule": "0 3 3 1 *"
},
{
"path": "/api/cron/membership-renewal-reminder",
- "schedule": "59 15 4 1 *"
+ "schedule": "0 3 4 1 *"
}
]
}
From 2f6c455ee38362cc8ac43c193f8c95d13407da64 Mon Sep 17 00:00:00 2001
From: ErikaKK <491649804@qq.com>
Date: Tue, 30 Dec 2025 17:35:39 +0800
Subject: [PATCH 3/3] fix date and typo
---
src/app/create-account/payment.tsx | 2 +-
src/server/api/routers/admin/users/update-role.ts | 3 ++-
src/server/api/routers/payments/pay.ts | 8 +++++---
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/app/create-account/payment.tsx b/src/app/create-account/payment.tsx
index b5f0eb106..73ed4a7e9 100644
--- a/src/app/create-account/payment.tsx
+++ b/src/app/create-account/payment.tsx
@@ -15,7 +15,7 @@ const PaymentBlock = () => {
- Become a paying member of Coders for Causes for just $5 a year (ends one year from now ). There are many + Become a paying member of Coders for Causes for just $5 a year (ends one year from now). There are many benefits to becoming a member which include: