diff --git a/Rakefile b/Rakefile index 431a49cb7dc..b9dc55b9bcc 100644 --- a/Rakefile +++ b/Rakefile @@ -8,9 +8,6 @@ require "graphql/rake_task" Rails.application.load_tasks -# TODO(graphql_schema): This schema is deprecated and should be removed. -GraphQL::RakeTask.new(schema_name: "LagoApiSchema") - GraphQL::RakeTask.new( schema_name: "Schemas::ApiSchema", idl_outfile: "graphql_schemas/api.graphql", diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb deleted file mode 100644 index 3f509803f5c..00000000000 --- a/app/controllers/graphql_controller.rb +++ /dev/null @@ -1,95 +0,0 @@ -# frozen_string_literal: true - -# TODO(graphql_schema): This controller is deprecated and should be removed. -class GraphqlController < ApplicationController - include AuthenticableUser - include CustomerPortalUser - include OrganizationHeader - include Trackable - - before_action :set_context_source - - rescue_from JWT::ExpiredSignature do - render_graphql_error(code: 'expired_jwt_token', status: 401) - end - - # If accessing from outside this domain, nullify the session - # This allows for outside API access while preventing CSRF attacks, - # but you'll have to authenticate your user separately - # protect_from_forgery with: :null_session - - def execute - variables = prepare_variables(params[:variables]) - query = params[:query] - operation_name = params[:operationName] - context = { - current_user:, - current_organization:, - customer_portal_user:, - request:, - permissions: - current_user&.memberships&.find_by(organization: current_organization)&.permissions_hash || - Permission::EMPTY_PERMISSIONS_HASH - } - - OpenTelemetry::Trace.current_span.add_attributes({"query" => query, "operation_name" => operation_name}) - result = LagoTracer.in_span("LagoApiSchema.execute") do - LagoApiSchema.execute(query, variables:, context:, operation_name:) - end - - render(json: result) - rescue JWT::ExpiredSignature - render_graphql_error(code: 'expired_jwt_token', status: 401) - rescue => e - raise e unless Rails.env.development? - - handle_error_in_development(e) - end - - private - - # Handle variables in form data, JSON body, or a blank value - def prepare_variables(variables_param) - case variables_param - when String - if variables_param.present? - JSON.parse(variables_param) || {} - else - {} - end - when Hash - variables_param - when ActionController::Parameters - variables_param.to_unsafe_hash # GraphQL-Ruby will validate name and type of incoming variables. - when nil - {} - else - raise ArgumentError, "Unexpected parameter: #{variables_param}" - end - end - - def handle_error_in_development(error) - logger.error(error.message) - logger.error(error.backtrace.join("\n")) - - render(json: {errors: [{message: error.message, backtrace: error.backtrace}], data: {}}, status: 500) - end - - def render_graphql_error(code:, status:, message: nil) - render( - json: { - data: {}, - errors: [ - { - message: message || code, - extensions: {status:, code:} - } - ] - } - ) - end - - def set_context_source - CurrentContext.source = 'graphql' - end -end diff --git a/app/graphql/lago_api_schema.rb b/app/graphql/lago_api_schema.rb deleted file mode 100644 index 668bb1a9b0e..00000000000 --- a/app/graphql/lago_api_schema.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -# TODO(graphql_schema): This schema is deprecated and should be removed. -class LagoApiSchema < GraphQL::Schema - mutation(Types::MutationType) - query(Types::QueryType) - - # For batch-loading (see https://graphql-ruby.org/dataloader/overview.html) - use GraphQL::Dataloader - - max_depth 15 - max_complexity 350 - - # GraphQL-Ruby calls this when something goes wrong while running a query: - - # Union and Interface Resolution - def self.resolve_type(_abstract_type, _obj, _ctx) - # TODO: Implement this method - # to return the correct GraphQL object type for `obj` - raise(GraphQL::RequiredImplementationMissingError) - end - - # Relay-style Object Identification: - - # Return a string UUID for `object` - def self.id_from_object(object, type_definition, _query_ctx) - # For example, use Rails' GlobalID library (https://github.com/rails/globalid): - object_id = object.to_global_id.to_s - # Remove this redundant prefix to make IDs shorter: - object_id = object_id.sub("gid://#{GlobalID.app}/", '') - encoded_id = Base64.urlsafe_encode64(object_id) - # Remove the "=" padding - encoded_id = encoded_id.sub(/=+/, '') - # Add a type hint - type_hint = type_definition.graphql_name.first - "#{type_hint}_#{encoded_id}" - end - - # Given a string UUID, find the object - def self.object_from_id(encoded_id_with_hint, _query_ctx) - # For example, use Rails' GlobalID library (https://github.com/rails/globalid): - # Split off the type hint - _type_hint, encoded_id = encoded_id_with_hint.split('_', 2) - # Decode the ID - id = Base64.urlsafe_decode64(encoded_id) - # Rebuild it for Rails then find the object: - full_global_id = "gid://#{GlobalID.app}/#{id}" - GlobalID::Locator.locate(full_global_id) - end - - default_max_page_size 25 -end diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb deleted file mode 100644 index 807e2098e44..00000000000 --- a/app/graphql/types/mutation_type.rb +++ /dev/null @@ -1,149 +0,0 @@ -# frozen_string_literal: true - -# TODO(graphql_schema): This class is deprecated and should be removed. -module Types - class MutationType < Types::BaseObject - field :login_user, mutation: Mutations::LoginUser - field :register_user, mutation: Mutations::RegisterUser - - field :update_organization, mutation: Mutations::Organizations::Update - - field :create_billable_metric, mutation: Mutations::BillableMetrics::Create - field :destroy_billable_metric, mutation: Mutations::BillableMetrics::Destroy - field :update_billable_metric, mutation: Mutations::BillableMetrics::Update - - field :create_adjusted_fee, mutation: Mutations::AdjustedFees::Create - field :destroy_adjusted_fee, mutation: Mutations::AdjustedFees::Destroy - - field :create_plan, mutation: Mutations::Plans::Create - field :destroy_plan, mutation: Mutations::Plans::Destroy - field :update_plan, mutation: Mutations::Plans::Update - - field :create_customer, mutation: Mutations::Customers::Create - field :destroy_customer, mutation: Mutations::Customers::Destroy - field :update_customer, mutation: Mutations::Customers::Update - field :update_customer_invoice_grace_period, mutation: Mutations::Customers::UpdateInvoiceGracePeriod - - field :download_customer_portal_invoice, mutation: Mutations::CustomerPortal::DownloadInvoice - field :generate_customer_portal_url, mutation: Mutations::CustomerPortal::GenerateUrl - - field :create_invoices_data_export, mutation: Mutations::DataExports::Invoices::Create - - field :create_subscription, mutation: Mutations::Subscriptions::Create - field :terminate_subscription, mutation: Mutations::Subscriptions::Terminate - field :update_subscription, mutation: Mutations::Subscriptions::Update - - field :create_coupon, mutation: Mutations::Coupons::Create - field :destroy_coupon, mutation: Mutations::Coupons::Destroy - field :terminate_coupon, mutation: Mutations::Coupons::Terminate - field :update_coupon, mutation: Mutations::Coupons::Update - - field :create_applied_coupon, mutation: Mutations::AppliedCoupons::Create - field :terminate_applied_coupon, mutation: Mutations::AppliedCoupons::Terminate - - field :create_add_on, mutation: Mutations::AddOns::Create - field :destroy_add_on, mutation: Mutations::AddOns::Destroy - field :update_add_on, mutation: Mutations::AddOns::Update - - field :add_adyen_payment_provider, mutation: Mutations::PaymentProviders::Adyen::Create - field :add_gocardless_payment_provider, mutation: Mutations::PaymentProviders::Gocardless::Create - field :add_stripe_payment_provider, mutation: Mutations::PaymentProviders::Stripe::Create - - field :update_adyen_payment_provider, mutation: Mutations::PaymentProviders::Adyen::Update - field :update_gocardless_payment_provider, mutation: Mutations::PaymentProviders::Gocardless::Update - field :update_stripe_payment_provider, mutation: Mutations::PaymentProviders::Stripe::Update - - field :destroy_payment_provider, mutation: Mutations::PaymentProviders::Destroy - - field :create_netsuite_integration, mutation: Mutations::Integrations::Netsuite::Create - field :destroy_integration, mutation: Mutations::Integrations::Destroy - field :update_netsuite_integration, mutation: Mutations::Integrations::Netsuite::Update - - field :create_integration_mapping, mutation: Mutations::IntegrationMappings::Create - field :update_integration_mapping, mutation: Mutations::IntegrationMappings::Update - - field :create_integration_collection_mapping, mutation: Mutations::IntegrationCollectionMappings::Create - field :update_integration_collection_mapping, mutation: Mutations::IntegrationCollectionMappings::Update - - field :destroy_integration_collection_mapping, mutation: Mutations::IntegrationCollectionMappings::Destroy - field :destroy_integration_mapping, mutation: Mutations::IntegrationMappings::Destroy - - field :fetch_integration_accounts, mutation: Mutations::IntegrationItems::FetchAccounts - field :fetch_integration_items, mutation: Mutations::IntegrationItems::FetchItems - field :fetch_integration_tax_items, mutation: Mutations::IntegrationItems::FetchTaxItems - - field :sync_integration_credit_note, mutation: Mutations::Integrations::SyncCreditNote - field :sync_integration_invoice, mutation: Mutations::Integrations::SyncInvoice - - field :create_credit_note, mutation: Mutations::CreditNotes::Create - field :download_credit_note, mutation: Mutations::CreditNotes::Download - field :retry_tax_reporting, mutation: Mutations::CreditNotes::RetryTaxReporting - field :update_credit_note, mutation: Mutations::CreditNotes::Update - field :void_credit_note, mutation: Mutations::CreditNotes::Void - - field :create_invoice, mutation: Mutations::Invoices::Create - field :download_invoice, mutation: Mutations::Invoices::Download - field :finalize_all_invoices, mutation: Mutations::Invoices::FinalizeAll - field :finalize_invoice, mutation: Mutations::Invoices::Finalize - field :lose_invoice_dispute, mutation: Mutations::Invoices::LoseDispute - field :refresh_invoice, mutation: Mutations::Invoices::Refresh - field :retry_all_invoice_payments, mutation: Mutations::Invoices::RetryAllPayments - field :retry_all_invoices, mutation: Mutations::Invoices::RetryAll - field :retry_invoice, mutation: Mutations::Invoices::Retry - field :retry_invoice_payment, mutation: Mutations::Invoices::RetryPayment - field :retry_tax_provider_voiding, mutation: Mutations::Invoices::RetryTaxProviderVoiding - field :update_invoice, mutation: Mutations::Invoices::Update - field :void_invoice, mutation: Mutations::Invoices::Void - - field :create_customer_wallet, mutation: Mutations::Wallets::Create - field :terminate_customer_wallet, mutation: Mutations::Wallets::Terminate - field :update_customer_wallet, mutation: Mutations::Wallets::Update - - field :create_customer_wallet_transaction, mutation: Mutations::WalletTransactions::Create - - field :accept_invite, mutation: Mutations::Invites::Accept - field :create_invite, mutation: Mutations::Invites::Create - field :revoke_invite, mutation: Mutations::Invites::Revoke - field :update_invite, mutation: Mutations::Invites::Update - - field :revoke_membership, mutation: Mutations::Memberships::Revoke - field :update_membership, mutation: Mutations::Memberships::Update - - field :create_payment_request, mutation: Mutations::PaymentRequests::Create - - field :create_password_reset, mutation: Mutations::PasswordResets::Create - field :reset_password, mutation: Mutations::PasswordResets::Reset - - field :create_tax, mutation: Mutations::Taxes::Create - field :destroy_tax, mutation: Mutations::Taxes::Destroy - field :update_tax, mutation: Mutations::Taxes::Update - - field :retry_webhook, mutation: Mutations::Webhooks::Retry - - field :create_webhook_endpoint, mutation: Mutations::WebhookEndpoints::Create - field :destroy_webhook_endpoint, mutation: Mutations::WebhookEndpoints::Destroy - field :update_webhook_endpoint, mutation: Mutations::WebhookEndpoints::Update - - field :google_accept_invite, mutation: Mutations::Auth::Google::AcceptInvite - field :google_login_user, mutation: Mutations::Auth::Google::LoginUser - field :google_register_user, mutation: Mutations::Auth::Google::RegisterUser - - field :create_okta_integration, mutation: Mutations::Integrations::Okta::Create - field :update_okta_integration, mutation: Mutations::Integrations::Okta::Update - - field :create_anrok_integration, mutation: Mutations::Integrations::Anrok::Create - field :update_anrok_integration, mutation: Mutations::Integrations::Anrok::Update - - field :fetch_draft_invoice_taxes, mutation: Mutations::Integrations::Anrok::FetchDraftInvoiceTaxes - - field :create_xero_integration, mutation: Mutations::Integrations::Xero::Create - field :update_xero_integration, mutation: Mutations::Integrations::Xero::Update - - field :create_hubspot_integration, mutation: Mutations::Integrations::Hubspot::Create - field :update_hubspot_integration, mutation: Mutations::Integrations::Hubspot::Update - - field :okta_accept_invite, mutation: Mutations::Auth::Okta::AcceptInvite - field :okta_authorize, mutation: Mutations::Auth::Okta::Authorize - field :okta_login, mutation: Mutations::Auth::Okta::Login - end -end diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb deleted file mode 100644 index 7f6cfbe1c92..00000000000 --- a/app/graphql/types/query_type.rb +++ /dev/null @@ -1,71 +0,0 @@ -# frozen_string_literal: true - -# TODO(graphql_schema): This class is deprecated and should be removed. -module Types - # QueryType - class QueryType < Types::BaseObject - # Add `node(id: ID!) and `nodes(ids: [ID!]!)` - include GraphQL::Types::Relay::HasNodeField - include GraphQL::Types::Relay::HasNodesField - - field :current_user, resolver: Resolvers::CurrentUserResolver - - field :add_on, resolver: Resolvers::AddOnResolver - field :add_ons, resolver: Resolvers::AddOnsResolver - field :billable_metric, resolver: Resolvers::BillableMetricResolver - field :billable_metrics, resolver: Resolvers::BillableMetricsResolver - field :coupon, resolver: Resolvers::CouponResolver - field :coupons, resolver: Resolvers::CouponsResolver - field :credit_note, resolver: Resolvers::CreditNoteResolver - field :credit_note_estimate, resolver: Resolvers::CreditNotes::EstimateResolver - field :credit_notes, resolver: Resolvers::CreditNotesResolver - field :current_version, resolver: Resolvers::VersionResolver - field :customer, resolver: Resolvers::CustomerResolver - field :customer_invoices, resolver: Resolvers::Customers::InvoicesResolver - field :customer_portal_invoice_collections, resolver: Resolvers::CustomerPortal::Analytics::InvoiceCollectionsResolver - field :customer_portal_invoices, resolver: Resolvers::CustomerPortal::InvoicesResolver - field :customer_portal_organization, resolver: Resolvers::CustomerPortal::OrganizationResolver - field :customer_portal_overdue_balances, resolver: Resolvers::CustomerPortal::Analytics::OverdueBalancesResolver - field :customer_portal_user, resolver: Resolvers::CustomerPortal::CustomerResolver - field :customer_usage, resolver: Resolvers::Customers::UsageResolver - field :customers, resolver: Resolvers::CustomersResolver - field :events, resolver: Resolvers::EventsResolver - field :google_auth_url, resolver: Resolvers::Auth::Google::AuthUrlResolver - field :gross_revenues, resolver: Resolvers::Analytics::GrossRevenuesResolver - field :integration, resolver: Resolvers::IntegrationResolver - field :integration_collection_mapping, resolver: Resolvers::IntegrationCollectionMappingResolver - field :integration_collection_mappings, resolver: Resolvers::IntegrationCollectionMappingsResolver - field :integration_items, resolver: Resolvers::IntegrationItemsResolver - field :integration_mapping, resolver: Resolvers::IntegrationMappingResolver - field :integration_mappings, resolver: Resolvers::IntegrationMappingsResolver - field :integration_subsidiaries, resolver: Resolvers::Integrations::SubsidiariesResolver - field :integrations, resolver: Resolvers::IntegrationsResolver - field :invite, resolver: Resolvers::InviteResolver - field :invites, resolver: Resolvers::InvitesResolver - field :invoice, resolver: Resolvers::InvoiceResolver - field :invoice_collections, resolver: Resolvers::Analytics::InvoiceCollectionsResolver - field :invoice_credit_notes, resolver: Resolvers::InvoiceCreditNotesResolver - field :invoiced_usages, resolver: Resolvers::Analytics::InvoicedUsagesResolver - field :invoices, resolver: Resolvers::InvoicesResolver - field :memberships, resolver: Resolvers::MembershipsResolver - field :mrrs, resolver: Resolvers::Analytics::MrrsResolver - field :organization, resolver: Resolvers::OrganizationResolver - field :overdue_balances, resolver: Resolvers::Analytics::OverdueBalancesResolver - field :password_reset, resolver: Resolvers::PasswordResetResolver - field :payment_provider, resolver: Resolvers::PaymentProviderResolver - field :payment_providers, resolver: Resolvers::PaymentProvidersResolver - field :payment_requests, resolver: Resolvers::PaymentRequestsResolver - field :plan, resolver: Resolvers::PlanResolver - field :plans, resolver: Resolvers::PlansResolver - field :subscription, resolver: Resolvers::SubscriptionResolver - field :subscriptions, resolver: Resolvers::SubscriptionsResolver - field :tax, resolver: Resolvers::TaxResolver - field :taxes, resolver: Resolvers::TaxesResolver - field :wallet, resolver: Resolvers::WalletResolver - field :wallet_transactions, resolver: Resolvers::WalletTransactionsResolver - field :wallets, resolver: Resolvers::WalletsResolver - field :webhook_endpoint, resolver: Resolvers::WebhookEndpointResolver - field :webhook_endpoints, resolver: Resolvers::WebhookEndpointsResolver - field :webhooks, resolver: Resolvers::WebhooksResolver - end -end diff --git a/config/routes.rb b/config/routes.rb index dbe5301bd9d..3fa64c894f5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,9 +4,6 @@ mount Sidekiq::Web, at: '/sidekiq' if defined? Sidekiq::Web mount Karafka::Web::App, at: '/karafka' if ENV['KARAFKA_WEB'] - # TODO(graphql_schema): This route is deprecated and should be removed. - post '/graphql', to: 'graphql#execute' - post '/api/graphql', to: 'graphql/api#execute' post '/customer_portal/graphql', to: 'graphql/customer_portal#execute' diff --git a/spec/graphql/lago_api_schema_spec.rb b/spec/graphql/lago_api_schema_spec.rb deleted file mode 100644 index db5e84cf32d..00000000000 --- a/spec/graphql/lago_api_schema_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe LagoApiSchema do - it 'matches the dumped schema' do - aggregate_failures do - expect(described_class.to_definition.rstrip).to eq(File.read(Rails.root.join('schema.graphql')).rstrip) - expect(described_class.to_json.rstrip).to eq(File.read(Rails.root.join('schema.json')).rstrip) - end - end -end