refactor(database): ♻️ Use dates instead of strings in database
Some checks failed
CodeQL Scan / Analyze (javascript-typescript) (push) Failing after 1s
Build Docker Images / lint (push) Failing after 7s
Build Docker Images / check (push) Failing after 7s
Build Docker Images / tests (push) Failing after 7s
Build Docker Images / detect-circular (push) Failing after 7s
Deploy Docs to GitHub Pages / build (push) Failing after 0s
Build Docker Images / build (server, Dockerfile, ${{ github.repository_owner }}/server) (push) Has been skipped
Build Docker Images / build (worker, Worker.Dockerfile, ${{ github.repository_owner }}/worker) (push) Has been skipped
Deploy Docs to GitHub Pages / Deploy (push) Has been skipped
Mirror to Codeberg / Mirror (push) Failing after 0s
Nix Build / check (push) Failing after 0s
Test Publish / build (client) (push) Failing after 0s
Test Publish / build (sdk) (push) Failing after 0s

This commit is contained in:
Jesse Wierzbinski 2025-12-11 04:03:57 +01:00
parent 1fefafdbad
commit 6056a6622c
No known key found for this signature in database
25 changed files with 2548 additions and 67 deletions

View file

@ -137,7 +137,7 @@ export const checkRouteNeedsChallenge = async (
// Expire the challenge
await db
.update(Challenges)
.set({ expiresAt: new Date().toISOString() })
.set({ expiresAt: new Date() })
.where(eq(Challenges.id, challenge_id));
};

View file

@ -153,7 +153,7 @@ export class Like extends BaseInterface<typeof Likes, LikeType> {
this.data.liker.uri ? new URL(this.data.liker.uri) : null,
).href,
type: "pub.versia:likes/Like",
created_at: new Date(this.data.createdAt).toISOString(),
created_at: this.data.createdAt.toISOString(),
liked: this.data.liked.uri
? new URL(this.data.liked.uri).href
: new URL(`/notes/${this.data.liked.id}`, config.http.base_url)

View file

@ -513,7 +513,7 @@ export class Note extends BaseInterface<typeof Notes, NoteTypeWithRelations> {
reblogId: this.id,
visibility,
sensitive: false,
updatedAt: new Date().toISOString(),
updatedAt: new Date(),
clientId: null,
uri: uri?.href,
});
@ -979,7 +979,7 @@ export class Note extends BaseInterface<typeof Notes, NoteTypeWithRelations> {
authorId: author.id,
visibility: "public",
uri,
createdAt: new Date(created_at).toISOString(),
createdAt: new Date(created_at),
}));
const attachments = await Promise.all(
@ -1150,7 +1150,7 @@ export class Note extends BaseInterface<typeof Notes, NoteTypeWithRelations> {
in_reply_to_id: data.replyId || null,
in_reply_to_account_id: data.reply?.authorId || null,
account: this.author.toApi(userFetching?.id === data.authorId),
created_at: new Date(data.createdAt).toISOString(),
created_at: data.createdAt.toISOString(),
application: data.client
? new Client(data.client).toApi()
: undefined,
@ -1200,9 +1200,7 @@ export class Note extends BaseInterface<typeof Notes, NoteTypeWithRelations> {
(n) => n?.toApi(userFetching),
)) ?? null)
: null,
edited_at: data.updatedAt
? new Date(data.updatedAt).toISOString()
: null,
edited_at: data.updatedAt.toISOString(),
reactions,
text: data.contentSource,
};
@ -1246,7 +1244,7 @@ export class Note extends BaseInterface<typeof Notes, NoteTypeWithRelations> {
const status = this.data;
return new VersiaEntities.Note({
type: "Note",
created_at: new Date(status.createdAt).toISOString(),
created_at: status.createdAt.toISOString(),
id: status.id,
author: this.author.uri.href,
uri: this.getUri().href,

View file

@ -186,7 +186,7 @@ export class Notification extends BaseInterface<
return {
account: account.toApi(),
created_at: new Date(this.data.createdAt).toISOString(),
created_at: this.data.createdAt.toISOString(),
id: this.data.id,
type: this.data.type,
status: this.data.status

View file

@ -217,7 +217,7 @@ export class Reaction extends BaseInterface<typeof Reactions, ReactionType> {
this.data.authorId,
this.data.author.uri ? new URL(this.data.author.uri) : null,
).href,
created_at: new Date(this.data.createdAt).toISOString(),
created_at: this.data.createdAt.toISOString(),
id: this.id,
object: this.data.note.uri
? new URL(this.data.note.uri).href

View file

@ -160,9 +160,7 @@ export class Token extends BaseInterface<typeof Tokens, TokenType> {
access_token: this.data.accessToken,
token_type: "Bearer",
scope: this.data.scopes.join(" "),
created_at: Math.floor(
new Date(this.data.createdAt).getTime() / 1000,
),
created_at: Math.floor(this.data.createdAt.getTime() / 1000),
};
}
}

View file

@ -475,7 +475,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
isNull(Users.instanceId),
gte(
Notes.createdAt,
new Date(Date.now() - milliseconds).toISOString(),
new Date(Date.now() - milliseconds),
),
),
)
@ -803,7 +803,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
}
await user.update({
createdAt: new Date(created_at).toISOString(),
createdAt: new Date(created_at),
endpoints: {
inbox,
outbox: collections.outbox,
@ -940,7 +940,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
publicKey: keys.public_key,
fields: [],
privateKey: keys.private_key,
updatedAt: new Date().toISOString(),
updatedAt: new Date(),
source: {
language: "en",
note: "",
@ -1116,7 +1116,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
avatar: this.getAvatarUrl().proxied,
header: this.getHeaderUrl()?.proxied ?? "",
locked: user.isLocked,
created_at: new Date(user.createdAt).toISOString(),
created_at: user.createdAt.toISOString(),
followers_count:
user.isHidingCollections && !isOwnAccount
? 0
@ -1177,7 +1177,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
remote: false,
},
},
created_at: new Date(user.createdAt).toISOString(),
created_at: user.createdAt.toISOString(),
collections: {
featured: new URL(
`/users/${user.id}/featured`,

View file

@ -0,0 +1,45 @@
ALTER TABLE "AuthorizationCodes" ALTER COLUMN "expires_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "AuthorizationCodes" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "AuthorizationCodes" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Challenges" ALTER COLUMN "expires_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Challenges" ALTER COLUMN "expires_at" SET DEFAULT NOW() + INTERVAL '5 minutes';--> statement-breakpoint
ALTER TABLE "Challenges" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Challenges" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Filters" ALTER COLUMN "expires_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Filters" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Filters" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Flags" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Flags" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Likes" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Likes" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Markers" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Markers" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "ModNotes" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "ModNotes" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "ModTags" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "ModTags" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Notes" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Notes" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Notes" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Notes" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Notifications" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Notifications" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "PushSubscriptions" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "PushSubscriptions" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "PushSubscriptions" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "PushSubscriptions" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Reaction" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Reaction" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Reaction" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Reaction" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Relationships" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Relationships" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Relationships" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Relationships" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Tokens" ALTER COLUMN "expires_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Tokens" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Tokens" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Users" ALTER COLUMN "created_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Users" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "Users" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (3) with time zone;--> statement-breakpoint
ALTER TABLE "Users" ALTER COLUMN "updated_at" SET DEFAULT now();

File diff suppressed because it is too large Load diff

View file

@ -372,6 +372,13 @@
"when": 1755732000165,
"tag": "0052_complete_hellfire_club",
"breakpoints": true
},
{
"idx": 53,
"version": "7",
"when": 1765422160004,
"tag": "0053_lively_hellfire_club",
"breakpoints": true
}
]
}

View file

@ -28,13 +28,12 @@ import {
import type { z } from "zod";
const createdAt = () =>
// TODO: Change mode to Date
timestamp("created_at", { precision: 3, mode: "string" })
timestamp("created_at", { precision: 3, mode: "date", withTimezone: true })
.defaultNow()
.notNull();
const updatedAt = () =>
timestamp("updated_at", { precision: 3, mode: "string" })
timestamp("updated_at", { precision: 3, mode: "date", withTimezone: true })
.defaultNow()
.notNull();
@ -47,7 +46,8 @@ export const Challenges = pgTable("Challenges", {
challenge: jsonb("challenge").notNull().$type<Challenge>(),
expiresAt: timestamp("expires_at", {
precision: 3,
mode: "string",
mode: "date",
withTimezone: true,
})
.default(
// 5 minutes
@ -191,7 +191,11 @@ export const Filters = pgTable("Filters", {
>(),
title: text("title").notNull(),
filterAction: text("filter_action").notNull().$type<"warn" | "hide">(),
expireAt: timestamp("expires_at", { precision: 3, mode: "string" }),
expireAt: timestamp("expires_at", {
precision: 3,
mode: "date",
withTimezone: true,
}),
createdAt: createdAt(),
});
@ -330,7 +334,11 @@ export const Tokens = pgTable("Tokens", {
id: id(),
scopes: text("scopes").array().notNull().default(sql`ARRAY[]::text[]`),
accessToken: text("access_token").notNull(),
expiresAt: timestamp("expires_at", { precision: 3, mode: "string" }),
expiresAt: timestamp("expires_at", {
precision: 3,
mode: "date",
withTimezone: true,
}),
createdAt: createdAt(),
userId: uuid("userId")
.references(() => Users.id, {
@ -363,7 +371,8 @@ export const AuthorizationCodes = pgTable("AuthorizationCodes", {
redirectUri: text("redirect_uri"),
expiresAt: timestamp("expires_at", {
precision: 3,
mode: "string",
mode: "date",
withTimezone: true,
}).notNull(),
createdAt: createdAt(),
codeChallenge: text("code_challenge"),