From 52abff77d44f38b1572582146a45344614bd55a9 Mon Sep 17 00:00:00 2001 From: alphaeusmote <41258468-alphaeusmote@users.noreply.replit.com> Date: Sat, 12 Apr 2025 00:30:17 +0000 Subject: [PATCH] Improve API token management by adding customer access control. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 9111ef36-26c8-4085-84ca-a35dc1fec1b5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7083d608-d6d3-4a6a-9a27-6286c5109627/19261c9e-f1ea-40d4-82c2-25bd04d73b3c.jpg --- server/storage.ts | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/server/storage.ts b/server/storage.ts index 3b2a6d4..6f1d40c 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -264,7 +264,6 @@ export class MemStorage implements IStorage { email: user.email, fullName: user.fullName || null, role: user.role || 'user', - organizationId: user.organizationId || null, createdAt }; this.usersMap.set(numId, newUser); @@ -625,7 +624,47 @@ export class MemStorage implements IStorage { } async deleteApiToken(id: string): Promise { - return this.apiTokensMap.delete(parseInt(id)); + // First, remove all customer access entries for this token + const numId = parseInt(id); + const accessEntries = Array.from(this.apiTokenCustomerAccessMap.values()) + .filter(access => access.tokenId === id); + + for (const access of accessEntries) { + this.apiTokenCustomerAccessMap.delete(parseInt(access.id)); + } + + // Then delete the token itself + return this.apiTokensMap.delete(numId); + } + + // API token customer access management + async getApiTokenCustomerAccess(tokenId: string): Promise { + return Array.from(this.apiTokenCustomerAccessMap.values()) + .filter(access => access.tokenId === tokenId); + } + + async addApiTokenCustomerAccess(access: InsertApiTokenCustomerAccess): Promise { + const numId = this.apiTokenCustomerAccessIdCounter++; + const createdAt = new Date(); + + const newAccess: ApiTokenCustomerAccess = { + id: numId.toString(), + tokenId: access.tokenId, + customerId: access.customerId, + createdAt + }; + + this.apiTokenCustomerAccessMap.set(numId, newAccess); + return newAccess; + } + + async removeApiTokenCustomerAccess(tokenId: string, customerId: string): Promise { + const access = Array.from(this.apiTokenCustomerAccessMap.values()) + .find(a => a.tokenId === tokenId && a.customerId === customerId); + + if (!access) return false; + + return this.apiTokenCustomerAccessMap.delete(parseInt(access.id)); } // DNS History