Skip to content

Commit f53a471

Browse files
authored
feat: vanish optimization (#446)
1 parent f7869b0 commit f53a471

20 files changed

Lines changed: 184 additions & 160 deletions
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
exports.up = async function (knex) {
2+
await knex.schema.alterTable('users', (table) => {
3+
table.boolean('is_vanished').notNullable().defaultTo(false)
4+
})
5+
6+
await knex.raw(`
7+
UPDATE users u
8+
SET is_vanished = true
9+
WHERE EXISTS (
10+
SELECT 1 FROM events e
11+
WHERE e.event_pubkey = u.pubkey
12+
AND e.event_kind = 62
13+
AND e.deleted_at IS NULL
14+
)
15+
`)
16+
}
17+
18+
exports.down = function (knex) {
19+
return knex.schema.alterTable('users', (table) => {
20+
table.dropColumn('is_vanished')
21+
})
22+
}

package-lock.json

Lines changed: 23 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/@types/repositories.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ export interface IUserRepository {
6363
findByPubkey(pubkey: Pubkey, client?: DatabaseClient): Promise<User | undefined>
6464
upsert(user: Partial<User>, client?: DatabaseClient): Promise<number>
6565
getBalanceByPubkey(pubkey: Pubkey, client?: DatabaseClient): Promise<bigint>
66+
isVanished(pubkey: Pubkey, client?: DatabaseClient): Promise<boolean>
67+
setVanished(pubkey: Pubkey, vanished: boolean, client?: DatabaseClient): Promise<number>
6668
admitUser(pubkey: Pubkey, admittedAt: Date, client?: DatabaseClient): Promise<void>
6769
}
6870

src/@types/user.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Pubkey } from './base'
33
export interface User {
44
pubkey: Pubkey
55
isAdmitted: boolean
6+
isVanished: boolean
67
balance: bigint
78
tosAcceptedAt?: Date | null
89
createdAt: Date
@@ -12,6 +13,7 @@ export interface User {
1213
export interface DBUser {
1314
pubkey: Buffer
1415
is_admitted: boolean
16+
is_vanished: boolean
1517
balance: bigint
1618
created_at: Date
1719
updated_at: Date

src/factories/controllers/get-admission-check-controller-factory.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
import { getMasterDbClient, getReadReplicaDbClient } from '../../database/client'
12
import { createSettings } from '../settings-factory'
2-
import { getMasterDbClient } from '../../database/client'
3+
import { EventRepository } from '../../repositories/event-repository'
34
import { GetSubmissionCheckController } from '../../controllers/admission/get-admission-check-controller'
45
import { slidingWindowRateLimiterFactory } from '../rate-limiter-factory'
56
import { UserRepository } from '../../repositories/user-repository'
67

78
export const createGetAdmissionCheckController = () => {
89
const dbClient = getMasterDbClient()
9-
const userRepository = new UserRepository(dbClient)
10+
const readReplicaDbClient = getReadReplicaDbClient()
11+
const eventRepository = new EventRepository(dbClient, readReplicaDbClient)
12+
const userRepository = new UserRepository(dbClient, eventRepository)
1013

1114
return new GetSubmissionCheckController(
1215
userRepository,

src/factories/controllers/post-invoice-controller-factory.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1+
import { getMasterDbClient, getReadReplicaDbClient } from '../../database/client'
12
import { createPaymentsService } from '../payments-service-factory'
23
import { createSettings } from '../settings-factory'
3-
import { getMasterDbClient } from '../../database/client'
4+
import { EventRepository } from '../../repositories/event-repository'
45
import { IController } from '../../@types/controllers'
56
import { PostInvoiceController } from '../../controllers/invoices/post-invoice-controller'
67
import { slidingWindowRateLimiterFactory } from '../rate-limiter-factory'
78
import { UserRepository } from '../../repositories/user-repository'
89

910
export const createPostInvoiceController = (): IController => {
1011
const dbClient = getMasterDbClient()
11-
const userRepository = new UserRepository(dbClient)
12+
const readReplicaDbClient = getReadReplicaDbClient()
13+
const eventRepository = new EventRepository(dbClient, readReplicaDbClient)
14+
const userRepository = new UserRepository(dbClient, eventRepository)
1215
const paymentsService = createPaymentsService()
1316

1417
return new PostInvoiceController(

src/factories/event-strategy-factory.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
import { IEventRepository, IUserRepository } from '../@types/repositories'
12
import { isDeleteEvent, isEphemeralEvent, isGiftWrapEvent, isParameterizedReplaceableEvent, isReplaceableEvent, isRequestToVanishEvent } from '../utils/event'
23
import { DefaultEventStrategy } from '../handlers/event-strategies/default-event-strategy'
34
import { DeleteEventStrategy } from '../handlers/event-strategies/delete-event-strategy'
45
import { EphemeralEventStrategy } from '../handlers/event-strategies/ephemeral-event-strategy'
56
import { Event } from '../@types/event'
67
import { Factory } from '../@types/base'
78
import { GiftWrapEventStrategy } from '../handlers/event-strategies/gift-wrap-event-strategy'
8-
import { IEventRepository } from '../@types/repositories'
99
import { IEventStrategy } from '../@types/message-handlers'
1010
import { IWebSocketAdapter } from '../@types/adapters'
1111
import { ParameterizedReplaceableEventStrategy } from '../handlers/event-strategies/parameterized-replaceable-event-strategy'
@@ -14,10 +14,11 @@ import { VanishEventStrategy } from '../handlers/event-strategies/vanish-event-s
1414

1515
export const eventStrategyFactory = (
1616
eventRepository: IEventRepository,
17+
userRepository: IUserRepository,
1718
): Factory<IEventStrategy<Event, Promise<void>>, [Event, IWebSocketAdapter]> =>
1819
([event, adapter]: [Event, IWebSocketAdapter]) => {
1920
if (isRequestToVanishEvent(event)) {
20-
return new VanishEventStrategy(adapter, eventRepository)
21+
return new VanishEventStrategy(adapter, eventRepository, userRepository)
2122
} else if (isGiftWrapEvent(event)) {
2223
return new GiftWrapEventStrategy(adapter, eventRepository)
2324
} else if (isReplaceableEvent(event)) {

src/factories/message-handler-factory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const messageHandlerFactory = (
1818
{
1919
return new EventMessageHandler(
2020
adapter,
21-
eventStrategyFactory(eventRepository),
21+
eventStrategyFactory(eventRepository, userRepository),
2222
eventRepository,
2323
userRepository,
2424
createSettings,

src/factories/payments-service-factory.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ export const createPaymentsService = () => {
1010
const dbClient = getMasterDbClient()
1111
const rrDbClient = getReadReplicaDbClient()
1212
const invoiceRepository = new InvoiceRepository(dbClient)
13-
const userRepository = new UserRepository(dbClient)
14-
const paymentsProcessor = createPaymentsProcessor()
1513
const eventRepository = new EventRepository(dbClient, rrDbClient)
14+
const userRepository = new UserRepository(dbClient, eventRepository)
15+
const paymentsProcessor = createPaymentsProcessor()
1616

1717
return new PaymentsService(
1818
dbClient,

src/factories/static-mirroring.worker-factory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const staticMirroringWorkerFactory = () => {
88
const dbClient = getMasterDbClient()
99
const readReplicaDbClient = getReadReplicaDbClient()
1010
const eventRepository = new EventRepository(dbClient, readReplicaDbClient)
11-
const userRepository = new UserRepository(dbClient)
11+
const userRepository = new UserRepository(dbClient, eventRepository)
1212

1313
return new StaticMirroringWorker(
1414
eventRepository,

0 commit comments

Comments
 (0)