better-auth
Version:
The most comprehensive authentication framework for TypeScript.
1 lines • 5.51 kB
Source Map (JSON)
{"version":3,"file":"delete-api-key.mjs","names":["deleteApiKey","apiKey: ApiKey | null","deleteApiKeyFromStorage","error: any"],"sources":["../../../../src/plugins/api-key/routes/delete-api-key.ts"],"sourcesContent":["import type { AuthContext } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport * as z from \"zod\";\nimport { APIError, sessionMiddleware } from \"../../../api\";\nimport { API_KEY_TABLE_NAME, ERROR_CODES } from \"..\";\nimport {\n\tdeleteApiKey as deleteApiKeyFromStorage,\n\tgetApiKeyById,\n} from \"../adapter\";\nimport type { apiKeySchema } from \"../schema\";\nimport type { ApiKey } from \"../types\";\nimport type { PredefinedApiKeyOptions } from \".\";\n\nconst deleteApiKeyBodySchema = z.object({\n\tkeyId: z.string().meta({\n\t\tdescription: \"The id of the Api Key\",\n\t}),\n});\n\nexport function deleteApiKey({\n\topts,\n\tschema,\n\tdeleteAllExpiredApiKeys,\n}: {\n\topts: PredefinedApiKeyOptions;\n\tschema: ReturnType<typeof apiKeySchema>;\n\tdeleteAllExpiredApiKeys(\n\t\tctx: AuthContext,\n\t\tbyPassLastCheckTime?: boolean | undefined,\n\t): void;\n}) {\n\treturn createAuthEndpoint(\n\t\t\"/api-key/delete\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: deleteApiKeyBodySchema,\n\t\t\tuse: [sessionMiddleware],\n\t\t\tmetadata: {\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Delete an existing API key\",\n\t\t\t\t\trequestBody: {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\tkeyId: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\tdescription: \"The id of the API key to delete\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\trequired: [\"keyId\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"API key deleted successfully\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tsuccess: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"Indicates if the API key was successfully deleted\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"success\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst { keyId } = ctx.body;\n\t\t\tconst session = ctx.context.session;\n\t\t\tif (session.user.banned === true) {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage: ERROR_CODES.USER_BANNED,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet apiKey: ApiKey | null = null;\n\n\t\t\tapiKey = await getApiKeyById(ctx, keyId, opts);\n\n\t\t\tif (!apiKey || apiKey.userId !== session.user.id) {\n\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\tmessage: ERROR_CODES.KEY_NOT_FOUND,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tif (opts.storage === \"secondary-storage\" && opts.fallbackToDatabase) {\n\t\t\t\t\tawait deleteApiKeyFromStorage(ctx, apiKey, opts);\n\t\t\t\t\tawait ctx.context.adapter.delete<ApiKey>({\n\t\t\t\t\t\tmodel: API_KEY_TABLE_NAME,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\tvalue: apiKey.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t} else if (opts.storage === \"database\") {\n\t\t\t\t\tawait ctx.context.adapter.delete<ApiKey>({\n\t\t\t\t\t\tmodel: API_KEY_TABLE_NAME,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\tvalue: apiKey.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tawait deleteApiKeyFromStorage(ctx, apiKey, opts);\n\t\t\t\t}\n\t\t\t} catch (error: any) {\n\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\tmessage: error?.message,\n\t\t\t\t});\n\t\t\t}\n\t\t\tdeleteAllExpiredApiKeys(ctx.context);\n\t\t\treturn ctx.json({\n\t\t\t\tsuccess: true,\n\t\t\t});\n\t\t},\n\t);\n}\n"],"mappings":";;;;;;;;AAaA,MAAM,yBAAyB,EAAE,OAAO,EACvC,OAAO,EAAE,QAAQ,CAAC,KAAK,EACtB,aAAa,yBACb,CAAC,EACF,CAAC;AAEF,SAAgBA,eAAa,EAC5B,MACA,QACA,2BAQE;AACF,QAAO,mBACN,mBACA;EACC,QAAQ;EACR,MAAM;EACN,KAAK,CAAC,kBAAkB;EACxB,UAAU,EACT,SAAS;GACR,aAAa;GACb,aAAa,EACZ,SAAS,EACR,oBAAoB,EACnB,QAAQ;IACP,MAAM;IACN,YAAY,EACX,OAAO;KACN,MAAM;KACN,aAAa;KACb,EACD;IACD,UAAU,CAAC,QAAQ;IACnB,EACD,EACD,EACD;GACD,WAAW,EACV,OAAO;IACN,aAAa;IACb,SAAS,EACR,oBAAoB,EACnB,QAAQ;KACP,MAAM;KACN,YAAY,EACX,SAAS;MACR,MAAM;MACN,aACC;MACD,EACD;KACD,UAAU,CAAC,UAAU;KACrB,EACD,EACD;IACD,EACD;GACD,EACD;EACD,EACD,OAAO,QAAQ;EACd,MAAM,EAAE,UAAU,IAAI;EACtB,MAAM,UAAU,IAAI,QAAQ;AAC5B,MAAI,QAAQ,KAAK,WAAW,KAC3B,OAAM,IAAI,SAAS,gBAAgB,EAClC,SAAS,YAAY,aACrB,CAAC;EAGH,IAAIC,SAAwB;AAE5B,WAAS,MAAM,cAAc,KAAK,OAAO,KAAK;AAE9C,MAAI,CAAC,UAAU,OAAO,WAAW,QAAQ,KAAK,GAC7C,OAAM,IAAI,SAAS,aAAa,EAC/B,SAAS,YAAY,eACrB,CAAC;AAGH,MAAI;AACH,OAAI,KAAK,YAAY,uBAAuB,KAAK,oBAAoB;AACpE,UAAMC,aAAwB,KAAK,QAAQ,KAAK;AAChD,UAAM,IAAI,QAAQ,QAAQ,OAAe;KACxC,OAAO;KACP,OAAO,CACN;MACC,OAAO;MACP,OAAO,OAAO;MACd,CACD;KACD,CAAC;cACQ,KAAK,YAAY,WAC3B,OAAM,IAAI,QAAQ,QAAQ,OAAe;IACxC,OAAO;IACP,OAAO,CACN;KACC,OAAO;KACP,OAAO,OAAO;KACd,CACD;IACD,CAAC;OAEF,OAAMA,aAAwB,KAAK,QAAQ,KAAK;WAEzCC,OAAY;AACpB,SAAM,IAAI,SAAS,yBAAyB,EAC3C,SAAS,OAAO,SAChB,CAAC;;AAEH,0BAAwB,IAAI,QAAQ;AACpC,SAAO,IAAI,KAAK,EACf,SAAS,MACT,CAAC;GAEH"}