From cc751f03a7fcf3d9d7404b0b221e3742013875da Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 8 Jul 2023 15:04:50 -0500 Subject: [PATCH] Refactor to use nostrDate() and nostrNow() --- src/controllers/api/accounts.ts | 4 ++-- src/controllers/api/oauth.ts | 8 ++++---- src/controllers/api/statuses.ts | 6 +++--- src/transmute.ts | 6 +++--- src/utils.ts | 3 +++ 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/controllers/api/accounts.ts b/src/controllers/api/accounts.ts index d42ebb07..b45e0278 100644 --- a/src/controllers/api/accounts.ts +++ b/src/controllers/api/accounts.ts @@ -4,7 +4,7 @@ import { getAuthor, getFilter, getFollows, publish } from '@/client.ts'; import { parseMetaContent } from '@/schema.ts'; import { signEvent } from '@/sign.ts'; import { toAccount, toStatus } from '@/transmute.ts'; -import { buildLinkHeader, eventDateComparator, lookupAccount, paginationSchema, parseBody } from '@/utils.ts'; +import { buildLinkHeader, eventDateComparator, lookupAccount, nostrNow, paginationSchema, parseBody } from '@/utils.ts'; const createAccountController: AppController = (c) => { return c.json({ error: 'Please log in with Nostr.' }, 405); @@ -162,7 +162,7 @@ const updateCredentialsController: AppController = async (c) => { kind: 0, content: JSON.stringify(meta), tags: [], - created_at: Math.floor(new Date().getTime() / 1000), + created_at: nostrNow(), }, c); publish(event); diff --git a/src/controllers/api/oauth.ts b/src/controllers/api/oauth.ts index c56b27eb..db0597f4 100644 --- a/src/controllers/api/oauth.ts +++ b/src/controllers/api/oauth.ts @@ -1,6 +1,6 @@ import { lodash, nip19, uuid62, z } from '@/deps.ts'; import { AppController } from '@/app.ts'; -import { parseBody } from '@/utils.ts'; +import { nostrNow, parseBody } from '@/utils.ts'; const passwordGrantSchema = z.object({ grant_type: z.literal('password'), @@ -36,21 +36,21 @@ const createTokenController: AppController = async (c) => { access_token: result.data.password, token_type: 'Bearer', scope: 'read write follow push', - created_at: Math.floor(new Date().getTime() / 1000), + created_at: nostrNow(), }); case 'authorization_code': return c.json({ access_token: result.data.code, token_type: 'Bearer', scope: 'read write follow push', - created_at: Math.floor(new Date().getTime() / 1000), + created_at: nostrNow(), }); case 'client_credentials': return c.json({ access_token: '_', token_type: 'Bearer', scope: 'read write follow push', - created_at: Math.floor(new Date().getTime() / 1000), + created_at: nostrNow(), }); } }; diff --git a/src/controllers/api/statuses.ts b/src/controllers/api/statuses.ts index bf920772..abbddb5b 100644 --- a/src/controllers/api/statuses.ts +++ b/src/controllers/api/statuses.ts @@ -4,7 +4,7 @@ import { ISO6391, Kind, z } from '@/deps.ts'; import { type Event } from '@/event.ts'; import { signEvent } from '@/sign.ts'; import { toStatus } from '@/transmute.ts'; -import { parseBody } from '@/utils.ts'; +import { nostrNow, parseBody } from '@/utils.ts'; const createStatusSchema = z.object({ in_reply_to_id: z.string().regex(/[0-9a-f]{64}/).nullish(), @@ -74,7 +74,7 @@ const createStatusController: AppController = async (c) => { kind: Kind.Text, content: data.status ?? '', tags, - created_at: Math.floor(new Date().getTime() / 1000), + created_at: nostrNow(), }, c); publish(event); @@ -115,7 +115,7 @@ const favouriteController: AppController = async (c) => { ['e', target.id], ['p', target.pubkey], ], - created_at: Math.floor(new Date().getTime() / 1000), + created_at: nostrNow(), }, c); publish(event); diff --git a/src/transmute.ts b/src/transmute.ts index d47104be..72d36689 100644 --- a/src/transmute.ts +++ b/src/transmute.ts @@ -6,7 +6,7 @@ import { Conf } from './config.ts'; import { getAuthor } from './client.ts'; import { verifyNip05Cached } from './nip05.ts'; import { getMediaLinks, type MediaLink, parseNoteContent } from './note.ts'; -import { type Nip05, parseNip05 } from './utils.ts'; +import { type Nip05, nostrDate, parseNip05 } from './utils.ts'; import { isCWTag } from 'https://gitlab.com/soapbox-pub/mostr/-/raw/c67064aee5ade5e01597c6d23e22e53c628ef0e2/src/nostr/tags.ts'; const DEFAULT_AVATAR = 'https://gleasonator.com/images/avi.png'; @@ -39,7 +39,7 @@ async function toAccount(event: Event<0>, opts: ToAccountOpts = {}) { avatar: picture || DEFAULT_AVATAR, avatar_static: picture || DEFAULT_AVATAR, bot: false, - created_at: event ? new Date(event.created_at * 1000).toISOString() : new Date().toISOString(), + created_at: event ? nostrDate(event.created_at).toISOString() : new Date().toISOString(), discoverable: true, display_name: name, emojis: toEmojis(event), @@ -126,7 +126,7 @@ async function toStatus(event: Event<1>) { account, card, content, - created_at: new Date(event.created_at * 1000).toISOString(), + created_at: nostrDate(event.created_at).toISOString(), in_reply_to_id: replyTag ? replyTag[1] : null, in_reply_to_account_id: null, sensitive: !!cw, diff --git a/src/utils.ts b/src/utils.ts index 7ca64047..89716af5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -6,6 +6,8 @@ import { lookupNip05Cached } from '@/nip05.ts'; /** Get the current time in Nostr format. */ const nostrNow = () => Math.floor(new Date().getTime() / 1000); +/** Convenience function to convert Nostr dates into native Date objects. */ +const nostrDate = (seconds: number) => new Date(seconds * 1000); /** Pass to sort() to sort events by date. */ const eventDateComparator = (a: Event, b: Event) => b.created_at - a.created_at; @@ -105,6 +107,7 @@ export { eventDateComparator, lookupAccount, type Nip05, + nostrDate, nostrNow, type PaginationParams, paginationSchema,