Add list/delete api key resolver

This commit is contained in:
Hongbo Wu 2022-05-27 13:01:20 +08:00
parent fd4fc8a4e7
commit 0f2a55d274
3 changed files with 92 additions and 1 deletions

View file

@ -1,7 +1,14 @@
import {
ApiKeysError,
ApiKeysErrorCode,
ApiKeysSuccess,
DeleteApiKeyError,
DeleteApiKeyErrorCode,
DeleteApiKeySuccess,
GenerateApiKeyError,
GenerateApiKeyErrorCode,
GenerateApiKeySuccess,
MutationDeleteApiKeyArgs,
MutationGenerateApiKeyArgs,
} from '../../generated/graphql'
import { analytics } from '../../utils/analytics'
@ -12,6 +19,36 @@ import { User } from '../../entity/user'
import { ApiKey } from '../../entity/api_key'
import { generateApiKey, hashApiKey } from '../../utils/auth'
export const apiKeysResolver = authorized<ApiKeysSuccess, ApiKeysError>(
async (_, __, { claims: { uid }, log }) => {
log.info('apiKeysResolver')
try {
const user = await getRepository(User).findOneBy({ id: uid })
if (!user) {
return {
errorCodes: [ApiKeysErrorCode.Unauthorized],
}
}
const apiKeys = await getRepository(ApiKey).find({
where: { user: { id: uid } },
order: { usedAt: 'DESC', createdAt: 'DESC' },
})
return {
apiKeys,
}
} catch (e) {
log.error(e)
return {
errorCodes: [ApiKeysErrorCode.BadRequest],
}
}
}
)
export const generateApiKeyResolver = authorized<
GenerateApiKeySuccess,
GenerateApiKeyError,
@ -62,3 +99,49 @@ export const generateApiKeyResolver = authorized<
return { errorCodes: [GenerateApiKeyErrorCode.BadRequest] }
}
})
export const deleteApiKeyResolver = authorized<
DeleteApiKeySuccess,
DeleteApiKeyError,
MutationDeleteApiKeyArgs
>(async (_, { id }, { claims: { uid }, log }) => {
log.info('deleteApiKeyResolver')
try {
const user = await getRepository(User).findOneBy({ id: uid })
if (!user) {
return {
errorCodes: [DeleteApiKeyErrorCode.Unauthorized],
}
}
const apiKey = await getRepository(ApiKey).findOne({
where: { id },
relations: ['user'],
})
if (!apiKey) {
return {
errorCodes: [DeleteApiKeyErrorCode.NotFound],
}
}
if (apiKey.user.id !== uid) {
return {
errorCodes: [DeleteApiKeyErrorCode.Unauthorized],
}
}
const deletedApiKey = await getRepository(ApiKey).remove(apiKey)
deletedApiKey.id = id
return {
apiKey: deletedApiKey,
}
} catch (e) {
log.error(e)
return {
errorCodes: [DeleteApiKeyErrorCode.BadRequest],
}
}
})

View file

@ -21,6 +21,8 @@ import {
} from './../generated/graphql'
import {
addPopularReadResolver,
apiKeysResolver,
articleSavingRequestResolver,
createArticleResolver,
createArticleSavingRequestResolver,
@ -28,11 +30,13 @@ import {
createLabelResolver,
createNewsletterEmailResolver,
createReminderResolver,
deleteApiKeyResolver,
deleteHighlightResolver,
deleteLabelResolver,
deleteNewsletterEmailResolver,
deleteReminderResolver,
deleteWebhookResolver,
generateApiKeyResolver,
getAllUsersResolver,
getArticleResolver,
getArticlesResolver,
@ -90,7 +94,6 @@ import {
generateUploadFilePathName,
} from '../utils/uploads'
import { getPageByParam } from '../elastic/pages'
import { generateApiKeyResolver } from './api_key'
/* eslint-disable @typescript-eslint/naming-convention */
type ResultResolveType = {
@ -157,6 +160,7 @@ export const functionResolvers = {
addPopularRead: addPopularReadResolver,
setWebhook: setWebhookResolver,
deleteWebhook: deleteWebhookResolver,
deleteApiKey: deleteApiKeyResolver,
},
Query: {
me: getMeUserResolver,
@ -178,6 +182,7 @@ export const functionResolvers = {
subscriptions: subscriptionsResolver,
webhooks: webhooksResolver,
webhook: webhookResolver,
apiKeys: apiKeysResolver,
},
User: {
async sharedArticles(
@ -575,4 +580,6 @@ export const functionResolvers = {
...resultResolveTypeResolver('Webhooks'),
...resultResolveTypeResolver('DeleteWebhook'),
...resultResolveTypeResolver('Webhook'),
...resultResolveTypeResolver('ApiKeys'),
...resultResolveTypeResolver('DeleteApiKey'),
}

View file

@ -18,3 +18,4 @@ export * from './subscriptions'
export * from './update'
export * from './popular_reads'
export * from './webhooks'
export * from './api_key'