/*
  2.21.0.0
*/
{
  //
  // The application name used to set the application name property in connection string by "NpgsqlRest"."SetApplicationNameInConnection" or the "NpgsqlRest"."UseJsonApplicationName" settings.
  // It is the name of the top-level directory set to null.
  //
  "ApplicationName": null,
  //
  // Logs at startup, placeholders:
  // {0} - startup time
  // {1} - listening on urls
  // {2} - current version
  //
  "StartupMessage": "Started in {0}, listening on {1}, version {2}",

  //
  // Production or Development
  //
  "EnvironmentName": "Production",

  "Config": {
    //
    // Expose current configuration to the endpoint for debugging and inspection. Note, the password in the connection string is not exposed.
    //
    //"ExposeAsEndpoint": "/config",
    "ExposeAsEndpoint": null,
    //
    // Add the environment variables to configuration first.
    //
    "AddEnvironmentVariables": false
  },

  "ConnectionStrings": {
    //
    // See https://www.npgsql.org/doc/connection-string-parameters.html
    //
    "Default": ""
  },

  "ConnectionSettings": {
    //
    // Use the environment variables to set the connection string parameters. Default environment variables are defined below.
    //
    // Connection parameter will be set from the environment variables if this option is enabled and the environment variables are set.
    // Note: When this option is enabled and these environment variables are set, connection string doesn't have to be defined at all and it will be created from the environment variables.
    //
    "UseEnvVars": false,
    //
    // When UseEnvVars is set to true, try to match environment variable names with Npgsql Connection String Parameter Names (https://www.npgsql.org/doc/connection-string-parameters.html).
    // This value is string format placeholder for the connection string parameter name in upper case and spaces replaced by underscores.
    // For example parameter name "SSL Password" would be matched for environment variable name "SSL_PASSWORD".
    // Use the string format placeholder to add additional prefixes or suffixes, like "SERVICE1_{0}" to match "SSL Password" for "SERVICE1_SSL_PASSWORD" environment variable.
    // Set to null or empty string to ignore.
    //
    "MatchNpgsqlConnectionParameterNamesWithEnvVarNames": "NGPSQLREST_{0}_{1}",
    //
    // If connection string parameter is set, the environment variables will be used to override the connection string parameters.
    // When this option is disabled (false), connection parameters will be set from the environment variables only if the connection string parameter is not set.
    //
    "EnvVarsOverride": false,
    //
    // Name of the host environment variable.
    //
    "HostEnvVar": "PGHOST",
    //
    // Name of the port environment variable.
    //
    "PortEnvVar": "PGPORT",
    //
    // Name of the database environment variable.
    //
    "DatabaseEnvVar": "PGDATABASE",
    //
    // The user name to use for the connection string parameters.
    //
    "UserEnvVar": "PGUSER",
    //
    // Name of the password environment variable.
    //
    "PasswordEnvVar": "PGPASSWORD",
    //
    // Sets the ApplicationName connection property in the connection string to the value of the ApplicationName configuration.
    // Note: This option is ignored if the UseJsonApplicationName option is enabled.
    //
    "SetApplicationNameInConnection": true,
    //
    // Sets the ApplicationName connection property dynamically on every request in the following format: 
    // {"app": [Application Name], "uid": [User Id for authenticated users or NULL], "id": [Value of X-Execution-Id request header or NULL]}
    // Note: ApplicationName connection property is limited to 64 characters.
    //
    "UseJsonApplicationName": false,
    //
    // Test any connection string before initializing the application and using it. The connection string is tested by opening and closing the connection.
    //
    "TestConnectionStrings": true
  },

  //
  // Specify the urls the web host will listen on. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.hostingabstractionswebhostbuilderextensions.useurls?view=aspnetcore-8.0
  //
  "Urls": "http://localhost:5000;http://localhost:5001",

  //
  // Enable to invoke UseKestrelHttpsConfiguration. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.webhostbuilderkestrelextensions.usekestrelhttpsconfiguration?view=aspnetcore-8.0
  //
  "Ssl": {
    "Enabled": false,
    //
    // Adds middleware for redirecting HTTP Requests to HTTPS. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.httpspolicybuilderextensions.usehttpsredirection?view=aspnetcore-8.0
    //
    "HttpsRedirection": true,
    //
    // Adds middleware for using HSTS, which adds the Strict-Transport-Security header. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.hstsbuilderextensions.usehsts?view=aspnetcore-2.1
    //
    "UseHsts": true
  },

  //
  // Data protection settings. Encryption keys for Auth Cookies and Antiforgery tokens.
  //
  "DataProtection": {
    "Enabled": true,
    //
    // Set to null to use the current "ApplicationName"
    //
    "CustomApplicationName": null,
    //
    // Sets the default lifetime in days of keys created by the data protection system.
    //
    "DefaultKeyLifetimeDays": 90,
    //
    // Data protection location: "Default", "FileSystem" or "Database"
    //
    // Note: When running on Linux, using Default keys will not be persisted. 
    // When keys are lost on restarts, Cookie Auth and Antiforgery tokens will also not work on restart.
    // Linux users should use FileSystem or Database storage.
    //
    "Storage": "Default",
    //
    // FileSystem storage path. Set to a valid path when using FileSystem.
    // Note: When running in Docker environment, the path must be a Docker volume path.
    //
    "FileSystemPath": "./data-protection-keys",
    //
    // GetAllElements database command. Expected to rows with a single column of type text.
    //
    "GetAllElementsCommand": "select get_data_protection_keys()",
    //
    // StoreElement database command. Receives two parameters: name and data of type text. Doesn't return anything.
    //
    "StoreElementCommand": "call store_data_protection_keys($1,$2)"
  },

  // //
  // // Uncomment to configure Kestrel web server and to add certificates
  // // See https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/endpoints?view=aspnetcore-8.0
  // //
  // "Kestrel": {
  //     "Endpoints": {
  //         "Http": {
  //             "Url": "http://localhost:5000"
  //         },
  //         "HttpsInlineCertFile": {
  //             "Url": "https://localhost:5001",
  //             "Certificate": {
  //                 "Path": "<path to .pfx file>",
  //                 "Password": "$CREDENTIAL_PLACEHOLDER$"
  //             }
  //         },
  //         "HttpsInlineCertAndKeyFile": {
  //             "Url": "https://localhost:5002",
  //             "Certificate": {
  //                 "Path": "<path to .pem/.crt file>",
  //                 "KeyPath": "<path to .key file>",
  //                 "Password": "$CREDENTIAL_PLACEHOLDER$"
  //             }
  //         },
  //         "HttpsInlineCertStore": {
  //             "Url": "https://localhost:5003",
  //             "Certificate": {
  //                 "Subject": "<subject; required>",
  //                 "Store": "<certificate store; required>",
  //                 "Location": "<location; defaults to CurrentUser>",
  //                 "AllowInvalid": "<true or false; defaults to false>"
  //             }
  //         },
  //         "HttpsDefaultCert": {
  //             "Url": "https://localhost:5004"
  //         }
  //     },
  //     "Certificates": {
  //         "Default": {
  //             "Path": "<path to .pfx file>",
  //             "Password": "$CREDENTIAL_PLACEHOLDER$"
  //         }
  //     }
  // },

  //
  // Authentication and Authorization settings
  //
  "Auth": {
    //
    // Enable Cookie Auth
    //
    "CookieAuth": false,
    "CookieAuthScheme": null,
    "CookieValidDays": 14,
    "CookieName": null,
    "CookiePath": null,
    "CookieDomain": null,
    "CookieMultiSessions": true,
    "CookieHttpOnly": true,

    //
    // Enable Microsoft Bearer Token Auth
    //
    "BearerTokenAuth": false,
    "BearerTokenAuthScheme": null,
    "BearerTokenExpireHours": 1,
    // POST { "refresh": "{{!refreshToken!}}" }
    "BearerTokenRefreshPath": "/api/token/refresh",

    // 
    // Enable external auth providers
    //
    "External": {
      "Enabled": false,
      //
      // sessionStorage key to store the status of the external auth process returned by the signin page.
      // The value is HTTP status code (200 for success, 401 for unauthorized, 403 for forbidden, etc.)
      //
      "BrowserSessionStatusKey": "__external_status",
      //
      // sessionStorage key to store the message of the external auth process returned by the signin page.
      //
      "BrowserSessionMessageKey": "__external_message",
      //
      // Path to the signin page to handle the external auth process. Redirect to this page to start the external auth process.
      // Format placeholder {0} is the provider name in lowercase (google, linkedin, github, etc.)
      //
      "SigninUrl": "/signin-{0}",
      //
      // Sign in page template. Format placeholders {0} is the provider name, {1} is the script to redirect to the external auth provider.
      //
      "SignInHtmlTemplate": "<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><title>Talking To {0}</title></head><body>Loading...{1}</body></html>",
      //
      // URL to redirect after the external auth process is completed. Usually this is resolved from the request automatically. Except when it's not.
      // 
      "RedirectUrl": null,
      //
      // Path to redirect after the external auth process is completed. 
      // 
      "ReturnToPath": "/",
      //
      // Query string key to store the path to redirect after the external auth process is completed.
      // Use this to set dynamic return path. If this query string key is not found, the ReturnToPath value is used.
      // 
      "ReturnToPathQueryStringKey": "return_to",
      //
      // Login command to execute after the external auth process is completed. Parameters:
      //   - external login provider (if param exists)
      //   - external login email (if param exists)
      //   - external login name (if param exists)
      //   - external login json data received (if param exists)
      //   - client browser analytics json data (if param exists)
      // Please use PostgreSQL parameter placeholders for the parameters ($1, $2, $3).
      //
      // The command uses the same rules as the login enabled routine. 
      // See: https://vb-consulting.github.io/npgsqlrest/login-endpoints and https://vb-consulting.github.io/npgsqlrest/login-endpoints/#external-logins
      //
      "LoginCommand": "select * from external_login($1,$2,$3,$4,$5)",
      //
      // Browser client analytics data that will be sent as JSON to external auth command as 5th parameter if supplied.
      //
      "ClientAnaliticsData": "{timestamp:new Date().toISOString(),timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,screen:{width:window.screen.width,height:window.screen.height,colorDepth:window.screen.colorDepth,pixelRatio:window.devicePixelRatio,orientation:screen.orientation.type},browser:{userAgent:navigator.userAgent,language:navigator.language,languages:navigator.languages,cookiesEnabled:navigator.cookieEnabled,doNotTrack:navigator.doNotTrack,onLine:navigator.onLine,platform:navigator.platform,vendor:navigator.vendor},memory:{deviceMemory:navigator.deviceMemory,hardwareConcurrency:navigator.hardwareConcurrency},window:{innerWidth:window.innerWidth,innerHeight:window.innerHeight,outerWidth:window.outerWidth,outerHeight:window.outerHeight},location:{href:window.location.href,hostname:window.location.hostname,pathname:window.location.pathname,protocol:window.location.protocol,referrer:document.referrer},performance:{navigation:{type:performance.navigation?.type,redirectCount:performance.navigation?.redirectCount},timing:performance.timing?{loadEventEnd:performance.timing.loadEventEnd,loadEventStart:performance.timing.loadEventStart,domComplete:performance.timing.domComplete,domInteractive:performance.timing.domInteractive,domContentLoadedEventEnd:performance.timing.domContentLoadedEventEnd}:null}}",
      //
      // Client IP address that will be added to the client analytics data under this JSON key.
      //
      "ClientAnaliticsIpKey": "ip",
      //
      // External providers
      //
      "Google": {
        //
        // visit https://console.cloud.google.com/apis/ to configure your google app and get your client id and client secret
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id={0}&redirect_uri={1}&scope=openid profile email&state={2}",
        "TokenUrl": "https://oauth2.googleapis.com/token",
        "InfoUrl": "https://www.googleapis.com/oauth2/v3/userinfo",
        "EmailUrl": null
      },
      "LinkedIn": {
        //
        // visit https://www.linkedin.com/developers/apps/ to configure your linkedin app and get your client id and client secret
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id={0}&redirect_uri={1}&state={2}&scope=r_liteprofile%20r_emailaddress",
        "TokenUrl": "https://www.linkedin.com/oauth/v2/accessToken",
        "InfoUrl": "https://api.linkedin.com/v2/me",
        "EmailUrl": "https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements//(handle~))"
      },
      "GitHub": {
        //
        // visit https://github.com/settings/developers/ to configure your github app and get your client id and client secret
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://github.com/login/oauth/authorize?client_id={0}&redirect_uri={1}&state={2}&allow_signup=false",
        "TokenUrl": "https://github.com/login/oauth/access_token",
        "InfoUrl": "https://api.github.com/user",
        "EmailUrl": null
      },
      "Microsoft": {
        //
        // visit https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade to configure your Microsoft app and get your client id and client secret
        // Documentation: https://learn.microsoft.com/en-us/entra/identity-platform/
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=code&client_id={0}&redirect_uri={1}&scope=openid%20profile%20email&state={2}",
        "TokenUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
        "InfoUrl": "https://graph.microsoft.com/oidc/userinfo",
        "EmailUrl": null
      },
      "Facebook": {
        //
        // visit https://developers.facebook.com/apps/ to configure your Facebook app and get your client id and client secret
        // Documentation: https://developers.facebook.com/docs/facebook-login/
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://www.facebook.com/v20.0/dialog/oauth?response_type=code&client_id={0}&redirect_uri={1}&scope=public_profile%20email&state={2}",
        "TokenUrl": "https://graph.facebook.com/v20.0/oauth/access_token",
        "InfoUrl": "https://graph.facebook.com/me?fields=id,name,email",
        "EmailUrl": null
      }
    }
  },

  //
  // Serilog settings
  //
  "Log": {
    //
    // See https://github.com/serilog/serilog/wiki/Configuration-Basics#minimum-level
    //
    "MinimalLevels": {
      "System": "Warning",
      "Microsoft": "Warning"
    },
    "ToConsole": true,
    "ConsoleMinimumLevel": "Verbose",
    "ToFile": false,
    "FilePath": "logs/log.txt",
    "FileSizeLimitBytes": 30000000,
    "FileMinimumLevel": "Verbose",
    "RetainedFileCountLimit": 30,
    "RollOnFileSizeLimit": true,
    "ToPostgres": false,
    // $1 - log level text, $2 - message text, $3 - timestamp with tz in utc, $4 - exception text or null, $5 - source context
    "PostgresCommand": "call log($1,$2,$3,$4,$5)",
    "PostgresMinimumLevel": "Verbose",
    //
    // See https://github.com/serilog/serilog/wiki/Formatting-Output
    //
    "OutputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
  },

  //
  // Response compression settings
  //
  "ResponseCompression": {
    "Enabled": false,
    "EnableForHttps": false,
    "UseBrotli": true,
    "UseGzipFallback": true,
    "CompressionLevel": "Optimal", // Optimal, Fastest, NoCompression, SmallestSize
    "IncludeMimeTypes": [
      "text/plain",
      "text/css",
      "application/javascript",
      "text/html",
      "application/xml",
      "text/xml",
      "application/json",
      "text/json",
      "image/svg+xml",
      "font/woff",
      "font/woff2",
      "application/font-woff",
      "application/font-woff2"
    ],
    "ExcludeMimeTypes": []
  },

  "Antiforgery": {
    "Enabled": false,
    "CookieName": null,
    "FormFieldName": "__RequestVerificationToken",
    "HeaderName": "RequestVerificationToken",
    "SuppressReadingTokenFromFormBody": false,
    "SuppressXFrameOptionsHeader": false
  },

  //
  // Static files settings 
  //
  "StaticFiles": {
    "Enabled": false,
    "RootPath": "wwwroot",
    "ParseContentOptions": {
      //
      // Enable or disable the parsing of the static files.
      // When enabled, the static files will be parsed and the tags will be replaced with the values from the claims collection.
      //
      "Enabled": false,
      //
      // Set to true to cache the parsed files in memory. This will improve the performance of the static files. It only applies to parsed content.
      //
      "CacheParsedFile": true,
      //
      // List of static file patterns that will parse the content and replace the tags with the values from the claims collection.
      // File paths are relative to the RootPath property and pattern matching is case-insensitive.
      // Pattern can include wildcards or question marks. For example: *.html, *.htm, *.txt, *.json, *.xml, *.css, *.js
      // 
      "FilePaths": [ "*.html" ],
      //
      // Tag name to be replaced with authenticated user id for example {userId}
      //
      "UserIdTag": "userId",
      //
      // Tag name to be replaced with authenticated user name
      //
      "UserNameTag": "userName",
      //
      // Tag name to be replaced with authenticated user roles
      //
      "UserRolesTag": "userRoles",
      //
      // Tag names to be replaced with the values from the claims collection
      //
      "CustomTagToClaimMappings": {},
      //
      // Name of the configured Antiforgery form field name to be used in the static files (see Antiforgery FormFieldName setting).
      //
      "AntiforgeryFieldName": "antiForgeryFieldName",
      //
      // Value of the Antiforgery token if Antiforgery is enabled..
      //
      "AntiforgeryToken": "antiForgeryToken"
    }
  },

  //
  // Cross-origin resource sharing 
  //
  "Cors": {
    "Enabled": false,
    "AllowedOrigins": [],
    "AllowedMethods": [
      "*"
    ],
    "AllowedHeaders": [
      "*"
    ]
  },

  //
  // https://vb-consulting.github.io/npgsqlrest/
  //
  "NpgsqlRest": {
    //
    // Connection name to be used from the ConnectionStrings section or NULL to use the first avaialable connection string.
    //
    "ConnectionName": null,
    //
    // Allow using multiple connections from the ConnectionStrings section. When set to true, the connection name can be set for the individual Routine.
    // Some routines might use the primary database connection string, while others might want to use a read-only connection string from the replica servers.
    //
    "UseMultipleConnections": false,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#schemasimilarto
    //
    "SchemaSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#schemanotsimilarto
    //
    "SchemaNotSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#includeschemas
    //
    "IncludeSchemas": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#excludeschemas
    //
    "ExcludeSchemas": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#namesimilarto
    //
    "NameSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#namenotsimilarto
    //
    "NameNotSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#includenames
    //
    "IncludeNames": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#excludenames
    //
    "ExcludeNames": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#commentsmode
    //
    "CommentsMode": "OnlyWithHttpTag",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#urlpathprefix
    //
    "UrlPathPrefix": "/api",
    //
    // Convert all URL paths to kebab-case from the original PostgreSQL names.
    //
    "KebabCaseUrls": true,
    //
    // Convert all parameter names to camel case from the original PostgreSQL paramater names.
    //
    "CamelCaseNames": true,
    //
    // Set to true to force all created endpoints to require authorization.
    // See https://vb-consulting.github.io/npgsqlrest/options/#requiresauthorization
    //
    "RequiresAuthorization": true,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logendpointcreatedinfo
    //
    "LogEndpointCreatedInfo": true,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logannotationsetinfo
    //
    "LogAnnotationSetInfo": true,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logconnectionnoticeevents
    //
    "LogConnectionNoticeEvents": true,
    //
    // see https://vb-consulting.github.io/npgsqlrest/options/#logconnectionnoticeeventsmode
    //
    "LogConnectionNoticeEventsMode": "FirstStackFrameAndMessage",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logcommands
    //
    "LogCommands": false,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logcommandparameters
    //
    "LogCommandParameters": false,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#commandtimeout
    //
    "CommandTimeout": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#defaulthttpmethod
    //
    "DefaultHttpMethod": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#defaultrequestparamtype
    //
    "DefaultRequestParamType": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#requestheadersmode
    //
    "RequestHeadersMode": "Ignore",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#requestheadersparametername
    //
    "RequestHeadersParameterName": "_headers",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#returnnpgsqlexceptionmessage
    //
    "ReturnNpgsqlExceptionMessage": true,
    //
    // https://vb-consulting.github.io/npgsqlrest/options/#postgresqlerrorcodetohttpstatuscodemapping
    //
    "PostgreSqlErrorCodeToHttpStatusCodeMapping": {
      "57014": 205,
      "P0001": 400, // PL/pgSQL raise exception
      "P0004": 400 // PL/pgSQL assert failure
    },
    //
    // Add the unique NpgsqlRest instance id request header with this name to the response or set to null to ignore.
    //
    "InstanceIdRequestHeaderName": null,
    //
    // https://vb-consulting.github.io/npgsqlrest/options/#customrequestheaders
    //
    "CustomRequestHeaders": {
    },

    //
    // Options for handling PostgreSQL routines (functions and procedures)
    //
    "RoutineOptions": {
      //
      // Name separator for parameter names when using custom type parameters. 
      // Parameter names will be in the format: {ParameterName}{CustomTypeParameterSeparator}{CustomTypeFieldName}. When NULL, default underscore is used.
      // This is used in when using custom types for parameters, for example: create type custom_type1 as (value text); and parameter _p custom_type1. This name will be merged into _p_value
      //
      "CustomTypeParameterSeparator": null,
      //
      // List of PostgreSQL routine language names to include. If NULL, all languages are included. Names are case-insensitive.
      //
      "IncludeLanguagues": null,
      //
      // List of PostgreSQL routine language names to exclude. If NULL, "C" and "INTERNAL" are excluded by default. Names are case-insensitive.
      //
      "ExcludeLanguagues": null
    },

    //
    // Upload handlers options
    //
    "UploadHandlers": {
      //
      // Handler that will be used when upload handler or handlers are not specified.
      //
      "DefaultUploadHandler": "large_object",
      "LogUploadEvent": true,
      //
      // Enables upload handlers for the NpgsqlRest endpoints that uses PostgreSQL Large Objects API
      //
      "LargeObjectEnabled": true,
      // csv string containing mime type patters, set to null to ignore
      "LargeObjectIncludedMimeTypePatterns": null,
      // csv string containing mime type patters, set to null to ignore
      "LargeObjectExcludedMimeTypePatterns": null,
      "LargeObjectKey": "large_object",
      "LargeObjectHandlerBufferSize": 8192,

      //
      // Enables upload handlers for the NpgsqlRest endpoints that uses file system
      //
      "FileSystemEnabled": true,
      // csv string containing mime type patters, set to null to ignore
      "FileSystemIncludedMimeTypePatterns": null,
      // csv string containing mime type patters, set to null to ignore
      "FileSystemExcludedMimeTypePatterns": null,
      "FileSystemKey": "file_system",
      "FileSystemHandlerPath": "/tmp/uploads",
      "FileSystemHandlerUseUniqueFileName": true,
      "FileSystemHandlerCreatePathIfNotExists": true,
      "FileSystemHandlerBufferSize": 8192,

      //
      // Enables upload handlers for the NpgsqlRest endpoints that uploads CSV files to a row command
      //
      "CsvUploadEnabled": true,
      "CsvUploadIncludedMimeTypePatterns": null,
      "CsvUploadExcludedMimeTypePatterns": null,
      "CsvUploadCheckFileStatus": true,
      "CsvUploadTestBufferSize": 4096,
      "CsvUploadNonPrintableThreshold": 5,
      "CsvUploadDelimiterChars": ",",
      "CsvUploadHasFieldsEnclosedInQuotes": true,
      "CsvUploadSetWhiteSpaceToNull": true,
      //
      // $1 - row index (1-based), $2 - parsed value text array, $3 - result of previous row command, $4 - json metadata for upload
      //
      "CsvUploadRowCommand": "call process_csv_row($1,$2,$3,$4)"
    },

    //
    // Options for refresh metadata endpoint
    //
    "RefreshOptions": {
      //
      // Refresh metadata endpoint enabled
      //
      "Enabled": false,
      //
      // Refresh metadata endpoint path
      //
      "Path": "/api/npgsqlrest/refresh",
      //
      // Refresh metadata endpoint HTTP method
      //
      "Method": "GET"
    },

    //
    // Authentication options for NpgsqlRest endpoints
    //
    "AuthenticationOptions": {
      //
      // Url path that will be used for the login endpoint. If NULL, the login endpoint will not be created.
      // See more on login endpoints at https://vb-consulting.github.io/npgsqlrest/login-endpoints
      //
      "LoginPath": null,
      //
      // Url path that will be used for the logout endpoint. If NULL, the logout endpoint will not be created.
      // See more on logout endpoints at https://vb-consulting.github.io/npgsqlrest/annotations/#logout
      //
      "LogoutPath": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#authenticationoptionsdefaultauthenticationtype
      // (Default value is set from the ApplicationName configuration property)
      //
      "DefaultAuthenticationType": null,
      //
      // Command that is executed when the password verification fails. There are three text parameters:
      //     - scheme: authentication scheme used for the login (if exists)
      //     - user_name: user id used for the login (if exists)
      //     - user_id: user id used for the login (if exists)
      // Please use PostgreSQL parameter placeholders for the parameters ($1, $2, $3).
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#authenticationoptionsdefaultauthenticationtype
      //
      "PasswordVerificationFailedCommand": null,
      //
      // Name of the PostgreSQL text parameter that will be used to pass the authenticated user id to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "UserIdParameterName": null,
      //
      // Name of the PostgreSQL text parameter that will be used to pass the authenticated user name to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "UserNameParameterName": null,
      //
      // Name of the PostgreSQL text array parameter that will be used to pass the authenticated user roles list to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "UserRolesParameterName": null,
      //
      // Custom mapping of the parameter names to the claim names. When this parameter name is found in the claim collection by the key, the value of the claim is passed to the PostgreSQL routine.
      //
      "IpAddressParameterName": null,
      //
      // Name of the PostgreSQL text parameter that will be used to pass the IP address to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "CustomParameterNameToClaimMappings": {},
      //
      // Bind routine parameter names with matching name to the name configured in these settings:  UserIdParameterName, UserNameParameterName, UserRolesParameterName, IpAddressParameterName and CustomParameterNameToClaimMappings dictionary.
      //
      "BindParameters": true,
      //
      // Routines that have ParseResponse set to true, will parse the response before it is returned to the client by using name placeholders from this section.
      // Names are set in UserIdParameterName, UserNameParameterName, UserRolesParameterName, IpAddressParameterName and CustomParameterNameToClaimMappings dictionary.
      // Use curly braces to define the name placeholders in the response. For example, {UserId} will be replaced with the value of the UserIdParameterName parameter.
      //
      "ParseResponse": false
    },

    // Defines the custom parameter value mappings for the PostgreSQL routines. Use this to set default parameter values by parameter name.
    "CustomParameterMappings": {},

    //
    // Enable or disable the generation of HTTP files for NpgsqlRest endpoints.
    // See more on HTTP files at: 
    // https://marketplace.visualstudio.com/items?itemName=humao.rest-client or 
    // https://learn.microsoft.com/en-us/aspnet/core/test/http-files?view=aspnetcore-8.0
    //
    "HttpFileOptions": {
      "Enabled": false,
      //
      // Options for HTTP file generation:
      // - File: Generate HTTP files in the file system.
      // - Endpoint: Generate Endpoint(s) with HTTP file(s) content.
      // - Both: Generate HTTP files in the file system and Endpoint(s) with HTTP file(s) content.
      //
      "Option": "File",
      //
      // File name. If not set, the database name will be used if connection string is set. 
      // If neither ConnectionString nor Name is set, the file name will be "npgsqlrest".
      //
      "Name": null,
      //
      // The pattern to use when generating file names. {0} is database name, {1} is schema suffix with underline when FileMode is set to Schema.
      // Use this property to set the custom file name.
      // .http extension will be added automatically.
      //
      "NamePattern": "{0}_{1}",
      //
      // Adds comment header to above request based on PostgreSQL routine.
      // - None: skip.
      // - Simple: Add name, parameters and return values to comment header. This default.
      // - Full: Add the entire routine code as comment header.
      //
      "CommentHeader": "Simple",
      //
      // When CommentHeader is set to Simple or Full, set to true to include routine comments in comment header.
      //
      "CommentHeaderIncludeComments": true,
      //
      // - Database: to create one http file for entire database.
      // - Schema: to create one http file for each schema.
      //
      "FileMode": "Schema",
      //
      // Set to true to overwrite existing files.
      //
      "FileOverwrite": true
    },

    //
    // Enable or disable the generation of TypeScript/Javascript client source code files for NpgsqlRest endpoints.
    //
    "ClientCodeGen": {
      "Enabled": false,
      //
      // File path for the generated code. Set to null to skip the code generation. Use {0} to set schema name when BySchema is true
      //
      "FilePath": null,
      //
      //  Force file overwrite.
      //
      "FileOverwrite": true,
      //
      // Include current host information in the URL prefix.
      //
      "IncludeHost": true,
      //
      // Set the custom host prefix information.
      //
      "CustomHost": null,
      //
      // Adds comment header to above request based on PostgreSQL routine
      // Set None to skip.
      // Set Simple (default) to add name, parameters and return values to comment header.
      // Set Full to add the entire routine code as comment header.
      //
      "CommentHeader": "Simple",
      //
      // When CommentHeader is set to Simple or Full, set to true to include routine comments in comment header.
      //
      "CommentHeaderIncludeComments": true,
      //
      // Create files by PostgreSQL schema. File name will use formatted FilePath where {0} is is the schema name in the pascal case.
      //
      "BySchema": true,
      //
      // Set to true to include status code in response: {status: response.status, response: model}
      //
      "IncludeStatusCode": true,
      //
      // Create separate file with global types {name}Types.d.ts
      //
      "CreateSeparateTypeFile": true,
      //
      // Module name to import "baseUrl" constant, instead of defining it in a module.
      //
      "ImportBaseUrlFrom": null,
      //
      // Module name to import "pasreQuery" function, instead of defining it in a module.
      //
      "ImportParseQueryFrom": null,
      //
      // Include optional parameter `parseUrl: (url: string) => string = url=>url` that will parse constructed url.
      //
      "IncludeParseUrlParam": false,
      //
      // Include optional parameter `parseRequest: (request: RequestInit) => RequestInit = request=>request` that will parse constructed request.
      //
      "IncludeParseRequestParam": false,
      //
      // Header lines on a each auto-generated source file. Default is ["// autogenerated at {0}", "", ""] where {0} is current timestamp.
      //
      "HeaderLines": [
        "// autogenerated at {0}",
        ""
      ],
      //
      // Array of routine names to skip (without schema)
      //
      "SkipRoutineNames": [],
      //
      // Array of generated function names to skip (without schema)
      //
      "SkipFunctionNames": [],
      //
      // Array of url paths to skip
      //
      "SkipPaths": [],
      //
      // Array of schema names to skip
      //
      "SkipSchemas": [],
      //
      // Default TypeScript type for JSON types
      //
      "DefaultJsonType": "string",
      //
      // Use routine name instead of endpoint name when generating a function name.
      //
      "UseRoutineNameInsteadOfEndpoint": false,
      //
      // Export URLs as constants.
      //
      "ExportUrls": false,
      //
      // Skip generating types and produce pure JavaScript code. Setting this to true will also change .ts extension to .js where applicable.
      //
      "SkipTypes": false,
      //
      // Keep TypeScript models unique, meaning, models will same fields and types will be merged into one model with name of the last model. Significantly reduces number of generated models. 
      //
      "UniqueModels": false,
      //
      // Name of the XSRF Token Header (Anti-forgery Token). This is used in FORM POSTS to the server when Anti-forgery is enabled. Currently, only Upload requests use FORM POST.
      //
      "XsrfTokenHeaderName": null
    },

    //
    // CRUD endpoints for the PostgreSQL tables and views.
    //
    "CrudSource": {
      //
      // Enable or disable the creation of the endpoints for the PostgreSQL tables and views.
      //
      "Enabled": true,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#schemasimilarto
      //
      "SchemaSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#schemanotsimilarto
      //
      "SchemaNotSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#includeschemas
      //
      "IncludeSchemas": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#excludeschemas
      //
      "ExcludeSchemas": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#namesimilarto
      //
      "NameSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#namenotsimilarto
      //
      "NameNotSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#includenames
      //
      "IncludeNames": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#excludenames
      //
      "ExcludeNames": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#commentsmode
      //
      "CommentsMode": "OnlyWithHttpTag",
      //
      // URL pattern for all "returning" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "ReturningUrlPattern": "{0}/returning",
      //
      // URL pattern for all "do nothing" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoNothingUrlPattern": "{0}/on-conflict-do-nothing",
      //
      // URL pattern for all "do nothing returning " endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoNothingReturningUrlPattern": "{0}/on-conflict-do-nothing/returning",
      //
      // URL pattern for all "do update" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoUpdateUrlPattern": "{0}/on-conflict-do-update",
      //
      // URL pattern for all "do update returning" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoUpdateReturningUrlPattern": "{0}/on-conflict-do-update/returning",
      //
      // Set of flags to enable or disable the creation of the CRUD endpoints for the specific types of the PostgreSQL tables and views. 
      //
      // Possible values are: 
      // Select, Update, UpdateReturning, Insert, InsertReturning, InsertOnConflictDoNothing, InsertOnConflictDoUpdate, InsertOnConflictDoNothingReturning, 
      // InsertOnConflictDoUpdateReturning, Delete, DeleteReturning, All
      //
      "CrudTypes": [
        "All"
      ]
    }
  }
}
/*
  2.21.0.0
*/
{
  //
  // The application name used to set the application name property in connection string by "NpgsqlRest"."SetApplicationNameInConnection" or the "NpgsqlRest"."UseJsonApplicationName" settings.
  // It is the name of the top-level directory set to null.
  //
  "ApplicationName": null,
  //
  // Logs at startup, placeholders:
  // {0} - startup time
  // {1} - listening on urls
  // {2} - current version
  //
  "StartupMessage": "Started in {0}, listening on {1}, version {2}",

  //
  // Production or Development
  //
  "EnvironmentName": "Production",

  "Config": {
    //
    // Expose current configuration to the endpoint for debugging and inspection. Note, the password in the connection string is not exposed.
    //
    //"ExposeAsEndpoint": "/config",
    "ExposeAsEndpoint": null,
    //
    // Add the environment variables to configuration first.
    //
    "AddEnvironmentVariables": false
  },

  "ConnectionStrings": {
    //
    // See https://www.npgsql.org/doc/connection-string-parameters.html
    //
    "Default": ""
  },

  "ConnectionSettings": {
    //
    // Use the environment variables to set the connection string parameters. Default environment variables are defined below.
    //
    // Connection parameter will be set from the environment variables if this option is enabled and the environment variables are set.
    // Note: When this option is enabled and these environment variables are set, connection string doesn't have to be defined at all and it will be created from the environment variables.
    //
    "UseEnvVars": false,
    //
    // When UseEnvVars is set to true, try to match environment variable names with Npgsql Connection String Parameter Names (https://www.npgsql.org/doc/connection-string-parameters.html).
    // This value is string format placeholder for the connection string parameter name in upper case and spaces replaced by underscores.
    // For example parameter name "SSL Password" would be matched for environment variable name "SSL_PASSWORD".
    // Use the string format placeholder to add additional prefixes or suffixes, like "SERVICE1_{0}" to match "SSL Password" for "SERVICE1_SSL_PASSWORD" environment variable.
    // Set to null or empty string to ignore.
    //
    "MatchNpgsqlConnectionParameterNamesWithEnvVarNames": "NGPSQLREST_{0}_{1}",
    //
    // If connection string parameter is set, the environment variables will be used to override the connection string parameters.
    // When this option is disabled (false), connection parameters will be set from the environment variables only if the connection string parameter is not set.
    //
    "EnvVarsOverride": false,
    //
    // Name of the host environment variable.
    //
    "HostEnvVar": "PGHOST",
    //
    // Name of the port environment variable.
    //
    "PortEnvVar": "PGPORT",
    //
    // Name of the database environment variable.
    //
    "DatabaseEnvVar": "PGDATABASE",
    //
    // The user name to use for the connection string parameters.
    //
    "UserEnvVar": "PGUSER",
    //
    // Name of the password environment variable.
    //
    "PasswordEnvVar": "PGPASSWORD",
    //
    // Sets the ApplicationName connection property in the connection string to the value of the ApplicationName configuration.
    // Note: This option is ignored if the UseJsonApplicationName option is enabled.
    //
    "SetApplicationNameInConnection": true,
    //
    // Sets the ApplicationName connection property dynamically on every request in the following format: 
    // {"app": [Application Name], "uid": [User Id for authenticated users or NULL], "id": [Value of X-Execution-Id request header or NULL]}
    // Note: ApplicationName connection property is limited to 64 characters.
    //
    "UseJsonApplicationName": false,
    //
    // Test any connection string before initializing the application and using it. The connection string is tested by opening and closing the connection.
    //
    "TestConnectionStrings": true
  },

  //
  // Specify the urls the web host will listen on. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.hostingabstractionswebhostbuilderextensions.useurls?view=aspnetcore-8.0
  //
  "Urls": "http://localhost:5000;http://localhost:5001",

  //
  // Enable to invoke UseKestrelHttpsConfiguration. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.webhostbuilderkestrelextensions.usekestrelhttpsconfiguration?view=aspnetcore-8.0
  //
  "Ssl": {
    "Enabled": false,
    //
    // Adds middleware for redirecting HTTP Requests to HTTPS. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.httpspolicybuilderextensions.usehttpsredirection?view=aspnetcore-8.0
    //
    "HttpsRedirection": true,
    //
    // Adds middleware for using HSTS, which adds the Strict-Transport-Security header. See https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.hstsbuilderextensions.usehsts?view=aspnetcore-2.1
    //
    "UseHsts": true
  },

  //
  // Data protection settings. Encryption keys for Auth Cookies and Antiforgery tokens.
  //
  "DataProtection": {
    "Enabled": true,
    //
    // Set to null to use the current "ApplicationName"
    //
    "CustomApplicationName": null,
    //
    // Sets the default lifetime in days of keys created by the data protection system.
    //
    "DefaultKeyLifetimeDays": 90,
    //
    // Data protection location: "Default", "FileSystem" or "Database"
    //
    // Note: When running on Linux, using Default keys will not be persisted. 
    // When keys are lost on restarts, Cookie Auth and Antiforgery tokens will also not work on restart.
    // Linux users should use FileSystem or Database storage.
    //
    "Storage": "Default",
    //
    // FileSystem storage path. Set to a valid path when using FileSystem.
    // Note: When running in Docker environment, the path must be a Docker volume path.
    //
    "FileSystemPath": "./data-protection-keys",
    //
    // GetAllElements database command. Expected to rows with a single column of type text.
    //
    "GetAllElementsCommand": "select get_data_protection_keys()",
    //
    // StoreElement database command. Receives two parameters: name and data of type text. Doesn't return anything.
    //
    "StoreElementCommand": "call store_data_protection_keys($1,$2)"
  },

  // //
  // // Uncomment to configure Kestrel web server and to add certificates
  // // See https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/endpoints?view=aspnetcore-8.0
  // //
  // "Kestrel": {
  //     "Endpoints": {
  //         "Http": {
  //             "Url": "http://localhost:5000"
  //         },
  //         "HttpsInlineCertFile": {
  //             "Url": "https://localhost:5001",
  //             "Certificate": {
  //                 "Path": "<path to .pfx file>",
  //                 "Password": "$CREDENTIAL_PLACEHOLDER$"
  //             }
  //         },
  //         "HttpsInlineCertAndKeyFile": {
  //             "Url": "https://localhost:5002",
  //             "Certificate": {
  //                 "Path": "<path to .pem/.crt file>",
  //                 "KeyPath": "<path to .key file>",
  //                 "Password": "$CREDENTIAL_PLACEHOLDER$"
  //             }
  //         },
  //         "HttpsInlineCertStore": {
  //             "Url": "https://localhost:5003",
  //             "Certificate": {
  //                 "Subject": "<subject; required>",
  //                 "Store": "<certificate store; required>",
  //                 "Location": "<location; defaults to CurrentUser>",
  //                 "AllowInvalid": "<true or false; defaults to false>"
  //             }
  //         },
  //         "HttpsDefaultCert": {
  //             "Url": "https://localhost:5004"
  //         }
  //     },
  //     "Certificates": {
  //         "Default": {
  //             "Path": "<path to .pfx file>",
  //             "Password": "$CREDENTIAL_PLACEHOLDER$"
  //         }
  //     }
  // },

  //
  // Authentication and Authorization settings
  //
  "Auth": {
    //
    // Enable Cookie Auth
    //
    "CookieAuth": false,
    "CookieAuthScheme": null,
    "CookieValidDays": 14,
    "CookieName": null,
    "CookiePath": null,
    "CookieDomain": null,
    "CookieMultiSessions": true,
    "CookieHttpOnly": true,

    //
    // Enable Microsoft Bearer Token Auth
    //
    "BearerTokenAuth": false,
    "BearerTokenAuthScheme": null,
    "BearerTokenExpireHours": 1,
    // POST { "refresh": "{{!refreshToken!}}" }
    "BearerTokenRefreshPath": "/api/token/refresh",

    // 
    // Enable external auth providers
    //
    "External": {
      "Enabled": false,
      //
      // sessionStorage key to store the status of the external auth process returned by the signin page.
      // The value is HTTP status code (200 for success, 401 for unauthorized, 403 for forbidden, etc.)
      //
      "BrowserSessionStatusKey": "__external_status",
      //
      // sessionStorage key to store the message of the external auth process returned by the signin page.
      //
      "BrowserSessionMessageKey": "__external_message",
      //
      // Path to the signin page to handle the external auth process. Redirect to this page to start the external auth process.
      // Format placeholder {0} is the provider name in lowercase (google, linkedin, github, etc.)
      //
      "SigninUrl": "/signin-{0}",
      //
      // Sign in page template. Format placeholders {0} is the provider name, {1} is the script to redirect to the external auth provider.
      //
      "SignInHtmlTemplate": "<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><title>Talking To {0}</title></head><body>Loading...{1}</body></html>",
      //
      // URL to redirect after the external auth process is completed. Usually this is resolved from the request automatically. Except when it's not.
      // 
      "RedirectUrl": null,
      //
      // Path to redirect after the external auth process is completed. 
      // 
      "ReturnToPath": "/",
      //
      // Query string key to store the path to redirect after the external auth process is completed.
      // Use this to set dynamic return path. If this query string key is not found, the ReturnToPath value is used.
      // 
      "ReturnToPathQueryStringKey": "return_to",
      //
      // Login command to execute after the external auth process is completed. Parameters:
      //   - external login provider (if param exists)
      //   - external login email (if param exists)
      //   - external login name (if param exists)
      //   - external login json data received (if param exists)
      //   - client browser analytics json data (if param exists)
      // Please use PostgreSQL parameter placeholders for the parameters ($1, $2, $3).
      //
      // The command uses the same rules as the login enabled routine. 
      // See: https://vb-consulting.github.io/npgsqlrest/login-endpoints and https://vb-consulting.github.io/npgsqlrest/login-endpoints/#external-logins
      //
      "LoginCommand": "select * from external_login($1,$2,$3,$4,$5)",
      //
      // Browser client analytics data that will be sent as JSON to external auth command as 5th parameter if supplied.
      //
      "ClientAnaliticsData": "{timestamp:new Date().toISOString(),timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,screen:{width:window.screen.width,height:window.screen.height,colorDepth:window.screen.colorDepth,pixelRatio:window.devicePixelRatio,orientation:screen.orientation.type},browser:{userAgent:navigator.userAgent,language:navigator.language,languages:navigator.languages,cookiesEnabled:navigator.cookieEnabled,doNotTrack:navigator.doNotTrack,onLine:navigator.onLine,platform:navigator.platform,vendor:navigator.vendor},memory:{deviceMemory:navigator.deviceMemory,hardwareConcurrency:navigator.hardwareConcurrency},window:{innerWidth:window.innerWidth,innerHeight:window.innerHeight,outerWidth:window.outerWidth,outerHeight:window.outerHeight},location:{href:window.location.href,hostname:window.location.hostname,pathname:window.location.pathname,protocol:window.location.protocol,referrer:document.referrer},performance:{navigation:{type:performance.navigation?.type,redirectCount:performance.navigation?.redirectCount},timing:performance.timing?{loadEventEnd:performance.timing.loadEventEnd,loadEventStart:performance.timing.loadEventStart,domComplete:performance.timing.domComplete,domInteractive:performance.timing.domInteractive,domContentLoadedEventEnd:performance.timing.domContentLoadedEventEnd}:null}}",
      //
      // Client IP address that will be added to the client analytics data under this JSON key.
      //
      "ClientAnaliticsIpKey": "ip",
      //
      // External providers
      //
      "Google": {
        //
        // visit https://console.cloud.google.com/apis/ to configure your google app and get your client id and client secret
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id={0}&redirect_uri={1}&scope=openid profile email&state={2}",
        "TokenUrl": "https://oauth2.googleapis.com/token",
        "InfoUrl": "https://www.googleapis.com/oauth2/v3/userinfo",
        "EmailUrl": null
      },
      "LinkedIn": {
        //
        // visit https://www.linkedin.com/developers/apps/ to configure your linkedin app and get your client id and client secret
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id={0}&redirect_uri={1}&state={2}&scope=r_liteprofile%20r_emailaddress",
        "TokenUrl": "https://www.linkedin.com/oauth/v2/accessToken",
        "InfoUrl": "https://api.linkedin.com/v2/me",
        "EmailUrl": "https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements//(handle~))"
      },
      "GitHub": {
        //
        // visit https://github.com/settings/developers/ to configure your github app and get your client id and client secret
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://github.com/login/oauth/authorize?client_id={0}&redirect_uri={1}&state={2}&allow_signup=false",
        "TokenUrl": "https://github.com/login/oauth/access_token",
        "InfoUrl": "https://api.github.com/user",
        "EmailUrl": null
      },
      "Microsoft": {
        //
        // visit https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade to configure your Microsoft app and get your client id and client secret
        // Documentation: https://learn.microsoft.com/en-us/entra/identity-platform/
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=code&client_id={0}&redirect_uri={1}&scope=openid%20profile%20email&state={2}",
        "TokenUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
        "InfoUrl": "https://graph.microsoft.com/oidc/userinfo",
        "EmailUrl": null
      },
      "Facebook": {
        //
        // visit https://developers.facebook.com/apps/ to configure your Facebook app and get your client id and client secret
        // Documentation: https://developers.facebook.com/docs/facebook-login/
        //
        "Enabled": false,
        "ClientId": "",
        "ClientSecret": "",
        "AuthUrl": "https://www.facebook.com/v20.0/dialog/oauth?response_type=code&client_id={0}&redirect_uri={1}&scope=public_profile%20email&state={2}",
        "TokenUrl": "https://graph.facebook.com/v20.0/oauth/access_token",
        "InfoUrl": "https://graph.facebook.com/me?fields=id,name,email",
        "EmailUrl": null
      }
    }
  },

  //
  // Serilog settings
  //
  "Log": {
    //
    // See https://github.com/serilog/serilog/wiki/Configuration-Basics#minimum-level
    //
    "MinimalLevels": {
      "System": "Warning",
      "Microsoft": "Warning"
    },
    "ToConsole": true,
    "ConsoleMinimumLevel": "Verbose",
    "ToFile": false,
    "FilePath": "logs/log.txt",
    "FileSizeLimitBytes": 30000000,
    "FileMinimumLevel": "Verbose",
    "RetainedFileCountLimit": 30,
    "RollOnFileSizeLimit": true,
    "ToPostgres": false,
    // $1 - log level text, $2 - message text, $3 - timestamp with tz in utc, $4 - exception text or null, $5 - source context
    "PostgresCommand": "call log($1,$2,$3,$4,$5)",
    "PostgresMinimumLevel": "Verbose",
    //
    // See https://github.com/serilog/serilog/wiki/Formatting-Output
    //
    "OutputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
  },

  //
  // Response compression settings
  //
  "ResponseCompression": {
    "Enabled": false,
    "EnableForHttps": false,
    "UseBrotli": true,
    "UseGzipFallback": true,
    "CompressionLevel": "Optimal", // Optimal, Fastest, NoCompression, SmallestSize
    "IncludeMimeTypes": [
      "text/plain",
      "text/css",
      "application/javascript",
      "text/html",
      "application/xml",
      "text/xml",
      "application/json",
      "text/json",
      "image/svg+xml",
      "font/woff",
      "font/woff2",
      "application/font-woff",
      "application/font-woff2"
    ],
    "ExcludeMimeTypes": []
  },

  "Antiforgery": {
    "Enabled": false,
    "CookieName": null,
    "FormFieldName": "__RequestVerificationToken",
    "HeaderName": "RequestVerificationToken",
    "SuppressReadingTokenFromFormBody": false,
    "SuppressXFrameOptionsHeader": false
  },

  //
  // Static files settings 
  //
  "StaticFiles": {
    "Enabled": false,
    "RootPath": "wwwroot",
    "ParseContentOptions": {
      //
      // Enable or disable the parsing of the static files.
      // When enabled, the static files will be parsed and the tags will be replaced with the values from the claims collection.
      //
      "Enabled": false,
      //
      // Set to true to cache the parsed files in memory. This will improve the performance of the static files. It only applies to parsed content.
      //
      "CacheParsedFile": true,
      //
      // List of static file patterns that will parse the content and replace the tags with the values from the claims collection.
      // File paths are relative to the RootPath property and pattern matching is case-insensitive.
      // Pattern can include wildcards or question marks. For example: *.html, *.htm, *.txt, *.json, *.xml, *.css, *.js
      // 
      "FilePaths": [ "*.html" ],
      //
      // Tag name to be replaced with authenticated user id for example {userId}
      //
      "UserIdTag": "userId",
      //
      // Tag name to be replaced with authenticated user name
      //
      "UserNameTag": "userName",
      //
      // Tag name to be replaced with authenticated user roles
      //
      "UserRolesTag": "userRoles",
      //
      // Tag names to be replaced with the values from the claims collection
      //
      "CustomTagToClaimMappings": {},
      //
      // Name of the configured Antiforgery form field name to be used in the static files (see Antiforgery FormFieldName setting).
      //
      "AntiforgeryFieldName": "antiForgeryFieldName",
      //
      // Value of the Antiforgery token if Antiforgery is enabled..
      //
      "AntiforgeryToken": "antiForgeryToken"
    }
  },

  //
  // Cross-origin resource sharing 
  //
  "Cors": {
    "Enabled": false,
    "AllowedOrigins": [],
    "AllowedMethods": [
      "*"
    ],
    "AllowedHeaders": [
      "*"
    ]
  },

  //
  // https://vb-consulting.github.io/npgsqlrest/
  //
  "NpgsqlRest": {
    //
    // Connection name to be used from the ConnectionStrings section or NULL to use the first avaialable connection string.
    //
    "ConnectionName": null,
    //
    // Allow using multiple connections from the ConnectionStrings section. When set to true, the connection name can be set for the individual Routine.
    // Some routines might use the primary database connection string, while others might want to use a read-only connection string from the replica servers.
    //
    "UseMultipleConnections": false,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#schemasimilarto
    //
    "SchemaSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#schemanotsimilarto
    //
    "SchemaNotSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#includeschemas
    //
    "IncludeSchemas": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#excludeschemas
    //
    "ExcludeSchemas": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#namesimilarto
    //
    "NameSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#namenotsimilarto
    //
    "NameNotSimilarTo": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#includenames
    //
    "IncludeNames": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#excludenames
    //
    "ExcludeNames": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#commentsmode
    //
    "CommentsMode": "OnlyWithHttpTag",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#urlpathprefix
    //
    "UrlPathPrefix": "/api",
    //
    // Convert all URL paths to kebab-case from the original PostgreSQL names.
    //
    "KebabCaseUrls": true,
    //
    // Convert all parameter names to camel case from the original PostgreSQL paramater names.
    //
    "CamelCaseNames": true,
    //
    // Set to true to force all created endpoints to require authorization.
    // See https://vb-consulting.github.io/npgsqlrest/options/#requiresauthorization
    //
    "RequiresAuthorization": true,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logendpointcreatedinfo
    //
    "LogEndpointCreatedInfo": true,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logannotationsetinfo
    //
    "LogAnnotationSetInfo": true,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logconnectionnoticeevents
    //
    "LogConnectionNoticeEvents": true,
    //
    // see https://vb-consulting.github.io/npgsqlrest/options/#logconnectionnoticeeventsmode
    //
    "LogConnectionNoticeEventsMode": "FirstStackFrameAndMessage",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logcommands
    //
    "LogCommands": false,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#logcommandparameters
    //
    "LogCommandParameters": false,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#commandtimeout
    //
    "CommandTimeout": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#defaulthttpmethod
    //
    "DefaultHttpMethod": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#defaultrequestparamtype
    //
    "DefaultRequestParamType": null,
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#requestheadersmode
    //
    "RequestHeadersMode": "Ignore",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#requestheadersparametername
    //
    "RequestHeadersParameterName": "_headers",
    //
    // See https://vb-consulting.github.io/npgsqlrest/options/#returnnpgsqlexceptionmessage
    //
    "ReturnNpgsqlExceptionMessage": true,
    //
    // https://vb-consulting.github.io/npgsqlrest/options/#postgresqlerrorcodetohttpstatuscodemapping
    //
    "PostgreSqlErrorCodeToHttpStatusCodeMapping": {
      "57014": 205,
      "P0001": 400, // PL/pgSQL raise exception
      "P0004": 400 // PL/pgSQL assert failure
    },
    //
    // Add the unique NpgsqlRest instance id request header with this name to the response or set to null to ignore.
    //
    "InstanceIdRequestHeaderName": null,
    //
    // https://vb-consulting.github.io/npgsqlrest/options/#customrequestheaders
    //
    "CustomRequestHeaders": {
    },

    //
    // Options for handling PostgreSQL routines (functions and procedures)
    //
    "RoutineOptions": {
      //
      // Name separator for parameter names when using custom type parameters. 
      // Parameter names will be in the format: {ParameterName}{CustomTypeParameterSeparator}{CustomTypeFieldName}. When NULL, default underscore is used.
      // This is used in when using custom types for parameters, for example: create type custom_type1 as (value text); and parameter _p custom_type1. This name will be merged into _p_value
      //
      "CustomTypeParameterSeparator": null,
      //
      // List of PostgreSQL routine language names to include. If NULL, all languages are included. Names are case-insensitive.
      //
      "IncludeLanguagues": null,
      //
      // List of PostgreSQL routine language names to exclude. If NULL, "C" and "INTERNAL" are excluded by default. Names are case-insensitive.
      //
      "ExcludeLanguagues": null
    },

    //
    // Upload handlers options
    //
    "UploadHandlers": {
      //
      // Handler that will be used when upload handler or handlers are not specified.
      //
      "DefaultUploadHandler": "large_object",
      "LogUploadEvent": true,
      //
      // Enables upload handlers for the NpgsqlRest endpoints that uses PostgreSQL Large Objects API
      //
      "LargeObjectEnabled": true,
      // csv string containing mime type patters, set to null to ignore
      "LargeObjectIncludedMimeTypePatterns": null,
      // csv string containing mime type patters, set to null to ignore
      "LargeObjectExcludedMimeTypePatterns": null,
      "LargeObjectKey": "large_object",
      "LargeObjectHandlerBufferSize": 8192,

      //
      // Enables upload handlers for the NpgsqlRest endpoints that uses file system
      //
      "FileSystemEnabled": true,
      // csv string containing mime type patters, set to null to ignore
      "FileSystemIncludedMimeTypePatterns": null,
      // csv string containing mime type patters, set to null to ignore
      "FileSystemExcludedMimeTypePatterns": null,
      "FileSystemKey": "file_system",
      "FileSystemHandlerPath": "/tmp/uploads",
      "FileSystemHandlerUseUniqueFileName": true,
      "FileSystemHandlerCreatePathIfNotExists": true,
      "FileSystemHandlerBufferSize": 8192,

      //
      // Enables upload handlers for the NpgsqlRest endpoints that uploads CSV files to a row command
      //
      "CsvUploadEnabled": true,
      "CsvUploadIncludedMimeTypePatterns": null,
      "CsvUploadExcludedMimeTypePatterns": null,
      "CsvUploadCheckFileStatus": true,
      "CsvUploadTestBufferSize": 4096,
      "CsvUploadNonPrintableThreshold": 5,
      "CsvUploadDelimiterChars": ",",
      "CsvUploadHasFieldsEnclosedInQuotes": true,
      "CsvUploadSetWhiteSpaceToNull": true,
      //
      // $1 - row index (1-based), $2 - parsed value text array, $3 - result of previous row command, $4 - json metadata for upload
      //
      "CsvUploadRowCommand": "call process_csv_row($1,$2,$3,$4)"
    },

    //
    // Options for refresh metadata endpoint
    //
    "RefreshOptions": {
      //
      // Refresh metadata endpoint enabled
      //
      "Enabled": false,
      //
      // Refresh metadata endpoint path
      //
      "Path": "/api/npgsqlrest/refresh",
      //
      // Refresh metadata endpoint HTTP method
      //
      "Method": "GET"
    },

    //
    // Authentication options for NpgsqlRest endpoints
    //
    "AuthenticationOptions": {
      //
      // Url path that will be used for the login endpoint. If NULL, the login endpoint will not be created.
      // See more on login endpoints at https://vb-consulting.github.io/npgsqlrest/login-endpoints
      //
      "LoginPath": null,
      //
      // Url path that will be used for the logout endpoint. If NULL, the logout endpoint will not be created.
      // See more on logout endpoints at https://vb-consulting.github.io/npgsqlrest/annotations/#logout
      //
      "LogoutPath": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#authenticationoptionsdefaultauthenticationtype
      // (Default value is set from the ApplicationName configuration property)
      //
      "DefaultAuthenticationType": null,
      //
      // Command that is executed when the password verification fails. There are three text parameters:
      //     - scheme: authentication scheme used for the login (if exists)
      //     - user_name: user id used for the login (if exists)
      //     - user_id: user id used for the login (if exists)
      // Please use PostgreSQL parameter placeholders for the parameters ($1, $2, $3).
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#authenticationoptionsdefaultauthenticationtype
      //
      "PasswordVerificationFailedCommand": null,
      //
      // Name of the PostgreSQL text parameter that will be used to pass the authenticated user id to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "UserIdParameterName": null,
      //
      // Name of the PostgreSQL text parameter that will be used to pass the authenticated user name to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "UserNameParameterName": null,
      //
      // Name of the PostgreSQL text array parameter that will be used to pass the authenticated user roles list to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "UserRolesParameterName": null,
      //
      // Custom mapping of the parameter names to the claim names. When this parameter name is found in the claim collection by the key, the value of the claim is passed to the PostgreSQL routine.
      //
      "IpAddressParameterName": null,
      //
      // Name of the PostgreSQL text parameter that will be used to pass the IP address to the PostgreSQL routine (function  or query) automatically (supplied values are rewritten).
      //
      "CustomParameterNameToClaimMappings": {},
      //
      // Bind routine parameter names with matching name to the name configured in these settings:  UserIdParameterName, UserNameParameterName, UserRolesParameterName, IpAddressParameterName and CustomParameterNameToClaimMappings dictionary.
      //
      "BindParameters": true,
      //
      // Routines that have ParseResponse set to true, will parse the response before it is returned to the client by using name placeholders from this section.
      // Names are set in UserIdParameterName, UserNameParameterName, UserRolesParameterName, IpAddressParameterName and CustomParameterNameToClaimMappings dictionary.
      // Use curly braces to define the name placeholders in the response. For example, {UserId} will be replaced with the value of the UserIdParameterName parameter.
      //
      "ParseResponse": false
    },

    // Defines the custom parameter value mappings for the PostgreSQL routines. Use this to set default parameter values by parameter name.
    "CustomParameterMappings": {},

    //
    // Enable or disable the generation of HTTP files for NpgsqlRest endpoints.
    // See more on HTTP files at: 
    // https://marketplace.visualstudio.com/items?itemName=humao.rest-client or 
    // https://learn.microsoft.com/en-us/aspnet/core/test/http-files?view=aspnetcore-8.0
    //
    "HttpFileOptions": {
      "Enabled": false,
      //
      // Options for HTTP file generation:
      // - File: Generate HTTP files in the file system.
      // - Endpoint: Generate Endpoint(s) with HTTP file(s) content.
      // - Both: Generate HTTP files in the file system and Endpoint(s) with HTTP file(s) content.
      //
      "Option": "File",
      //
      // File name. If not set, the database name will be used if connection string is set. 
      // If neither ConnectionString nor Name is set, the file name will be "npgsqlrest".
      //
      "Name": null,
      //
      // The pattern to use when generating file names. {0} is database name, {1} is schema suffix with underline when FileMode is set to Schema.
      // Use this property to set the custom file name.
      // .http extension will be added automatically.
      //
      "NamePattern": "{0}_{1}",
      //
      // Adds comment header to above request based on PostgreSQL routine.
      // - None: skip.
      // - Simple: Add name, parameters and return values to comment header. This default.
      // - Full: Add the entire routine code as comment header.
      //
      "CommentHeader": "Simple",
      //
      // When CommentHeader is set to Simple or Full, set to true to include routine comments in comment header.
      //
      "CommentHeaderIncludeComments": true,
      //
      // - Database: to create one http file for entire database.
      // - Schema: to create one http file for each schema.
      //
      "FileMode": "Schema",
      //
      // Set to true to overwrite existing files.
      //
      "FileOverwrite": true
    },

    //
    // Enable or disable the generation of TypeScript/Javascript client source code files for NpgsqlRest endpoints.
    //
    "ClientCodeGen": {
      "Enabled": false,
      //
      // File path for the generated code. Set to null to skip the code generation. Use {0} to set schema name when BySchema is true
      //
      "FilePath": null,
      //
      //  Force file overwrite.
      //
      "FileOverwrite": true,
      //
      // Include current host information in the URL prefix.
      //
      "IncludeHost": true,
      //
      // Set the custom host prefix information.
      //
      "CustomHost": null,
      //
      // Adds comment header to above request based on PostgreSQL routine
      // Set None to skip.
      // Set Simple (default) to add name, parameters and return values to comment header.
      // Set Full to add the entire routine code as comment header.
      //
      "CommentHeader": "Simple",
      //
      // When CommentHeader is set to Simple or Full, set to true to include routine comments in comment header.
      //
      "CommentHeaderIncludeComments": true,
      //
      // Create files by PostgreSQL schema. File name will use formatted FilePath where {0} is is the schema name in the pascal case.
      //
      "BySchema": true,
      //
      // Set to true to include status code in response: {status: response.status, response: model}
      //
      "IncludeStatusCode": true,
      //
      // Create separate file with global types {name}Types.d.ts
      //
      "CreateSeparateTypeFile": true,
      //
      // Module name to import "baseUrl" constant, instead of defining it in a module.
      //
      "ImportBaseUrlFrom": null,
      //
      // Module name to import "pasreQuery" function, instead of defining it in a module.
      //
      "ImportParseQueryFrom": null,
      //
      // Include optional parameter `parseUrl: (url: string) => string = url=>url` that will parse constructed url.
      //
      "IncludeParseUrlParam": false,
      //
      // Include optional parameter `parseRequest: (request: RequestInit) => RequestInit = request=>request` that will parse constructed request.
      //
      "IncludeParseRequestParam": false,
      //
      // Header lines on a each auto-generated source file. Default is ["// autogenerated at {0}", "", ""] where {0} is current timestamp.
      //
      "HeaderLines": [
        "// autogenerated at {0}",
        ""
      ],
      //
      // Array of routine names to skip (without schema)
      //
      "SkipRoutineNames": [],
      //
      // Array of generated function names to skip (without schema)
      //
      "SkipFunctionNames": [],
      //
      // Array of url paths to skip
      //
      "SkipPaths": [],
      //
      // Array of schema names to skip
      //
      "SkipSchemas": [],
      //
      // Default TypeScript type for JSON types
      //
      "DefaultJsonType": "string",
      //
      // Use routine name instead of endpoint name when generating a function name.
      //
      "UseRoutineNameInsteadOfEndpoint": false,
      //
      // Export URLs as constants.
      //
      "ExportUrls": false,
      //
      // Skip generating types and produce pure JavaScript code. Setting this to true will also change .ts extension to .js where applicable.
      //
      "SkipTypes": false,
      //
      // Keep TypeScript models unique, meaning, models will same fields and types will be merged into one model with name of the last model. Significantly reduces number of generated models. 
      //
      "UniqueModels": false,
      //
      // Name of the XSRF Token Header (Anti-forgery Token). This is used in FORM POSTS to the server when Anti-forgery is enabled. Currently, only Upload requests use FORM POST.
      //
      "XsrfTokenHeaderName": null
    },

    //
    // CRUD endpoints for the PostgreSQL tables and views.
    //
    "CrudSource": {
      //
      // Enable or disable the creation of the endpoints for the PostgreSQL tables and views.
      //
      "Enabled": true,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#schemasimilarto
      //
      "SchemaSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#schemanotsimilarto
      //
      "SchemaNotSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#includeschemas
      //
      "IncludeSchemas": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#excludeschemas
      //
      "ExcludeSchemas": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#namesimilarto
      //
      "NameSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#namenotsimilarto
      //
      "NameNotSimilarTo": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#includenames
      //
      "IncludeNames": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#excludenames
      //
      "ExcludeNames": null,
      //
      // See https://vb-consulting.github.io/npgsqlrest/options/#commentsmode
      //
      "CommentsMode": "OnlyWithHttpTag",
      //
      // URL pattern for all "returning" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "ReturningUrlPattern": "{0}/returning",
      //
      // URL pattern for all "do nothing" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoNothingUrlPattern": "{0}/on-conflict-do-nothing",
      //
      // URL pattern for all "do nothing returning " endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoNothingReturningUrlPattern": "{0}/on-conflict-do-nothing/returning",
      //
      // URL pattern for all "do update" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoUpdateUrlPattern": "{0}/on-conflict-do-update",
      //
      // URL pattern for all "do update returning" endpoints. Parameter is the original URL. Parameter placeholder {0} is default URL.
      //
      "OnConflictDoUpdateReturningUrlPattern": "{0}/on-conflict-do-update/returning",
      //
      // Set of flags to enable or disable the creation of the CRUD endpoints for the specific types of the PostgreSQL tables and views. 
      //
      // Possible values are: 
      // Select, Update, UpdateReturning, Insert, InsertReturning, InsertOnConflictDoNothing, InsertOnConflictDoUpdate, InsertOnConflictDoNothingReturning, 
      // InsertOnConflictDoUpdateReturning, Delete, DeleteReturning, All
      //
      "CrudTypes": [
        "All"
      ]
    }
  }
}
Comments