diff --git a/__tests__/examples/data-sources/how-to-create-a-mutation.ts b/__tests__/examples/data-sources/how-to-create-a-mutation.ts index 178fbd2d0..06e0a06af 100644 --- a/__tests__/examples/data-sources/how-to-create-a-mutation.ts +++ b/__tests__/examples/data-sources/how-to-create-a-mutation.ts @@ -102,6 +102,8 @@ describe('How to create a mutation in a data source: update the content of an ar // the right values. return (await res.json()) as unknown }, + + type: 'ExampleMutation', }), }, } diff --git a/__tests__/examples/data-sources/how-to-create-a-query.ts b/__tests__/examples/data-sources/how-to-create-a-query.ts index 413610d82..cd68be175 100644 --- a/__tests__/examples/data-sources/how-to-create-a-query.ts +++ b/__tests__/examples/data-sources/how-to-create-a-query.ts @@ -111,6 +111,9 @@ describe('How to create a query in a data source: Fetching the content of an art // Add an example payload which is used in tests examplePayload: { id: 1 }, + + // Add a name for sentry logs + type: 'ExampleQuery', }, // In the actual code you will pass the `environment` variable here createTestEnvironment(), diff --git a/__tests__/internals/sentry.ts b/__tests__/internals/sentry.ts index f6639a930..bd546a229 100644 --- a/__tests__/internals/sentry.ts +++ b/__tests__/internals/sentry.ts @@ -29,6 +29,8 @@ test('invalid values from data sources are reported', async () => { errorContext: { invalidCurrentValue: invalidValue, key: 'de.serlo.org/api/uuid/42', + type: 'UuidQuery', + payload: { id: 42 }, }, }) }) diff --git a/packages/server/src/internals/data-source-helper/common.ts b/packages/server/src/internals/data-source-helper/common.ts index 8a260bd34..d2d929d45 100644 --- a/packages/server/src/internals/data-source-helper/common.ts +++ b/packages/server/src/internals/data-source-helper/common.ts @@ -8,6 +8,8 @@ export class InvalidCurrentValueError extends Error { invalidCurrentValue: unknown decoder: string validationErrors: string[] + type?: string + payload: unknown key?: string }, ) { diff --git a/packages/server/src/internals/data-source-helper/mutation.ts b/packages/server/src/internals/data-source-helper/mutation.ts index 3032c7a48..18150d017 100644 --- a/packages/server/src/internals/data-source-helper/mutation.ts +++ b/packages/server/src/internals/data-source-helper/mutation.ts @@ -23,6 +23,8 @@ export function createMutation(spec: MutationSpec): Mutation { invalidCurrentValue: result, decoder: spec.decoder.name, validationErrors: reporter.report(decodedResult), + type: spec.type, + payload, }) } } @@ -54,6 +56,8 @@ interface MutationSpec { * executed and the result of the mutation matches the decoder. */ updateCache?: (payload: Payload, newValue: Result) => AsyncOrSync + + type: string } /** diff --git a/packages/server/src/internals/data-source-helper/query.ts b/packages/server/src/internals/data-source-helper/query.ts index 32382ba3b..6407edff4 100644 --- a/packages/server/src/internals/data-source-helper/query.ts +++ b/packages/server/src/internals/data-source-helper/query.ts @@ -67,6 +67,8 @@ export function createQuery( invalidCurrentValue: value, decoder: decoder.name, validationErrors: reporter.report(decoded), + payload, + type: spec.type, key, }) } @@ -164,6 +166,8 @@ export interface QuerySpec { getPayload: (key: string) => O.Option examplePayload: Payload + + type: string } /** diff --git a/packages/server/src/internals/data-source-helper/request.ts b/packages/server/src/internals/data-source-helper/request.ts index 73bd69051..ae39fd933 100644 --- a/packages/server/src/internals/data-source-helper/request.ts +++ b/packages/server/src/internals/data-source-helper/request.ts @@ -18,6 +18,8 @@ interface RequestSpec { * Function which does the actual query operation. */ getCurrentValue: (payload: Payload) => Promise + + type: string } /** @@ -46,6 +48,8 @@ export function createRequest(spec: RequestSpec): Request { throw new InvalidCurrentValueError({ invalidCurrentValue: result, decoder: spec.decoder.name, + payload, + type: spec.type, validationErrors: reporter.report(decodedResult), }) } diff --git a/packages/server/src/internals/server/kratos-middleware.ts b/packages/server/src/internals/server/kratos-middleware.ts index 7b49b6b0b..45a0360d8 100644 --- a/packages/server/src/internals/server/kratos-middleware.ts +++ b/packages/server/src/internals/server/kratos-middleware.ts @@ -13,6 +13,7 @@ import { DatabaseLayer } from '~/model' const basePath = '/kratos' const createLegacyUser = createRequest({ + type: 'UserCreateMutation', decoder: DatabaseLayer.getDecoderFor('UserCreateMutation'), async getCurrentValue(payload: DatabaseLayer.Payload<'UserCreateMutation'>) { return DatabaseLayer.makeRequest('UserCreateMutation', payload) diff --git a/packages/server/src/model/chat.ts b/packages/server/src/model/chat.ts index b9913e0e2..b9db7d854 100644 --- a/packages/server/src/model/chat.ts +++ b/packages/server/src/model/chat.ts @@ -8,6 +8,7 @@ import { Environment } from '~/internals/environment' export function createChatModel({ environment }: { environment: Environment }) { const getUsersInfo = createQuery( { + type: 'community.serlo.org/get-users-info', decoder: t.strict({ success: t.boolean }), enableSwr: true, staleAfter: { minutes: 30 }, @@ -33,6 +34,7 @@ export function createChatModel({ environment }: { environment: Environment }) { ) const deleteUser = createMutation({ + type: 'community.serlo.org/delete-user', decoder: t.union([ t.strict({ success: t.literal(true) }), t.strict({ success: t.literal(false), errorType: t.string }), diff --git a/packages/server/src/model/google-spreadsheet-api.ts b/packages/server/src/model/google-spreadsheet-api.ts index f19ab8be7..df44ed92e 100644 --- a/packages/server/src/model/google-spreadsheet-api.ts +++ b/packages/server/src/model/google-spreadsheet-api.ts @@ -43,6 +43,7 @@ export function createGoogleSpreadsheetApiModel({ }) { const getValues = createQuery>( { + type: 'google-spreadsheets-api', enableSwr: true, getCurrentValue: async (args) => { const { spreadsheetId, range } = args diff --git a/packages/server/src/model/kratos.ts b/packages/server/src/model/kratos.ts index acc22dc0b..8eea5cfd8 100644 --- a/packages/server/src/model/kratos.ts +++ b/packages/server/src/model/kratos.ts @@ -14,6 +14,7 @@ export function createKratosModel({ }) { const getUserLanguage = createQuery( { + type: 'kratos.serlo.org/get-user-language', decoder: t.union([InstanceDecoder, t.null]), enableSwr: true, staleAfter: { days: 30 }, @@ -49,6 +50,7 @@ export function createKratosModel({ const getLastLogin = createQuery( { + type: 'kratos.serlo.org/get-last-login', decoder: t.union([t.string, t.null]), enableSwr: true, staleAfter: { days: 1 }, diff --git a/packages/server/src/model/mailchimp.ts b/packages/server/src/model/mailchimp.ts index 124b672fd..b5d3c2284 100644 --- a/packages/server/src/model/mailchimp.ts +++ b/packages/server/src/model/mailchimp.ts @@ -4,6 +4,7 @@ import { createMutation } from '~/internals/data-source-helper' export function createMailchimpModel() { const deleteEmailPermanently = createMutation({ + type: 'mailchimp/delete-user', decoder: t.union([ t.strict({ success: t.literal(true) }), t.strict({ success: t.literal(false), mailchimpResponse: t.unknown }), diff --git a/packages/server/src/model/serlo.ts b/packages/server/src/model/serlo.ts index fb35713a2..35bb95007 100644 --- a/packages/server/src/model/serlo.ts +++ b/packages/server/src/model/serlo.ts @@ -33,6 +33,7 @@ export function createSerloModel({ }) { const getUuid = createQuery( { + type: 'UuidQuery', decoder: DatabaseLayer.getDecoderFor('UuidQuery'), enableSwr: true, getCurrentValue: async (payload: DatabaseLayer.Payload<'UuidQuery'>) => { @@ -60,6 +61,7 @@ export function createSerloModel({ } const setUuidState = createMutation({ + type: 'UuidSetStateMutation', decoder: DatabaseLayer.getDecoderFor('UuidSetStateMutation'), mutate(payload: DatabaseLayer.Payload<'UuidSetStateMutation'>) { return DatabaseLayer.makeRequest('UuidSetStateMutation', payload) @@ -81,6 +83,7 @@ export function createSerloModel({ const getActiveAuthorIds = createQuery( { + type: 'ActiveAuthorsQuery', decoder: DatabaseLayer.getDecoderFor('ActiveAuthorsQuery'), enableSwr: true, getCurrentValue() { @@ -101,6 +104,7 @@ export function createSerloModel({ const getActiveReviewerIds = createQuery( { + type: 'ActiveReviewersQuery', decoder: DatabaseLayer.getDecoderFor('ActiveReviewersQuery'), enableSwr: true, getCurrentValue() { @@ -121,6 +125,7 @@ export function createSerloModel({ const getActivityByType = createQuery( { + type: 'ActivityByTypeQuery', decoder: DatabaseLayer.getDecoderFor('ActivityByTypeQuery'), enableSwr: true, getCurrentValue: ( @@ -147,6 +152,7 @@ export function createSerloModel({ ) const getPotentialSpamUsers = createRequest({ + type: 'UserPotentialSpamUsersQuery', decoder: DatabaseLayer.getDecoderFor('UserPotentialSpamUsersQuery'), getCurrentValue( payload: DatabaseLayer.Payload<'UserPotentialSpamUsersQuery'>, @@ -156,6 +162,7 @@ export function createSerloModel({ }) const deleteBots = createMutation({ + type: 'UserDeleteBotsMutation', decoder: DatabaseLayer.getDecoderFor('UserDeleteBotsMutation'), mutate(payload: DatabaseLayer.Payload<'UserDeleteBotsMutation'>) { return DatabaseLayer.makeRequest('UserDeleteBotsMutation', payload) @@ -170,6 +177,7 @@ export function createSerloModel({ }) const deleteRegularUsers = createMutation({ + type: 'UserDeleteRegularUsersMutation', decoder: DatabaseLayer.getDecoderFor('UserDeleteRegularUsersMutation'), mutate: ( payload: DatabaseLayer.Payload<'UserDeleteRegularUsersMutation'>, @@ -187,6 +195,7 @@ export function createSerloModel({ }) const setDescription = createMutation({ + type: 'UserSetDescriptionMutation', decoder: DatabaseLayer.getDecoderFor('UserSetDescriptionMutation'), mutate: (payload: DatabaseLayer.Payload<'UserSetDescriptionMutation'>) => { return DatabaseLayer.makeRequest('UserSetDescriptionMutation', payload) @@ -206,6 +215,7 @@ export function createSerloModel({ }) const setEmail = createMutation({ + type: 'UserSetEmailMutation', decoder: DatabaseLayer.getDecoderFor('UserSetEmailMutation'), mutate(payload: DatabaseLayer.Payload<'UserSetEmailMutation'>) { return DatabaseLayer.makeRequest('UserSetEmailMutation', payload) @@ -214,6 +224,7 @@ export function createSerloModel({ const getAlias = createQuery( { + type: 'AliasQuery', decoder: DatabaseLayer.getDecoderFor('AliasQuery'), getCurrentValue: ({ path, @@ -244,6 +255,7 @@ export function createSerloModel({ const getSubjects = createQuery( { + type: 'SubjectsQuery', decoder: DatabaseLayer.getDecoderFor('SubjectsQuery'), getCurrentValue: () => { return DatabaseLayer.makeRequest('SubjectsQuery', {}) @@ -261,6 +273,7 @@ export function createSerloModel({ const getUnrevisedEntities = createQuery( { + type: 'UnrevisedEntitiesQuery', decoder: DatabaseLayer.getDecoderFor('UnrevisedEntitiesQuery'), getCurrentValue: () => { return DatabaseLayer.makeRequest('UnrevisedEntitiesQuery', {}) @@ -278,6 +291,7 @@ export function createSerloModel({ ) const getUnrevisedEntitiesPerSubject = createRequest({ + type: 'getUnrevisedEntitiesPerSubject', decoder: t.record(t.string, t.union([t.array(t.number), t.null])), async getCurrentValue(_payload: undefined) { const { unrevisedEntityIds } = await getUnrevisedEntities() @@ -300,6 +314,7 @@ export function createSerloModel({ const getNotificationEvent = createQuery( { + type: 'EventQuery', decoder: DatabaseLayer.getDecoderFor('EventQuery'), async getCurrentValue(payload: DatabaseLayer.Payload<'EventQuery'>) { const event = await DatabaseLayer.makeRequest('EventQuery', payload) @@ -323,6 +338,7 @@ export function createSerloModel({ ) const getEventsAfter = createRequest({ + type: 'getEventsAfter', decoder: DatabaseLayer.getDecoderFor('EventsQuery'), async getCurrentValue( payload: DatabaseLayer.Payload<'EventsQuery'> & { after: number }, @@ -333,6 +349,7 @@ export function createSerloModel({ const getEvents = createQuery( { + type: 'EventsQuery', decoder: DatabaseLayer.getDecoderFor('EventsQuery'), async getCurrentValue(payload: DatabaseLayer.Payload<'EventsQuery'>) { return DatabaseLayer.makeRequest('EventsQuery', payload) @@ -364,6 +381,7 @@ export function createSerloModel({ const getNotifications = createQuery( { + type: 'NotificationsQuery', decoder: DatabaseLayer.getDecoderFor('NotificationsQuery'), getCurrentValue(payload: DatabaseLayer.Payload<'NotificationsQuery'>) { return DatabaseLayer.makeRequest('NotificationsQuery', payload) @@ -386,6 +404,7 @@ export function createSerloModel({ ) const setNotificationState = createMutation({ + type: 'NotificationSetStateMutation', decoder: DatabaseLayer.getDecoderFor('NotificationSetStateMutation'), mutate(payload: DatabaseLayer.Payload<'NotificationSetStateMutation'>) { return DatabaseLayer.makeRequest('NotificationSetStateMutation', payload) @@ -409,6 +428,7 @@ export function createSerloModel({ const getSubscriptions = createQuery( { + type: 'SubjectsQuery', decoder: DatabaseLayer.getDecoderFor('SubscriptionsQuery'), enableSwr: true, getCurrentValue: ( @@ -432,6 +452,7 @@ export function createSerloModel({ ) const setSubscription = createMutation({ + type: 'SubscriptionSetMutation', decoder: DatabaseLayer.getDecoderFor('SubscriptionSetMutation'), async mutate(payload: DatabaseLayer.Payload<'SubscriptionSetMutation'>) { await DatabaseLayer.makeRequest('SubscriptionSetMutation', payload) @@ -464,6 +485,7 @@ export function createSerloModel({ }) const getAllThreads = createRequest({ + type: 'AllThreadsQuery', decoder: DatabaseLayer.getDecoderFor('AllThreadsQuery'), async getCurrentValue(payload: DatabaseLayer.Payload<'AllThreadsQuery'>) { return DatabaseLayer.makeRequest('AllThreadsQuery', payload) @@ -472,6 +494,7 @@ export function createSerloModel({ const getThreadIds = createQuery( { + type: 'ThreadsQuery', decoder: DatabaseLayer.getDecoderFor('ThreadsQuery'), async getCurrentValue(payload: DatabaseLayer.Payload<'ThreadsQuery'>) { return DatabaseLayer.makeRequest('ThreadsQuery', payload) @@ -493,6 +516,7 @@ export function createSerloModel({ ) const createThread = createMutation({ + type: 'ThreadCreateThreadMutation', decoder: DatabaseLayer.getDecoderFor('ThreadCreateThreadMutation'), async mutate(payload: DatabaseLayer.Payload<'ThreadCreateThreadMutation'>) { return DatabaseLayer.makeRequest('ThreadCreateThreadMutation', payload) @@ -516,6 +540,7 @@ export function createSerloModel({ }) const createComment = createMutation({ + type: 'ThreadCreateCommentMutation', decoder: DatabaseLayer.getDecoderFor('ThreadCreateCommentMutation'), async mutate( payload: DatabaseLayer.Payload<'ThreadCreateCommentMutation'>, @@ -542,6 +567,7 @@ export function createSerloModel({ }) const editComment = createMutation({ + type: 'ThreadEditCommentMutation', decoder: DatabaseLayer.getDecoderFor('ThreadEditCommentMutation'), async mutate(payload: DatabaseLayer.Payload<'ThreadEditCommentMutation'>) { return DatabaseLayer.makeRequest('ThreadEditCommentMutation', payload) @@ -566,6 +592,7 @@ export function createSerloModel({ }) const archiveThread = createMutation({ + type: 'ThreadSetThreadArchivedMutation', decoder: DatabaseLayer.getDecoderFor('ThreadSetThreadArchivedMutation'), async mutate( payload: DatabaseLayer.Payload<'ThreadSetThreadArchivedMutation'>, @@ -593,6 +620,7 @@ export function createSerloModel({ }) const setThreadStatus = createMutation({ + type: 'ThreadSetThreadStatusMutation', decoder: DatabaseLayer.getDecoderFor('ThreadSetThreadStatusMutation'), async mutate( payload: DatabaseLayer.Payload<'ThreadSetThreadStatusMutation'>, @@ -614,6 +642,7 @@ export function createSerloModel({ }) const createEntity = createMutation({ + type: 'EntityCreateMutation', decoder: DatabaseLayer.getDecoderFor('EntityCreateMutation'), mutate: (payload: DatabaseLayer.Payload<'EntityCreateMutation'>) => { return DatabaseLayer.makeRequest('EntityCreateMutation', payload) @@ -657,6 +686,7 @@ export function createSerloModel({ }) const addEntityRevision = createMutation({ + type: 'EntityAddRevisionMutation', decoder: DatabaseLayer.getDecoderFor('EntityAddRevisionMutation'), mutate: (payload: DatabaseLayer.Payload<'EntityAddRevisionMutation'>) => { return DatabaseLayer.makeRequest('EntityAddRevisionMutation', payload) @@ -718,6 +748,7 @@ export function createSerloModel({ }) const checkoutEntityRevision = createMutation({ + type: 'EntityCheckoutRevisionMutation', decoder: DatabaseLayer.getDecoderFor('EntityCheckoutRevisionMutation'), async mutate( payload: DatabaseLayer.Payload<'EntityCheckoutRevisionMutation'>, @@ -758,6 +789,7 @@ export function createSerloModel({ }) const createPage = createMutation({ + type: 'PageCreateMutation', decoder: DatabaseLayer.getDecoderFor('PageCreateMutation'), mutate: (payload: DatabaseLayer.Payload<'PageCreateMutation'>) => { return DatabaseLayer.makeRequest('PageCreateMutation', payload) @@ -765,6 +797,7 @@ export function createSerloModel({ }) const addPageRevision = createMutation({ + type: 'PageAddRevisionMutation', decoder: DatabaseLayer.getDecoderFor('PageAddRevisionMutation'), mutate: (payload: DatabaseLayer.Payload<'PageAddRevisionMutation'>) => { return DatabaseLayer.makeRequest('PageAddRevisionMutation', payload) @@ -777,6 +810,7 @@ export function createSerloModel({ }) const checkoutPageRevision = createMutation({ + type: 'PageCheckoutRevisionMutation', decoder: DatabaseLayer.getDecoderFor('PageCheckoutRevisionMutation'), mutate(payload: DatabaseLayer.Payload<'PageCheckoutRevisionMutation'>) { return DatabaseLayer.makeRequest('PageCheckoutRevisionMutation', payload) @@ -810,6 +844,7 @@ export function createSerloModel({ }) const rejectEntityRevision = createMutation({ + type: 'EntityRejectRevisionMutation', decoder: DatabaseLayer.getDecoderFor('EntityRejectRevisionMutation'), mutate(payload: DatabaseLayer.Payload<'EntityRejectRevisionMutation'>) { return DatabaseLayer.makeRequest('EntityRejectRevisionMutation', payload) @@ -829,6 +864,7 @@ export function createSerloModel({ }) const rejectPageRevision = createMutation({ + type: 'PageRejectRevisionMutation', decoder: DatabaseLayer.getDecoderFor('PageRejectRevisionMutation'), mutate(payload: DatabaseLayer.Payload<'PageRejectRevisionMutation'>) { return DatabaseLayer.makeRequest('PageRejectRevisionMutation', payload) @@ -846,6 +882,7 @@ export function createSerloModel({ }) const getDeletedEntities = createRequest({ + type: 'DeletedEntitiesQuery', decoder: DatabaseLayer.getDecoderFor('DeletedEntitiesQuery'), async getCurrentValue( payload: DatabaseLayer.Payload<'DeletedEntitiesQuery'>, @@ -855,6 +892,7 @@ export function createSerloModel({ }) const getEntitiesMetadata = createRequest({ + type: 'EntitiesMetadataQuery', decoder: DatabaseLayer.getDecoderFor('EntitiesMetadataQuery'), async getCurrentValue( payload: DatabaseLayer.Payload<'EntitiesMetadataQuery'>, @@ -864,6 +902,7 @@ export function createSerloModel({ }) const linkEntitiesToTaxonomy = createMutation({ + type: 'TaxonomyCreateEntityLinksMutation', decoder: DatabaseLayer.getDecoderFor('TaxonomyCreateEntityLinksMutation'), mutate: ( payload: DatabaseLayer.Payload<'TaxonomyCreateEntityLinksMutation'>, @@ -886,6 +925,7 @@ export function createSerloModel({ }) const unlinkEntitiesFromTaxonomy = createMutation({ + type: 'TaxonomyCreateEntityLinksMutation', decoder: DatabaseLayer.getDecoderFor('TaxonomyDeleteEntityLinksMutation'), mutate: ( payload: DatabaseLayer.Payload<'TaxonomyDeleteEntityLinksMutation'>, @@ -908,6 +948,7 @@ export function createSerloModel({ }) const createTaxonomyTerm = createMutation({ + type: 'TaxonomyTermCreateMutation', decoder: DatabaseLayer.getDecoderFor('TaxonomyTermCreateMutation'), mutate: (payload: DatabaseLayer.Payload<'TaxonomyTermCreateMutation'>) => { return DatabaseLayer.makeRequest('TaxonomyTermCreateMutation', payload) @@ -920,6 +961,7 @@ export function createSerloModel({ }) const sortEntity = createMutation({ + type: 'EntitySortMutation', decoder: DatabaseLayer.getDecoderFor('EntitySortMutation'), mutate: (payload: DatabaseLayer.Payload<'EntitySortMutation'>) => { return DatabaseLayer.makeRequest('EntitySortMutation', payload) @@ -933,6 +975,7 @@ export function createSerloModel({ }) const sortTaxonomyTerm = createMutation({ + type: 'TaxonomySortMutation', decoder: DatabaseLayer.getDecoderFor('TaxonomySortMutation'), mutate: (payload: DatabaseLayer.Payload<'TaxonomySortMutation'>) => { return DatabaseLayer.makeRequest('TaxonomySortMutation', payload) @@ -953,6 +996,7 @@ export function createSerloModel({ }) const setEntityLicense = createMutation({ + type: 'EntitySetLicenseMutation', decoder: DatabaseLayer.getDecoderFor('EntitySetLicenseMutation'), mutate: (payload: DatabaseLayer.Payload<'EntitySetLicenseMutation'>) => { return DatabaseLayer.makeRequest('EntitySetLicenseMutation', payload) @@ -971,6 +1015,7 @@ export function createSerloModel({ }) const getPages = createRequest({ + type: 'PagesQuery', decoder: DatabaseLayer.getDecoderFor('PagesQuery'), async getCurrentValue(payload: DatabaseLayer.Payload<'PagesQuery'>) { return DatabaseLayer.makeRequest('PagesQuery', payload) @@ -978,6 +1023,7 @@ export function createSerloModel({ }) const setTaxonomyTermNameAndDescription = createMutation({ + type: 'TaxonomyTermSetNameAndDescriptionMutation', decoder: DatabaseLayer.getDecoderFor( 'TaxonomyTermSetNameAndDescriptionMutation', ), @@ -1004,6 +1050,7 @@ export function createSerloModel({ }) const addRole = createMutation({ + type: 'UsersByRoleQuery', decoder: DatabaseLayer.getDecoderFor('UserAddRoleMutation'), mutate: (payload: DatabaseLayer.Payload<'UserAddRoleMutation'>) => { return DatabaseLayer.makeRequest('UserAddRoleMutation', payload) @@ -1033,6 +1080,7 @@ export function createSerloModel({ }) const removeRole = createMutation({ + type: 'UserRemoveRoleMutation', decoder: DatabaseLayer.getDecoderFor('UserRemoveRoleMutation'), mutate: (payload: DatabaseLayer.Payload<'UserRemoveRoleMutation'>) => { return DatabaseLayer.makeRequest('UserRemoveRoleMutation', payload) @@ -1062,6 +1110,7 @@ export function createSerloModel({ }) const getUsersByRole = createRequest({ + type: 'UsersByRoleQuery', decoder: DatabaseLayer.getDecoderFor('UsersByRoleQuery'), async getCurrentValue(payload: DatabaseLayer.Payload<'UsersByRoleQuery'>) { return DatabaseLayer.makeRequest('UsersByRoleQuery', payload)