From 25cb9a831be457beb412d4f6c451390b2747a1c4 Mon Sep 17 00:00:00 2001 From: Lakhan Samani Date: Mon, 26 Sep 2022 23:50:24 +0530 Subject: [PATCH] feat: add cursor for pagination --- server/graph/generated/generated.go | 722 +++++++++++++++------------- server/graph/model/models_gen.go | 14 +- server/graph/schema.graphqls | 672 +++++++++++++------------- 3 files changed, 732 insertions(+), 676 deletions(-) diff --git a/server/graph/generated/generated.go b/server/graph/generated/generated.go index 85fb406..d141f54 100644 --- a/server/graph/generated/generated.go +++ b/server/graph/generated/generated.go @@ -184,6 +184,7 @@ type ComplexityRoot struct { } Pagination struct { + Cursor func(childComplexity int) int Limit func(childComplexity int) int Offset func(childComplexity int) int Page func(childComplexity int) int @@ -1301,6 +1302,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.VerifyOtp(childComplexity, args["params"].(model.VerifyOTPRequest)), true + case "Pagination.cursor": + if e.complexity.Pagination.Cursor == nil { + break + } + + return e.complexity.Pagination.Cursor(childComplexity), true + case "Pagination.limit": if e.complexity.Pagination.Limit == nil { break @@ -1903,494 +1911,496 @@ scalar Map scalar Any type Pagination { - limit: Int64! - page: Int64! - offset: Int64! - total: Int64! + limit: Int64! + page: Int64! + cursor: String + offset: Int64! + total: Int64! } type Meta { - version: String! - client_id: String! - is_google_login_enabled: Boolean! - is_facebook_login_enabled: Boolean! - is_github_login_enabled: Boolean! - is_linkedin_login_enabled: Boolean! - is_apple_login_enabled: Boolean! - is_twitter_login_enabled: Boolean! - is_email_verification_enabled: Boolean! - is_basic_authentication_enabled: Boolean! - is_magic_link_login_enabled: Boolean! - is_sign_up_enabled: Boolean! - is_strong_password_enabled: Boolean! - is_multi_factor_auth_enabled: Boolean! + version: String! + client_id: String! + is_google_login_enabled: Boolean! + is_facebook_login_enabled: Boolean! + is_github_login_enabled: Boolean! + is_linkedin_login_enabled: Boolean! + is_apple_login_enabled: Boolean! + is_twitter_login_enabled: Boolean! + is_email_verification_enabled: Boolean! + is_basic_authentication_enabled: Boolean! + is_magic_link_login_enabled: Boolean! + is_sign_up_enabled: Boolean! + is_strong_password_enabled: Boolean! + is_multi_factor_auth_enabled: Boolean! } type User { - id: ID! - email: String! - email_verified: Boolean! - signup_methods: String! - given_name: String - family_name: String - middle_name: String - nickname: String - # defaults to email - preferred_username: String - gender: String - birthdate: String - phone_number: String - phone_number_verified: Boolean - picture: String - roles: [String!]! - created_at: Int64 - updated_at: Int64 - revoked_timestamp: Int64 - is_multi_factor_auth_enabled: Boolean + id: ID! + email: String! + email_verified: Boolean! + signup_methods: String! + given_name: String + family_name: String + middle_name: String + nickname: String + # defaults to email + preferred_username: String + gender: String + birthdate: String + phone_number: String + phone_number_verified: Boolean + picture: String + roles: [String!]! + created_at: Int64 + updated_at: Int64 + revoked_timestamp: Int64 + is_multi_factor_auth_enabled: Boolean } type Users { - pagination: Pagination! - users: [User!]! + pagination: Pagination! + users: [User!]! } type VerificationRequest { - id: ID! - identifier: String - token: String - email: String - expires: Int64 - created_at: Int64 - updated_at: Int64 - nonce: String - redirect_uri: String + id: ID! + identifier: String + token: String + email: String + expires: Int64 + created_at: Int64 + updated_at: Int64 + nonce: String + redirect_uri: String } type VerificationRequests { - pagination: Pagination! - verification_requests: [VerificationRequest!]! + pagination: Pagination! + verification_requests: [VerificationRequest!]! } type Error { - message: String! - reason: String! + message: String! + reason: String! } type AuthResponse { - message: String! - should_show_otp_screen: Boolean - access_token: String - id_token: String - refresh_token: String - expires_in: Int64 - user: User + message: String! + should_show_otp_screen: Boolean + access_token: String + id_token: String + refresh_token: String + expires_in: Int64 + user: User } type Response { - message: String! + message: String! } type Env { - ACCESS_TOKEN_EXPIRY_TIME: String - ADMIN_SECRET: String - DATABASE_NAME: String - DATABASE_URL: String - DATABASE_TYPE: String - DATABASE_USERNAME: String - DATABASE_PASSWORD: String - DATABASE_HOST: String - DATABASE_PORT: String - CLIENT_ID: String! - CLIENT_SECRET: String! - CUSTOM_ACCESS_TOKEN_SCRIPT: String - SMTP_HOST: String - SMTP_PORT: String - SMTP_USERNAME: String - SMTP_PASSWORD: String - SENDER_EMAIL: String - JWT_TYPE: String - JWT_SECRET: String - JWT_PRIVATE_KEY: String - JWT_PUBLIC_KEY: String - ALLOWED_ORIGINS: [String!] - APP_URL: String - REDIS_URL: String - RESET_PASSWORD_URL: String - DISABLE_EMAIL_VERIFICATION: Boolean! - DISABLE_BASIC_AUTHENTICATION: Boolean! - DISABLE_MAGIC_LINK_LOGIN: Boolean! - DISABLE_LOGIN_PAGE: Boolean! - DISABLE_SIGN_UP: Boolean! - DISABLE_REDIS_FOR_ENV: Boolean! - DISABLE_STRONG_PASSWORD: Boolean! - DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean! - ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean! - ROLES: [String!] - PROTECTED_ROLES: [String!] - DEFAULT_ROLES: [String!] - JWT_ROLE_CLAIM: String - GOOGLE_CLIENT_ID: String - GOOGLE_CLIENT_SECRET: String - GITHUB_CLIENT_ID: String - GITHUB_CLIENT_SECRET: String - FACEBOOK_CLIENT_ID: String - FACEBOOK_CLIENT_SECRET: String - LINKEDIN_CLIENT_ID: String - LINKEDIN_CLIENT_SECRET: String - APPLE_CLIENT_ID: String - APPLE_CLIENT_SECRET: String - TWITTER_CLIENT_ID: String - TWITTER_CLIENT_SECRET: String - ORGANIZATION_NAME: String - ORGANIZATION_LOGO: String + ACCESS_TOKEN_EXPIRY_TIME: String + ADMIN_SECRET: String + DATABASE_NAME: String + DATABASE_URL: String + DATABASE_TYPE: String + DATABASE_USERNAME: String + DATABASE_PASSWORD: String + DATABASE_HOST: String + DATABASE_PORT: String + CLIENT_ID: String! + CLIENT_SECRET: String! + CUSTOM_ACCESS_TOKEN_SCRIPT: String + SMTP_HOST: String + SMTP_PORT: String + SMTP_USERNAME: String + SMTP_PASSWORD: String + SENDER_EMAIL: String + JWT_TYPE: String + JWT_SECRET: String + JWT_PRIVATE_KEY: String + JWT_PUBLIC_KEY: String + ALLOWED_ORIGINS: [String!] + APP_URL: String + REDIS_URL: String + RESET_PASSWORD_URL: String + DISABLE_EMAIL_VERIFICATION: Boolean! + DISABLE_BASIC_AUTHENTICATION: Boolean! + DISABLE_MAGIC_LINK_LOGIN: Boolean! + DISABLE_LOGIN_PAGE: Boolean! + DISABLE_SIGN_UP: Boolean! + DISABLE_REDIS_FOR_ENV: Boolean! + DISABLE_STRONG_PASSWORD: Boolean! + DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean! + ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean! + ROLES: [String!] + PROTECTED_ROLES: [String!] + DEFAULT_ROLES: [String!] + JWT_ROLE_CLAIM: String + GOOGLE_CLIENT_ID: String + GOOGLE_CLIENT_SECRET: String + GITHUB_CLIENT_ID: String + GITHUB_CLIENT_SECRET: String + FACEBOOK_CLIENT_ID: String + FACEBOOK_CLIENT_SECRET: String + LINKEDIN_CLIENT_ID: String + LINKEDIN_CLIENT_SECRET: String + APPLE_CLIENT_ID: String + APPLE_CLIENT_SECRET: String + TWITTER_CLIENT_ID: String + TWITTER_CLIENT_SECRET: String + ORGANIZATION_NAME: String + ORGANIZATION_LOGO: String } type ValidateJWTTokenResponse { - is_valid: Boolean! + is_valid: Boolean! } type GenerateJWTKeysResponse { - secret: String - public_key: String - private_key: String + secret: String + public_key: String + private_key: String } type Webhook { - id: ID! - event_name: String - endpoint: String - enabled: Boolean - headers: Map - created_at: Int64 - updated_at: Int64 + id: ID! + event_name: String + endpoint: String + enabled: Boolean + headers: Map + created_at: Int64 + updated_at: Int64 } type Webhooks { - pagination: Pagination! - webhooks: [Webhook!]! + pagination: Pagination! + webhooks: [Webhook!]! } type WebhookLog { - id: ID! - http_status: Int64 - response: String - request: String - webhook_id: ID - created_at: Int64 - updated_at: Int64 + id: ID! + http_status: Int64 + response: String + request: String + webhook_id: ID + created_at: Int64 + updated_at: Int64 } type TestEndpointResponse { - http_status: Int64 - response: String + http_status: Int64 + response: String } type WebhookLogs { - pagination: Pagination! - webhook_logs: [WebhookLog!]! + pagination: Pagination! + webhook_logs: [WebhookLog!]! } type EmailTemplate { - id: ID! - event_name: String! - template: String! - design: String! - subject: String! - created_at: Int64 - updated_at: Int64 + id: ID! + event_name: String! + template: String! + design: String! + subject: String! + created_at: Int64 + updated_at: Int64 } type EmailTemplates { - pagination: Pagination! - email_templates: [EmailTemplate!]! + pagination: Pagination! + email_templates: [EmailTemplate!]! } input UpdateEnvInput { - ACCESS_TOKEN_EXPIRY_TIME: String - ADMIN_SECRET: String - CUSTOM_ACCESS_TOKEN_SCRIPT: String - OLD_ADMIN_SECRET: String - SMTP_HOST: String - SMTP_PORT: String - SMTP_USERNAME: String - SMTP_PASSWORD: String - SENDER_EMAIL: String - JWT_TYPE: String - JWT_SECRET: String - JWT_PRIVATE_KEY: String - JWT_PUBLIC_KEY: String - ALLOWED_ORIGINS: [String!] - APP_URL: String - RESET_PASSWORD_URL: String - DISABLE_EMAIL_VERIFICATION: Boolean - DISABLE_BASIC_AUTHENTICATION: Boolean - DISABLE_MAGIC_LINK_LOGIN: Boolean - DISABLE_LOGIN_PAGE: Boolean - DISABLE_SIGN_UP: Boolean - DISABLE_REDIS_FOR_ENV: Boolean - DISABLE_STRONG_PASSWORD: Boolean - DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean - ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean - ROLES: [String!] - PROTECTED_ROLES: [String!] - DEFAULT_ROLES: [String!] - JWT_ROLE_CLAIM: String - GOOGLE_CLIENT_ID: String - GOOGLE_CLIENT_SECRET: String - GITHUB_CLIENT_ID: String - GITHUB_CLIENT_SECRET: String - FACEBOOK_CLIENT_ID: String - FACEBOOK_CLIENT_SECRET: String - LINKEDIN_CLIENT_ID: String - LINKEDIN_CLIENT_SECRET: String - APPLE_CLIENT_ID: String - APPLE_CLIENT_SECRET: String - TWITTER_CLIENT_ID: String - TWITTER_CLIENT_SECRET: String - ORGANIZATION_NAME: String - ORGANIZATION_LOGO: String + ACCESS_TOKEN_EXPIRY_TIME: String + ADMIN_SECRET: String + CUSTOM_ACCESS_TOKEN_SCRIPT: String + OLD_ADMIN_SECRET: String + SMTP_HOST: String + SMTP_PORT: String + SMTP_USERNAME: String + SMTP_PASSWORD: String + SENDER_EMAIL: String + JWT_TYPE: String + JWT_SECRET: String + JWT_PRIVATE_KEY: String + JWT_PUBLIC_KEY: String + ALLOWED_ORIGINS: [String!] + APP_URL: String + RESET_PASSWORD_URL: String + DISABLE_EMAIL_VERIFICATION: Boolean + DISABLE_BASIC_AUTHENTICATION: Boolean + DISABLE_MAGIC_LINK_LOGIN: Boolean + DISABLE_LOGIN_PAGE: Boolean + DISABLE_SIGN_UP: Boolean + DISABLE_REDIS_FOR_ENV: Boolean + DISABLE_STRONG_PASSWORD: Boolean + DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean + ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean + ROLES: [String!] + PROTECTED_ROLES: [String!] + DEFAULT_ROLES: [String!] + JWT_ROLE_CLAIM: String + GOOGLE_CLIENT_ID: String + GOOGLE_CLIENT_SECRET: String + GITHUB_CLIENT_ID: String + GITHUB_CLIENT_SECRET: String + FACEBOOK_CLIENT_ID: String + FACEBOOK_CLIENT_SECRET: String + LINKEDIN_CLIENT_ID: String + LINKEDIN_CLIENT_SECRET: String + APPLE_CLIENT_ID: String + APPLE_CLIENT_SECRET: String + TWITTER_CLIENT_ID: String + TWITTER_CLIENT_SECRET: String + ORGANIZATION_NAME: String + ORGANIZATION_LOGO: String } input AdminLoginInput { - admin_secret: String! + admin_secret: String! } input AdminSignupInput { - admin_secret: String! + admin_secret: String! } input SignUpInput { - email: String! - given_name: String - family_name: String - middle_name: String - nickname: String - gender: String - birthdate: String - phone_number: String - picture: String - password: String! - confirm_password: String! - roles: [String!] - scope: [String!] - redirect_uri: String - is_multi_factor_auth_enabled: Boolean + email: String! + given_name: String + family_name: String + middle_name: String + nickname: String + gender: String + birthdate: String + phone_number: String + picture: String + password: String! + confirm_password: String! + roles: [String!] + scope: [String!] + redirect_uri: String + is_multi_factor_auth_enabled: Boolean } input LoginInput { - email: String! - password: String! - roles: [String!] - scope: [String!] + email: String! + password: String! + roles: [String!] + scope: [String!] } input VerifyEmailInput { - token: String! + token: String! } input ResendVerifyEmailInput { - email: String! - identifier: String! + email: String! + identifier: String! } input UpdateProfileInput { - old_password: String - new_password: String - confirm_new_password: String - email: String - given_name: String - family_name: String - middle_name: String - nickname: String - gender: String - birthdate: String - phone_number: String - picture: String - is_multi_factor_auth_enabled: Boolean + old_password: String + new_password: String + confirm_new_password: String + email: String + given_name: String + family_name: String + middle_name: String + nickname: String + gender: String + birthdate: String + phone_number: String + picture: String + is_multi_factor_auth_enabled: Boolean } input UpdateUserInput { - id: ID! - email: String - email_verified: Boolean - given_name: String - family_name: String - middle_name: String - nickname: String - gender: String - birthdate: String - phone_number: String - picture: String - roles: [String] - is_multi_factor_auth_enabled: Boolean + id: ID! + email: String + email_verified: Boolean + given_name: String + family_name: String + middle_name: String + nickname: String + gender: String + birthdate: String + phone_number: String + picture: String + roles: [String] + is_multi_factor_auth_enabled: Boolean } input ForgotPasswordInput { - email: String! - state: String - redirect_uri: String + email: String! + state: String + redirect_uri: String } input ResetPasswordInput { - token: String! - password: String! - confirm_password: String! + token: String! + password: String! + confirm_password: String! } input DeleteUserInput { - email: String! + email: String! } input MagicLinkLoginInput { - email: String! - roles: [String!] - scope: [String!] - state: String - redirect_uri: String + email: String! + roles: [String!] + scope: [String!] + state: String + redirect_uri: String } input SessionQueryInput { - roles: [String!] - scope: [String!] + roles: [String!] + scope: [String!] } input PaginationInput { - limit: Int64 - page: Int64 + limit: Int64 + page: Int64 + cursor: String } input PaginatedInput { - pagination: PaginationInput + pagination: PaginationInput } input OAuthRevokeInput { - refresh_token: String! + refresh_token: String! } input InviteMemberInput { - emails: [String!]! - redirect_uri: String + emails: [String!]! + redirect_uri: String } input UpdateAccessInput { - user_id: String! + user_id: String! } input ValidateJWTTokenInput { - token_type: String! - token: String! - roles: [String!] + token_type: String! + token: String! + roles: [String!] } input GenerateJWTKeysInput { - type: String! + type: String! } input ListWebhookLogRequest { - pagination: PaginationInput - webhook_id: String + pagination: PaginationInput + webhook_id: String } input AddWebhookRequest { - event_name: String! - endpoint: String! - enabled: Boolean! - headers: Map + event_name: String! + endpoint: String! + enabled: Boolean! + headers: Map } input UpdateWebhookRequest { - id: ID! - event_name: String - endpoint: String - enabled: Boolean - headers: Map + id: ID! + event_name: String + endpoint: String + enabled: Boolean + headers: Map } input WebhookRequest { - id: ID! + id: ID! } input TestEndpointRequest { - endpoint: String! - event_name: String! - headers: Map + endpoint: String! + event_name: String! + headers: Map } input AddEmailTemplateRequest { - event_name: String! - subject: String! - template: String! - design: String! + event_name: String! + subject: String! + template: String! + design: String! } input UpdateEmailTemplateRequest { - id: ID! - event_name: String - template: String - subject: String - design: String + id: ID! + event_name: String + template: String + subject: String + design: String } input DeleteEmailTemplateRequest { - id: ID! + id: ID! } input VerifyOTPRequest { - email: String! - otp: String! + email: String! + otp: String! } input ResendOTPRequest { - email: String! + email: String! } type Mutation { - signup(params: SignUpInput!): AuthResponse! - login(params: LoginInput!): AuthResponse! - magic_link_login(params: MagicLinkLoginInput!): Response! - logout: Response! - update_profile(params: UpdateProfileInput!): Response! - verify_email(params: VerifyEmailInput!): AuthResponse! - resend_verify_email(params: ResendVerifyEmailInput!): Response! - forgot_password(params: ForgotPasswordInput!): Response! - reset_password(params: ResetPasswordInput!): Response! - revoke(params: OAuthRevokeInput!): Response! - verify_otp(params: VerifyOTPRequest!): AuthResponse! - resend_otp(params: ResendOTPRequest!): Response! - # admin only apis - _delete_user(params: DeleteUserInput!): Response! - _update_user(params: UpdateUserInput!): User! - _admin_signup(params: AdminSignupInput!): Response! - _admin_login(params: AdminLoginInput!): Response! - _admin_logout: Response! - _update_env(params: UpdateEnvInput!): Response! - _invite_members(params: InviteMemberInput!): Response! - _revoke_access(param: UpdateAccessInput!): Response! - _enable_access(param: UpdateAccessInput!): Response! - _generate_jwt_keys(params: GenerateJWTKeysInput!): GenerateJWTKeysResponse! - _add_webhook(params: AddWebhookRequest!): Response! - _update_webhook(params: UpdateWebhookRequest!): Response! - _delete_webhook(params: WebhookRequest!): Response! - _test_endpoint(params: TestEndpointRequest!): TestEndpointResponse! - _add_email_template(params: AddEmailTemplateRequest!): Response! - _update_email_template(params: UpdateEmailTemplateRequest!): Response! - _delete_email_template(params: DeleteEmailTemplateRequest!): Response! + signup(params: SignUpInput!): AuthResponse! + login(params: LoginInput!): AuthResponse! + magic_link_login(params: MagicLinkLoginInput!): Response! + logout: Response! + update_profile(params: UpdateProfileInput!): Response! + verify_email(params: VerifyEmailInput!): AuthResponse! + resend_verify_email(params: ResendVerifyEmailInput!): Response! + forgot_password(params: ForgotPasswordInput!): Response! + reset_password(params: ResetPasswordInput!): Response! + revoke(params: OAuthRevokeInput!): Response! + verify_otp(params: VerifyOTPRequest!): AuthResponse! + resend_otp(params: ResendOTPRequest!): Response! + # admin only apis + _delete_user(params: DeleteUserInput!): Response! + _update_user(params: UpdateUserInput!): User! + _admin_signup(params: AdminSignupInput!): Response! + _admin_login(params: AdminLoginInput!): Response! + _admin_logout: Response! + _update_env(params: UpdateEnvInput!): Response! + _invite_members(params: InviteMemberInput!): Response! + _revoke_access(param: UpdateAccessInput!): Response! + _enable_access(param: UpdateAccessInput!): Response! + _generate_jwt_keys(params: GenerateJWTKeysInput!): GenerateJWTKeysResponse! + _add_webhook(params: AddWebhookRequest!): Response! + _update_webhook(params: UpdateWebhookRequest!): Response! + _delete_webhook(params: WebhookRequest!): Response! + _test_endpoint(params: TestEndpointRequest!): TestEndpointResponse! + _add_email_template(params: AddEmailTemplateRequest!): Response! + _update_email_template(params: UpdateEmailTemplateRequest!): Response! + _delete_email_template(params: DeleteEmailTemplateRequest!): Response! } type Query { - meta: Meta! - session(params: SessionQueryInput): AuthResponse! - profile: User! - validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse! - # admin only apis - _users(params: PaginatedInput): Users! - _verification_requests(params: PaginatedInput): VerificationRequests! - _admin_session: Response! - _env: Env! - _webhook(params: WebhookRequest!): Webhook! - _webhooks(params: PaginatedInput): Webhooks! - _webhook_logs(params: ListWebhookLogRequest): WebhookLogs! - _email_templates(params: PaginatedInput): EmailTemplates! + meta: Meta! + session(params: SessionQueryInput): AuthResponse! + profile: User! + validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse! + # admin only apis + _users(params: PaginatedInput): Users! + _verification_requests(params: PaginatedInput): VerificationRequests! + _admin_session: Response! + _env: Env! + _webhook(params: WebhookRequest!): Webhook! + _webhooks(params: PaginatedInput): Webhooks! + _webhook_logs(params: ListWebhookLogRequest): WebhookLogs! + _email_templates(params: PaginatedInput): EmailTemplates! } `, BuiltIn: false}, } @@ -7141,6 +7151,38 @@ func (ec *executionContext) _Pagination_page(ctx context.Context, field graphql. return ec.marshalNInt642int64(ctx, field.Selections, res) } +func (ec *executionContext) _Pagination_cursor(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Pagination", + Field: field, + Args: nil, + IsMethod: false, + IsResolver: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Cursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2áš–string(ctx, field.Selections, res) +} + func (ec *executionContext) _Pagination_offset(ctx context.Context, field graphql.CollectedField, obj *model.Pagination) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -11145,6 +11187,14 @@ func (ec *executionContext) unmarshalInputPaginationInput(ctx context.Context, o if err != nil { return it, err } + case "cursor": + var err error + + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("cursor")) + it.Cursor, err = ec.unmarshalOString2áš–string(ctx, v) + if err != nil { + return it, err + } } } @@ -12928,6 +12978,8 @@ func (ec *executionContext) _Pagination(ctx context.Context, sel ast.SelectionSe if out.Values[i] == graphql.Null { invalids++ } + case "cursor": + out.Values[i] = ec._Pagination_cursor(ctx, field, obj) case "offset": out.Values[i] = ec._Pagination_offset(ctx, field, obj) if out.Values[i] == graphql.Null { diff --git a/server/graph/model/models_gen.go b/server/graph/model/models_gen.go index 19fd6d9..2e4c27d 100644 --- a/server/graph/model/models_gen.go +++ b/server/graph/model/models_gen.go @@ -184,15 +184,17 @@ type PaginatedInput struct { } type Pagination struct { - Limit int64 `json:"limit"` - Page int64 `json:"page"` - Offset int64 `json:"offset"` - Total int64 `json:"total"` + Limit int64 `json:"limit"` + Page int64 `json:"page"` + Cursor *string `json:"cursor"` + Offset int64 `json:"offset"` + Total int64 `json:"total"` } type PaginationInput struct { - Limit *int64 `json:"limit"` - Page *int64 `json:"page"` + Limit *int64 `json:"limit"` + Page *int64 `json:"page"` + Cursor *string `json:"cursor"` } type ResendOTPRequest struct { diff --git a/server/graph/schema.graphqls b/server/graph/schema.graphqls index d7d58d6..78cf081 100644 --- a/server/graph/schema.graphqls +++ b/server/graph/schema.graphqls @@ -6,492 +6,494 @@ scalar Map scalar Any type Pagination { - limit: Int64! - page: Int64! - offset: Int64! - total: Int64! + limit: Int64! + page: Int64! + cursor: String + offset: Int64! + total: Int64! } type Meta { - version: String! - client_id: String! - is_google_login_enabled: Boolean! - is_facebook_login_enabled: Boolean! - is_github_login_enabled: Boolean! - is_linkedin_login_enabled: Boolean! - is_apple_login_enabled: Boolean! - is_twitter_login_enabled: Boolean! - is_email_verification_enabled: Boolean! - is_basic_authentication_enabled: Boolean! - is_magic_link_login_enabled: Boolean! - is_sign_up_enabled: Boolean! - is_strong_password_enabled: Boolean! - is_multi_factor_auth_enabled: Boolean! + version: String! + client_id: String! + is_google_login_enabled: Boolean! + is_facebook_login_enabled: Boolean! + is_github_login_enabled: Boolean! + is_linkedin_login_enabled: Boolean! + is_apple_login_enabled: Boolean! + is_twitter_login_enabled: Boolean! + is_email_verification_enabled: Boolean! + is_basic_authentication_enabled: Boolean! + is_magic_link_login_enabled: Boolean! + is_sign_up_enabled: Boolean! + is_strong_password_enabled: Boolean! + is_multi_factor_auth_enabled: Boolean! } type User { - id: ID! - email: String! - email_verified: Boolean! - signup_methods: String! - given_name: String - family_name: String - middle_name: String - nickname: String - # defaults to email - preferred_username: String - gender: String - birthdate: String - phone_number: String - phone_number_verified: Boolean - picture: String - roles: [String!]! - created_at: Int64 - updated_at: Int64 - revoked_timestamp: Int64 - is_multi_factor_auth_enabled: Boolean + id: ID! + email: String! + email_verified: Boolean! + signup_methods: String! + given_name: String + family_name: String + middle_name: String + nickname: String + # defaults to email + preferred_username: String + gender: String + birthdate: String + phone_number: String + phone_number_verified: Boolean + picture: String + roles: [String!]! + created_at: Int64 + updated_at: Int64 + revoked_timestamp: Int64 + is_multi_factor_auth_enabled: Boolean } type Users { - pagination: Pagination! - users: [User!]! + pagination: Pagination! + users: [User!]! } type VerificationRequest { - id: ID! - identifier: String - token: String - email: String - expires: Int64 - created_at: Int64 - updated_at: Int64 - nonce: String - redirect_uri: String + id: ID! + identifier: String + token: String + email: String + expires: Int64 + created_at: Int64 + updated_at: Int64 + nonce: String + redirect_uri: String } type VerificationRequests { - pagination: Pagination! - verification_requests: [VerificationRequest!]! + pagination: Pagination! + verification_requests: [VerificationRequest!]! } type Error { - message: String! - reason: String! + message: String! + reason: String! } type AuthResponse { - message: String! - should_show_otp_screen: Boolean - access_token: String - id_token: String - refresh_token: String - expires_in: Int64 - user: User + message: String! + should_show_otp_screen: Boolean + access_token: String + id_token: String + refresh_token: String + expires_in: Int64 + user: User } type Response { - message: String! + message: String! } type Env { - ACCESS_TOKEN_EXPIRY_TIME: String - ADMIN_SECRET: String - DATABASE_NAME: String - DATABASE_URL: String - DATABASE_TYPE: String - DATABASE_USERNAME: String - DATABASE_PASSWORD: String - DATABASE_HOST: String - DATABASE_PORT: String - CLIENT_ID: String! - CLIENT_SECRET: String! - CUSTOM_ACCESS_TOKEN_SCRIPT: String - SMTP_HOST: String - SMTP_PORT: String - SMTP_USERNAME: String - SMTP_PASSWORD: String - SENDER_EMAIL: String - JWT_TYPE: String - JWT_SECRET: String - JWT_PRIVATE_KEY: String - JWT_PUBLIC_KEY: String - ALLOWED_ORIGINS: [String!] - APP_URL: String - REDIS_URL: String - RESET_PASSWORD_URL: String - DISABLE_EMAIL_VERIFICATION: Boolean! - DISABLE_BASIC_AUTHENTICATION: Boolean! - DISABLE_MAGIC_LINK_LOGIN: Boolean! - DISABLE_LOGIN_PAGE: Boolean! - DISABLE_SIGN_UP: Boolean! - DISABLE_REDIS_FOR_ENV: Boolean! - DISABLE_STRONG_PASSWORD: Boolean! - DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean! - ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean! - ROLES: [String!] - PROTECTED_ROLES: [String!] - DEFAULT_ROLES: [String!] - JWT_ROLE_CLAIM: String - GOOGLE_CLIENT_ID: String - GOOGLE_CLIENT_SECRET: String - GITHUB_CLIENT_ID: String - GITHUB_CLIENT_SECRET: String - FACEBOOK_CLIENT_ID: String - FACEBOOK_CLIENT_SECRET: String - LINKEDIN_CLIENT_ID: String - LINKEDIN_CLIENT_SECRET: String - APPLE_CLIENT_ID: String - APPLE_CLIENT_SECRET: String - TWITTER_CLIENT_ID: String - TWITTER_CLIENT_SECRET: String - ORGANIZATION_NAME: String - ORGANIZATION_LOGO: String + ACCESS_TOKEN_EXPIRY_TIME: String + ADMIN_SECRET: String + DATABASE_NAME: String + DATABASE_URL: String + DATABASE_TYPE: String + DATABASE_USERNAME: String + DATABASE_PASSWORD: String + DATABASE_HOST: String + DATABASE_PORT: String + CLIENT_ID: String! + CLIENT_SECRET: String! + CUSTOM_ACCESS_TOKEN_SCRIPT: String + SMTP_HOST: String + SMTP_PORT: String + SMTP_USERNAME: String + SMTP_PASSWORD: String + SENDER_EMAIL: String + JWT_TYPE: String + JWT_SECRET: String + JWT_PRIVATE_KEY: String + JWT_PUBLIC_KEY: String + ALLOWED_ORIGINS: [String!] + APP_URL: String + REDIS_URL: String + RESET_PASSWORD_URL: String + DISABLE_EMAIL_VERIFICATION: Boolean! + DISABLE_BASIC_AUTHENTICATION: Boolean! + DISABLE_MAGIC_LINK_LOGIN: Boolean! + DISABLE_LOGIN_PAGE: Boolean! + DISABLE_SIGN_UP: Boolean! + DISABLE_REDIS_FOR_ENV: Boolean! + DISABLE_STRONG_PASSWORD: Boolean! + DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean! + ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean! + ROLES: [String!] + PROTECTED_ROLES: [String!] + DEFAULT_ROLES: [String!] + JWT_ROLE_CLAIM: String + GOOGLE_CLIENT_ID: String + GOOGLE_CLIENT_SECRET: String + GITHUB_CLIENT_ID: String + GITHUB_CLIENT_SECRET: String + FACEBOOK_CLIENT_ID: String + FACEBOOK_CLIENT_SECRET: String + LINKEDIN_CLIENT_ID: String + LINKEDIN_CLIENT_SECRET: String + APPLE_CLIENT_ID: String + APPLE_CLIENT_SECRET: String + TWITTER_CLIENT_ID: String + TWITTER_CLIENT_SECRET: String + ORGANIZATION_NAME: String + ORGANIZATION_LOGO: String } type ValidateJWTTokenResponse { - is_valid: Boolean! + is_valid: Boolean! } type GenerateJWTKeysResponse { - secret: String - public_key: String - private_key: String + secret: String + public_key: String + private_key: String } type Webhook { - id: ID! - event_name: String - endpoint: String - enabled: Boolean - headers: Map - created_at: Int64 - updated_at: Int64 + id: ID! + event_name: String + endpoint: String + enabled: Boolean + headers: Map + created_at: Int64 + updated_at: Int64 } type Webhooks { - pagination: Pagination! - webhooks: [Webhook!]! + pagination: Pagination! + webhooks: [Webhook!]! } type WebhookLog { - id: ID! - http_status: Int64 - response: String - request: String - webhook_id: ID - created_at: Int64 - updated_at: Int64 + id: ID! + http_status: Int64 + response: String + request: String + webhook_id: ID + created_at: Int64 + updated_at: Int64 } type TestEndpointResponse { - http_status: Int64 - response: String + http_status: Int64 + response: String } type WebhookLogs { - pagination: Pagination! - webhook_logs: [WebhookLog!]! + pagination: Pagination! + webhook_logs: [WebhookLog!]! } type EmailTemplate { - id: ID! - event_name: String! - template: String! - design: String! - subject: String! - created_at: Int64 - updated_at: Int64 + id: ID! + event_name: String! + template: String! + design: String! + subject: String! + created_at: Int64 + updated_at: Int64 } type EmailTemplates { - pagination: Pagination! - email_templates: [EmailTemplate!]! + pagination: Pagination! + email_templates: [EmailTemplate!]! } input UpdateEnvInput { - ACCESS_TOKEN_EXPIRY_TIME: String - ADMIN_SECRET: String - CUSTOM_ACCESS_TOKEN_SCRIPT: String - OLD_ADMIN_SECRET: String - SMTP_HOST: String - SMTP_PORT: String - SMTP_USERNAME: String - SMTP_PASSWORD: String - SENDER_EMAIL: String - JWT_TYPE: String - JWT_SECRET: String - JWT_PRIVATE_KEY: String - JWT_PUBLIC_KEY: String - ALLOWED_ORIGINS: [String!] - APP_URL: String - RESET_PASSWORD_URL: String - DISABLE_EMAIL_VERIFICATION: Boolean - DISABLE_BASIC_AUTHENTICATION: Boolean - DISABLE_MAGIC_LINK_LOGIN: Boolean - DISABLE_LOGIN_PAGE: Boolean - DISABLE_SIGN_UP: Boolean - DISABLE_REDIS_FOR_ENV: Boolean - DISABLE_STRONG_PASSWORD: Boolean - DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean - ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean - ROLES: [String!] - PROTECTED_ROLES: [String!] - DEFAULT_ROLES: [String!] - JWT_ROLE_CLAIM: String - GOOGLE_CLIENT_ID: String - GOOGLE_CLIENT_SECRET: String - GITHUB_CLIENT_ID: String - GITHUB_CLIENT_SECRET: String - FACEBOOK_CLIENT_ID: String - FACEBOOK_CLIENT_SECRET: String - LINKEDIN_CLIENT_ID: String - LINKEDIN_CLIENT_SECRET: String - APPLE_CLIENT_ID: String - APPLE_CLIENT_SECRET: String - TWITTER_CLIENT_ID: String - TWITTER_CLIENT_SECRET: String - ORGANIZATION_NAME: String - ORGANIZATION_LOGO: String + ACCESS_TOKEN_EXPIRY_TIME: String + ADMIN_SECRET: String + CUSTOM_ACCESS_TOKEN_SCRIPT: String + OLD_ADMIN_SECRET: String + SMTP_HOST: String + SMTP_PORT: String + SMTP_USERNAME: String + SMTP_PASSWORD: String + SENDER_EMAIL: String + JWT_TYPE: String + JWT_SECRET: String + JWT_PRIVATE_KEY: String + JWT_PUBLIC_KEY: String + ALLOWED_ORIGINS: [String!] + APP_URL: String + RESET_PASSWORD_URL: String + DISABLE_EMAIL_VERIFICATION: Boolean + DISABLE_BASIC_AUTHENTICATION: Boolean + DISABLE_MAGIC_LINK_LOGIN: Boolean + DISABLE_LOGIN_PAGE: Boolean + DISABLE_SIGN_UP: Boolean + DISABLE_REDIS_FOR_ENV: Boolean + DISABLE_STRONG_PASSWORD: Boolean + DISABLE_MULTI_FACTOR_AUTHENTICATION: Boolean + ENFORCE_MULTI_FACTOR_AUTHENTICATION: Boolean + ROLES: [String!] + PROTECTED_ROLES: [String!] + DEFAULT_ROLES: [String!] + JWT_ROLE_CLAIM: String + GOOGLE_CLIENT_ID: String + GOOGLE_CLIENT_SECRET: String + GITHUB_CLIENT_ID: String + GITHUB_CLIENT_SECRET: String + FACEBOOK_CLIENT_ID: String + FACEBOOK_CLIENT_SECRET: String + LINKEDIN_CLIENT_ID: String + LINKEDIN_CLIENT_SECRET: String + APPLE_CLIENT_ID: String + APPLE_CLIENT_SECRET: String + TWITTER_CLIENT_ID: String + TWITTER_CLIENT_SECRET: String + ORGANIZATION_NAME: String + ORGANIZATION_LOGO: String } input AdminLoginInput { - admin_secret: String! + admin_secret: String! } input AdminSignupInput { - admin_secret: String! + admin_secret: String! } input SignUpInput { - email: String! - given_name: String - family_name: String - middle_name: String - nickname: String - gender: String - birthdate: String - phone_number: String - picture: String - password: String! - confirm_password: String! - roles: [String!] - scope: [String!] - redirect_uri: String - is_multi_factor_auth_enabled: Boolean + email: String! + given_name: String + family_name: String + middle_name: String + nickname: String + gender: String + birthdate: String + phone_number: String + picture: String + password: String! + confirm_password: String! + roles: [String!] + scope: [String!] + redirect_uri: String + is_multi_factor_auth_enabled: Boolean } input LoginInput { - email: String! - password: String! - roles: [String!] - scope: [String!] + email: String! + password: String! + roles: [String!] + scope: [String!] } input VerifyEmailInput { - token: String! + token: String! } input ResendVerifyEmailInput { - email: String! - identifier: String! + email: String! + identifier: String! } input UpdateProfileInput { - old_password: String - new_password: String - confirm_new_password: String - email: String - given_name: String - family_name: String - middle_name: String - nickname: String - gender: String - birthdate: String - phone_number: String - picture: String - is_multi_factor_auth_enabled: Boolean + old_password: String + new_password: String + confirm_new_password: String + email: String + given_name: String + family_name: String + middle_name: String + nickname: String + gender: String + birthdate: String + phone_number: String + picture: String + is_multi_factor_auth_enabled: Boolean } input UpdateUserInput { - id: ID! - email: String - email_verified: Boolean - given_name: String - family_name: String - middle_name: String - nickname: String - gender: String - birthdate: String - phone_number: String - picture: String - roles: [String] - is_multi_factor_auth_enabled: Boolean + id: ID! + email: String + email_verified: Boolean + given_name: String + family_name: String + middle_name: String + nickname: String + gender: String + birthdate: String + phone_number: String + picture: String + roles: [String] + is_multi_factor_auth_enabled: Boolean } input ForgotPasswordInput { - email: String! - state: String - redirect_uri: String + email: String! + state: String + redirect_uri: String } input ResetPasswordInput { - token: String! - password: String! - confirm_password: String! + token: String! + password: String! + confirm_password: String! } input DeleteUserInput { - email: String! + email: String! } input MagicLinkLoginInput { - email: String! - roles: [String!] - scope: [String!] - state: String - redirect_uri: String + email: String! + roles: [String!] + scope: [String!] + state: String + redirect_uri: String } input SessionQueryInput { - roles: [String!] - scope: [String!] + roles: [String!] + scope: [String!] } input PaginationInput { - limit: Int64 - page: Int64 + limit: Int64 + page: Int64 + cursor: String } input PaginatedInput { - pagination: PaginationInput + pagination: PaginationInput } input OAuthRevokeInput { - refresh_token: String! + refresh_token: String! } input InviteMemberInput { - emails: [String!]! - redirect_uri: String + emails: [String!]! + redirect_uri: String } input UpdateAccessInput { - user_id: String! + user_id: String! } input ValidateJWTTokenInput { - token_type: String! - token: String! - roles: [String!] + token_type: String! + token: String! + roles: [String!] } input GenerateJWTKeysInput { - type: String! + type: String! } input ListWebhookLogRequest { - pagination: PaginationInput - webhook_id: String + pagination: PaginationInput + webhook_id: String } input AddWebhookRequest { - event_name: String! - endpoint: String! - enabled: Boolean! - headers: Map + event_name: String! + endpoint: String! + enabled: Boolean! + headers: Map } input UpdateWebhookRequest { - id: ID! - event_name: String - endpoint: String - enabled: Boolean - headers: Map + id: ID! + event_name: String + endpoint: String + enabled: Boolean + headers: Map } input WebhookRequest { - id: ID! + id: ID! } input TestEndpointRequest { - endpoint: String! - event_name: String! - headers: Map + endpoint: String! + event_name: String! + headers: Map } input AddEmailTemplateRequest { - event_name: String! - subject: String! - template: String! - design: String! + event_name: String! + subject: String! + template: String! + design: String! } input UpdateEmailTemplateRequest { - id: ID! - event_name: String - template: String - subject: String - design: String + id: ID! + event_name: String + template: String + subject: String + design: String } input DeleteEmailTemplateRequest { - id: ID! + id: ID! } input VerifyOTPRequest { - email: String! - otp: String! + email: String! + otp: String! } input ResendOTPRequest { - email: String! + email: String! } type Mutation { - signup(params: SignUpInput!): AuthResponse! - login(params: LoginInput!): AuthResponse! - magic_link_login(params: MagicLinkLoginInput!): Response! - logout: Response! - update_profile(params: UpdateProfileInput!): Response! - verify_email(params: VerifyEmailInput!): AuthResponse! - resend_verify_email(params: ResendVerifyEmailInput!): Response! - forgot_password(params: ForgotPasswordInput!): Response! - reset_password(params: ResetPasswordInput!): Response! - revoke(params: OAuthRevokeInput!): Response! - verify_otp(params: VerifyOTPRequest!): AuthResponse! - resend_otp(params: ResendOTPRequest!): Response! - # admin only apis - _delete_user(params: DeleteUserInput!): Response! - _update_user(params: UpdateUserInput!): User! - _admin_signup(params: AdminSignupInput!): Response! - _admin_login(params: AdminLoginInput!): Response! - _admin_logout: Response! - _update_env(params: UpdateEnvInput!): Response! - _invite_members(params: InviteMemberInput!): Response! - _revoke_access(param: UpdateAccessInput!): Response! - _enable_access(param: UpdateAccessInput!): Response! - _generate_jwt_keys(params: GenerateJWTKeysInput!): GenerateJWTKeysResponse! - _add_webhook(params: AddWebhookRequest!): Response! - _update_webhook(params: UpdateWebhookRequest!): Response! - _delete_webhook(params: WebhookRequest!): Response! - _test_endpoint(params: TestEndpointRequest!): TestEndpointResponse! - _add_email_template(params: AddEmailTemplateRequest!): Response! - _update_email_template(params: UpdateEmailTemplateRequest!): Response! - _delete_email_template(params: DeleteEmailTemplateRequest!): Response! + signup(params: SignUpInput!): AuthResponse! + login(params: LoginInput!): AuthResponse! + magic_link_login(params: MagicLinkLoginInput!): Response! + logout: Response! + update_profile(params: UpdateProfileInput!): Response! + verify_email(params: VerifyEmailInput!): AuthResponse! + resend_verify_email(params: ResendVerifyEmailInput!): Response! + forgot_password(params: ForgotPasswordInput!): Response! + reset_password(params: ResetPasswordInput!): Response! + revoke(params: OAuthRevokeInput!): Response! + verify_otp(params: VerifyOTPRequest!): AuthResponse! + resend_otp(params: ResendOTPRequest!): Response! + # admin only apis + _delete_user(params: DeleteUserInput!): Response! + _update_user(params: UpdateUserInput!): User! + _admin_signup(params: AdminSignupInput!): Response! + _admin_login(params: AdminLoginInput!): Response! + _admin_logout: Response! + _update_env(params: UpdateEnvInput!): Response! + _invite_members(params: InviteMemberInput!): Response! + _revoke_access(param: UpdateAccessInput!): Response! + _enable_access(param: UpdateAccessInput!): Response! + _generate_jwt_keys(params: GenerateJWTKeysInput!): GenerateJWTKeysResponse! + _add_webhook(params: AddWebhookRequest!): Response! + _update_webhook(params: UpdateWebhookRequest!): Response! + _delete_webhook(params: WebhookRequest!): Response! + _test_endpoint(params: TestEndpointRequest!): TestEndpointResponse! + _add_email_template(params: AddEmailTemplateRequest!): Response! + _update_email_template(params: UpdateEmailTemplateRequest!): Response! + _delete_email_template(params: DeleteEmailTemplateRequest!): Response! } type Query { - meta: Meta! - session(params: SessionQueryInput): AuthResponse! - profile: User! - validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse! - # admin only apis - _users(params: PaginatedInput): Users! - _verification_requests(params: PaginatedInput): VerificationRequests! - _admin_session: Response! - _env: Env! - _webhook(params: WebhookRequest!): Webhook! - _webhooks(params: PaginatedInput): Webhooks! - _webhook_logs(params: ListWebhookLogRequest): WebhookLogs! - _email_templates(params: PaginatedInput): EmailTemplates! + meta: Meta! + session(params: SessionQueryInput): AuthResponse! + profile: User! + validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse! + # admin only apis + _users(params: PaginatedInput): Users! + _verification_requests(params: PaginatedInput): VerificationRequests! + _admin_session: Response! + _env: Env! + _webhook(params: WebhookRequest!): Webhook! + _webhooks(params: PaginatedInput): Webhooks! + _webhook_logs(params: ListWebhookLogRequest): WebhookLogs! + _email_templates(params: PaginatedInput): EmailTemplates! }