Compare commits
10 Commits
@nhost/das
...
@nhost/das
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e91221d5a | ||
|
|
7278991a59 | ||
|
|
5924bc3248 | ||
|
|
c5ad634799 | ||
|
|
426b93a19f | ||
|
|
026f84f466 | ||
|
|
384fac00b1 | ||
|
|
7e9a2ce136 | ||
|
|
076fd4a7c0 | ||
|
|
9525fd74b3 |
@@ -1,5 +1,25 @@
|
||||
# @nhost/dashboard
|
||||
|
||||
## 1.13.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 5924bc3: fix: include password in `GetSmtpSettings` query
|
||||
- c5ad634: fix: resolved an issue where one-click install links were broken on Safari
|
||||
- 7278991: fix: update graphql auto-embeddings configuration to use String type for model field
|
||||
|
||||
## 1.13.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 026f84f: fix: use configuration server URL from environment variable
|
||||
|
||||
## 1.13.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 7e9a2ce: fix: resolve issue where run services form fails to open
|
||||
|
||||
## 1.13.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -28,6 +28,7 @@ ENV NEXT_PUBLIC_NHOST_STORAGE_URL __NEXT_PUBLIC_NHOST_STORAGE_URL__
|
||||
ENV NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL __NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL__
|
||||
ENV NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL __NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL__
|
||||
ENV NEXT_PUBLIC_NHOST_HASURA_API_URL __NEXT_PUBLIC_NHOST_HASURA_API_URL__
|
||||
ENV NEXT_PUBLIC_NHOST_CONFIGSERVER_URL __NEXT_PUBLIC_NHOST_CONFIGSERVER_URL__
|
||||
|
||||
RUN yarn global add pnpm@8.10.5
|
||||
COPY .gitignore .gitignore
|
||||
|
||||
@@ -21,5 +21,6 @@ find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_STORAGE_URL__~${NEXT_
|
||||
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL__~${NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL}~g" {} +
|
||||
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL__~${NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL}~g" {} +
|
||||
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_HASURA_API_URL__~${NEXT_PUBLIC_NHOST_HASURA_API_URL}~g" {} +
|
||||
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_CONFIGSERVER_URL__~${NEXT_PUBLIC_NHOST_CONFIGSERVER_URL}~g" {} +
|
||||
|
||||
exec "$@"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nhost/dashboard",
|
||||
"version": "1.13.0",
|
||||
"version": "1.13.3",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
|
||||
@@ -12,6 +12,7 @@ query GetSmtpSettings($appId: uuid!) {
|
||||
secure
|
||||
sender
|
||||
user
|
||||
password
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
mutation insertGraphiteAutoEmbeddingsConfiguration(
|
||||
$name: String
|
||||
$model: embedding_model_enum
|
||||
$model: String
|
||||
$schemaName: String
|
||||
$tableName: String
|
||||
$columnName: String
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
mutation updateGraphiteAutoEmbeddingsConfiguration(
|
||||
$id: uuid!
|
||||
$name: String
|
||||
$model: embedding_model_enum
|
||||
$model: String
|
||||
$schemaName: String
|
||||
$tableName: String
|
||||
$columnName: String
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { getConfigServerUrl } from '@/utils/env';
|
||||
import { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
@@ -11,7 +12,7 @@ export default function useLocalMimirClient() {
|
||||
new ApolloClient({
|
||||
cache: new InMemoryCache(),
|
||||
link: new HttpLink({
|
||||
uri: 'https://local.dashboard.nhost.run/v1/configserver/graphql',
|
||||
uri: getConfigServerUrl(),
|
||||
}),
|
||||
}),
|
||||
[],
|
||||
|
||||
@@ -97,7 +97,7 @@ export default function ServicesPage() {
|
||||
|
||||
const openCreateServiceDialog = () => {
|
||||
// creating services using the local dashboard is not supported
|
||||
if (isPlatform) {
|
||||
if (!isPlatform) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ export default function SMTPSettingsPage() {
|
||||
...(!isPlatform ? { client: localMimirClient } : {}),
|
||||
});
|
||||
|
||||
const { secure, host, port, user, method, sender } =
|
||||
const { secure, host, port, user, method, sender, password } =
|
||||
data?.config?.provider?.smtp || {};
|
||||
|
||||
const form = useForm<Optional<SmtpFormValues, 'password'>>({
|
||||
@@ -71,6 +71,7 @@ export default function SMTPSettingsPage() {
|
||||
host: '',
|
||||
port: undefined,
|
||||
user: '',
|
||||
password: '',
|
||||
method: '',
|
||||
sender: '',
|
||||
},
|
||||
@@ -79,6 +80,7 @@ export default function SMTPSettingsPage() {
|
||||
host: host || '',
|
||||
port,
|
||||
user: user || '',
|
||||
password: password || '',
|
||||
method: method || '',
|
||||
sender: sender || '',
|
||||
},
|
||||
@@ -122,14 +124,14 @@ export default function SMTPSettingsPage() {
|
||||
}
|
||||
|
||||
const handleEditSMTPSettings = async (values: SmtpFormValues) => {
|
||||
const { password, ...valuesWithoutPassword } = values;
|
||||
const { password: newPassword, ...valuesWithoutPassword } = values;
|
||||
|
||||
const updateConfigPromise = updateConfig({
|
||||
variables: {
|
||||
appId: currentProject.id,
|
||||
config: {
|
||||
provider: {
|
||||
smtp: password ? values : valuesWithoutPassword,
|
||||
smtp: newPassword ? values : valuesWithoutPassword,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -82,7 +82,11 @@ export default function SelectWorkspaceAndProject() {
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
checkConfigFromQuery(router.query?.config as string);
|
||||
const config = router.query?.config as string;
|
||||
|
||||
if (config) {
|
||||
checkConfigFromQuery(router.query?.config as string);
|
||||
}
|
||||
}, [checkConfigFromQuery, router.query]);
|
||||
|
||||
const goToServices = async (project: {
|
||||
@@ -133,7 +137,7 @@ export default function SelectWorkspaceAndProject() {
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<div className="flex w-full justify-center">
|
||||
<div className="flex justify-center w-full">
|
||||
<ActivityIndicator
|
||||
delay={500}
|
||||
label="Loading workspaces and projects..."
|
||||
@@ -156,7 +160,7 @@ export default function SelectWorkspaceAndProject() {
|
||||
/>
|
||||
|
||||
<div>
|
||||
<div className="mb-2 flex w-full">
|
||||
<div className="flex w-full mb-2">
|
||||
<Input
|
||||
placeholder="Search..."
|
||||
onChange={handleFilterChange}
|
||||
@@ -166,11 +170,11 @@ export default function SelectWorkspaceAndProject() {
|
||||
</div>
|
||||
<RetryableErrorBoundary>
|
||||
{projectsToDisplay.length === 0 ? (
|
||||
<Box className="h-import py-2">
|
||||
<Box className="py-2 h-import">
|
||||
<Text variant="subtitle2">No results found.</Text>
|
||||
</Box>
|
||||
) : (
|
||||
<List className="h-import overflow-y-auto">
|
||||
<List className="overflow-y-auto h-import">
|
||||
{projectsToDisplay.map((project, index) => (
|
||||
<Fragment key={project.value}>
|
||||
<ListItem.Root
|
||||
@@ -186,7 +190,7 @@ export default function SelectWorkspaceAndProject() {
|
||||
}
|
||||
>
|
||||
<ListItem.Avatar>
|
||||
<span className="inline-block h-6 w-6 overflow-hidden rounded-md">
|
||||
<span className="inline-block w-6 h-6 overflow-hidden rounded-md">
|
||||
<Image
|
||||
src="/logos/new.svg"
|
||||
alt="Nhost Logo"
|
||||
|
||||
389
dashboard/src/utils/__generated__/graphite.graphql.ts
generated
389
dashboard/src/utils/__generated__/graphite.graphql.ts
generated
@@ -16,9 +16,7 @@ export type Scalars = {
|
||||
bigint: any;
|
||||
bytea: any;
|
||||
citext: any;
|
||||
embedding_model_enum: any;
|
||||
jsonb: any;
|
||||
timestamp: any;
|
||||
timestamptz: any;
|
||||
timestampz: any;
|
||||
uuid: any;
|
||||
@@ -1547,9 +1545,9 @@ export type AuthUserProviders_Bool_Exp = {
|
||||
export enum AuthUserProviders_Constraint {
|
||||
/** unique or primary key constraint on columns "id" */
|
||||
UserProvidersPkey = 'user_providers_pkey',
|
||||
/** unique or primary key constraint on columns "provider_id", "provider_user_id" */
|
||||
/** unique or primary key constraint on columns "provider_user_id", "provider_id" */
|
||||
UserProvidersProviderIdProviderUserIdKey = 'user_providers_provider_id_provider_user_id_key',
|
||||
/** unique or primary key constraint on columns "provider_id", "user_id" */
|
||||
/** unique or primary key constraint on columns "user_id", "provider_id" */
|
||||
UserProvidersUserIdProviderIdKey = 'user_providers_user_id_provider_id_key'
|
||||
}
|
||||
|
||||
@@ -2684,19 +2682,6 @@ export enum Cursor_Ordering {
|
||||
Desc = 'DESC'
|
||||
}
|
||||
|
||||
/** Boolean expression to compare columns of type "embedding_model_enum". All fields are combined with logical 'AND'. */
|
||||
export type Embedding_Model_Enum_Comparison_Exp = {
|
||||
_eq?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
_gt?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
_gte?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
_in?: InputMaybe<Array<Scalars['embedding_model_enum']>>;
|
||||
_is_null?: InputMaybe<Scalars['Boolean']>;
|
||||
_lt?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
_lte?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
_neq?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
_nin?: InputMaybe<Array<Scalars['embedding_model_enum']>>;
|
||||
};
|
||||
|
||||
/** columns and relationships of "storage.files" */
|
||||
export type Files = {
|
||||
__typename?: 'files';
|
||||
@@ -3297,7 +3282,7 @@ export type GraphiteAutoEmbeddingsConfiguration = {
|
||||
createdAt: Scalars['timestamptz'];
|
||||
id: Scalars['uuid'];
|
||||
lastRun?: Maybe<Scalars['timestamptz']>;
|
||||
model: Scalars['embedding_model_enum'];
|
||||
model: Scalars['String'];
|
||||
mutation?: Maybe<Scalars['String']>;
|
||||
name: Scalars['String'];
|
||||
query?: Maybe<Scalars['String']>;
|
||||
@@ -3337,7 +3322,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Bool_Exp = {
|
||||
createdAt?: InputMaybe<Timestamptz_Comparison_Exp>;
|
||||
id?: InputMaybe<Uuid_Comparison_Exp>;
|
||||
lastRun?: InputMaybe<Timestamptz_Comparison_Exp>;
|
||||
model?: InputMaybe<Embedding_Model_Enum_Comparison_Exp>;
|
||||
model?: InputMaybe<String_Comparison_Exp>;
|
||||
mutation?: InputMaybe<String_Comparison_Exp>;
|
||||
name?: InputMaybe<String_Comparison_Exp>;
|
||||
query?: InputMaybe<String_Comparison_Exp>;
|
||||
@@ -3352,7 +3337,7 @@ export enum GraphiteAutoEmbeddingsConfiguration_Constraint {
|
||||
AutoEmbeddingsConfigurationNameKey = 'auto_embeddings_configuration_name_key',
|
||||
/** unique or primary key constraint on columns "id" */
|
||||
AutoEmbeddingsConfigurationPkey = 'auto_embeddings_configuration_pkey',
|
||||
/** unique or primary key constraint on columns "table_name", "column_name", "schema_name" */
|
||||
/** unique or primary key constraint on columns "column_name", "schema_name", "table_name" */
|
||||
AutoEmbeddingsConfigurationSchemaNameTableNameColumnKey = 'auto_embeddings_configuration_schema_name_table_name_column_key'
|
||||
}
|
||||
|
||||
@@ -3362,7 +3347,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Insert_Input = {
|
||||
createdAt?: InputMaybe<Scalars['timestamptz']>;
|
||||
id?: InputMaybe<Scalars['uuid']>;
|
||||
lastRun?: InputMaybe<Scalars['timestamptz']>;
|
||||
model?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
model?: InputMaybe<Scalars['String']>;
|
||||
mutation?: InputMaybe<Scalars['String']>;
|
||||
name?: InputMaybe<Scalars['String']>;
|
||||
query?: InputMaybe<Scalars['String']>;
|
||||
@@ -3378,7 +3363,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Max_Fields = {
|
||||
createdAt?: Maybe<Scalars['timestamptz']>;
|
||||
id?: Maybe<Scalars['uuid']>;
|
||||
lastRun?: Maybe<Scalars['timestamptz']>;
|
||||
model?: Maybe<Scalars['embedding_model_enum']>;
|
||||
model?: Maybe<Scalars['String']>;
|
||||
mutation?: Maybe<Scalars['String']>;
|
||||
name?: Maybe<Scalars['String']>;
|
||||
query?: Maybe<Scalars['String']>;
|
||||
@@ -3394,7 +3379,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Min_Fields = {
|
||||
createdAt?: Maybe<Scalars['timestamptz']>;
|
||||
id?: Maybe<Scalars['uuid']>;
|
||||
lastRun?: Maybe<Scalars['timestamptz']>;
|
||||
model?: Maybe<Scalars['embedding_model_enum']>;
|
||||
model?: Maybe<Scalars['String']>;
|
||||
mutation?: Maybe<Scalars['String']>;
|
||||
name?: Maybe<Scalars['String']>;
|
||||
query?: Maybe<Scalars['String']>;
|
||||
@@ -3471,7 +3456,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Set_Input = {
|
||||
createdAt?: InputMaybe<Scalars['timestamptz']>;
|
||||
id?: InputMaybe<Scalars['uuid']>;
|
||||
lastRun?: InputMaybe<Scalars['timestamptz']>;
|
||||
model?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
model?: InputMaybe<Scalars['String']>;
|
||||
mutation?: InputMaybe<Scalars['String']>;
|
||||
name?: InputMaybe<Scalars['String']>;
|
||||
query?: InputMaybe<Scalars['String']>;
|
||||
@@ -3494,7 +3479,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Stream_Cursor_Value_Input = {
|
||||
createdAt?: InputMaybe<Scalars['timestamptz']>;
|
||||
id?: InputMaybe<Scalars['uuid']>;
|
||||
lastRun?: InputMaybe<Scalars['timestamptz']>;
|
||||
model?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
model?: InputMaybe<Scalars['String']>;
|
||||
mutation?: InputMaybe<Scalars['String']>;
|
||||
name?: InputMaybe<Scalars['String']>;
|
||||
query?: InputMaybe<Scalars['String']>;
|
||||
@@ -3898,10 +3883,6 @@ export type Mutation_Root = {
|
||||
deleteVirus?: Maybe<Virus>;
|
||||
/** delete data from the table: "storage.virus" */
|
||||
deleteViruses?: Maybe<Virus_Mutation_Response>;
|
||||
/** delete data from the table: "todos" */
|
||||
delete_todos?: Maybe<Todos_Mutation_Response>;
|
||||
/** delete single row from the table: "todos" */
|
||||
delete_todos_by_pk?: Maybe<Todos>;
|
||||
graphite?: Maybe<GraphiteMutation>;
|
||||
/** insert a single row into the table: "auth.providers" */
|
||||
insertAuthProvider?: Maybe<AuthProviders>;
|
||||
@@ -3955,10 +3936,6 @@ export type Mutation_Root = {
|
||||
insertVirus?: Maybe<Virus>;
|
||||
/** insert data into the table: "storage.virus" */
|
||||
insertViruses?: Maybe<Virus_Mutation_Response>;
|
||||
/** insert data into the table: "todos" */
|
||||
insert_todos?: Maybe<Todos_Mutation_Response>;
|
||||
/** insert a single row into the table: "todos" */
|
||||
insert_todos_one?: Maybe<Todos>;
|
||||
/** update single row of the table: "auth.providers" */
|
||||
updateAuthProvider?: Maybe<AuthProviders>;
|
||||
/** update single row of the table: "auth.provider_requests" */
|
||||
@@ -4033,12 +4010,6 @@ export type Mutation_Root = {
|
||||
update_buckets_many?: Maybe<Array<Maybe<Buckets_Mutation_Response>>>;
|
||||
/** update multiples rows of table: "storage.files" */
|
||||
update_files_many?: Maybe<Array<Maybe<Files_Mutation_Response>>>;
|
||||
/** update data of the table: "todos" */
|
||||
update_todos?: Maybe<Todos_Mutation_Response>;
|
||||
/** update single row of the table: "todos" */
|
||||
update_todos_by_pk?: Maybe<Todos>;
|
||||
/** update multiples rows of table: "todos" */
|
||||
update_todos_many?: Maybe<Array<Maybe<Todos_Mutation_Response>>>;
|
||||
/** update multiples rows of table: "auth.users" */
|
||||
update_users_many?: Maybe<Array<Maybe<Users_Mutation_Response>>>;
|
||||
/** update multiples rows of table: "storage.virus" */
|
||||
@@ -4304,18 +4275,6 @@ export type Mutation_RootDeleteVirusesArgs = {
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootDelete_TodosArgs = {
|
||||
where: Todos_Bool_Exp;
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootDelete_Todos_By_PkArgs = {
|
||||
id: Scalars['uuid'];
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootInsertAuthProviderArgs = {
|
||||
object: AuthProviders_Insert_Input;
|
||||
@@ -4498,20 +4457,6 @@ export type Mutation_RootInsertVirusesArgs = {
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootInsert_TodosArgs = {
|
||||
objects: Array<Todos_Insert_Input>;
|
||||
on_conflict?: InputMaybe<Todos_On_Conflict>;
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootInsert_Todos_OneArgs = {
|
||||
object: Todos_Insert_Input;
|
||||
on_conflict?: InputMaybe<Todos_On_Conflict>;
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootUpdateAuthProviderArgs = {
|
||||
_set?: InputMaybe<AuthProviders_Set_Input>;
|
||||
@@ -4816,26 +4761,6 @@ export type Mutation_RootUpdate_Files_ManyArgs = {
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootUpdate_TodosArgs = {
|
||||
_set?: InputMaybe<Todos_Set_Input>;
|
||||
where: Todos_Bool_Exp;
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootUpdate_Todos_By_PkArgs = {
|
||||
_set?: InputMaybe<Todos_Set_Input>;
|
||||
pk_columns: Todos_Pk_Columns_Input;
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootUpdate_Todos_ManyArgs = {
|
||||
updates: Array<Todos_Updates>;
|
||||
};
|
||||
|
||||
|
||||
/** mutation root */
|
||||
export type Mutation_RootUpdate_Users_ManyArgs = {
|
||||
updates: Array<Users_Updates>;
|
||||
@@ -4944,12 +4869,6 @@ export type Query_Root = {
|
||||
graphiteAutoEmbeddingsConfigurationAggregate: GraphiteAutoEmbeddingsConfiguration_Aggregate;
|
||||
/** fetch data from the table: "graphite.auto_embeddings_configuration" */
|
||||
graphiteAutoEmbeddingsConfigurations: Array<GraphiteAutoEmbeddingsConfiguration>;
|
||||
/** fetch data from the table: "todos" */
|
||||
todos: Array<Todos>;
|
||||
/** fetch aggregated fields from the table: "todos" */
|
||||
todos_aggregate: Todos_Aggregate;
|
||||
/** fetch data from the table: "todos" using primary key columns */
|
||||
todos_by_pk?: Maybe<Todos>;
|
||||
/** fetch data from the table: "auth.users" using primary key columns */
|
||||
user?: Maybe<Users>;
|
||||
/** fetch data from the table: "auth.users" */
|
||||
@@ -5264,29 +5183,6 @@ export type Query_RootGraphiteAutoEmbeddingsConfigurationsArgs = {
|
||||
};
|
||||
|
||||
|
||||
export type Query_RootTodosArgs = {
|
||||
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
|
||||
limit?: InputMaybe<Scalars['Int']>;
|
||||
offset?: InputMaybe<Scalars['Int']>;
|
||||
order_by?: InputMaybe<Array<Todos_Order_By>>;
|
||||
where?: InputMaybe<Todos_Bool_Exp>;
|
||||
};
|
||||
|
||||
|
||||
export type Query_RootTodos_AggregateArgs = {
|
||||
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
|
||||
limit?: InputMaybe<Scalars['Int']>;
|
||||
offset?: InputMaybe<Scalars['Int']>;
|
||||
order_by?: InputMaybe<Array<Todos_Order_By>>;
|
||||
where?: InputMaybe<Todos_Bool_Exp>;
|
||||
};
|
||||
|
||||
|
||||
export type Query_RootTodos_By_PkArgs = {
|
||||
id: Scalars['uuid'];
|
||||
};
|
||||
|
||||
|
||||
export type Query_RootUserArgs = {
|
||||
id: Scalars['uuid'];
|
||||
};
|
||||
@@ -5438,14 +5334,6 @@ export type Subscription_Root = {
|
||||
graphiteAutoEmbeddingsConfigurationStream: Array<GraphiteAutoEmbeddingsConfiguration>;
|
||||
/** fetch data from the table: "graphite.auto_embeddings_configuration" */
|
||||
graphiteAutoEmbeddingsConfigurations: Array<GraphiteAutoEmbeddingsConfiguration>;
|
||||
/** fetch data from the table: "todos" */
|
||||
todos: Array<Todos>;
|
||||
/** fetch aggregated fields from the table: "todos" */
|
||||
todos_aggregate: Todos_Aggregate;
|
||||
/** fetch data from the table: "todos" using primary key columns */
|
||||
todos_by_pk?: Maybe<Todos>;
|
||||
/** fetch data from the table in a streaming manner: "todos" */
|
||||
todos_stream: Array<Todos>;
|
||||
/** fetch data from the table: "auth.users" using primary key columns */
|
||||
user?: Maybe<Users>;
|
||||
/** fetch data from the table: "auth.users" */
|
||||
@@ -5855,36 +5743,6 @@ export type Subscription_RootGraphiteAutoEmbeddingsConfigurationsArgs = {
|
||||
};
|
||||
|
||||
|
||||
export type Subscription_RootTodosArgs = {
|
||||
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
|
||||
limit?: InputMaybe<Scalars['Int']>;
|
||||
offset?: InputMaybe<Scalars['Int']>;
|
||||
order_by?: InputMaybe<Array<Todos_Order_By>>;
|
||||
where?: InputMaybe<Todos_Bool_Exp>;
|
||||
};
|
||||
|
||||
|
||||
export type Subscription_RootTodos_AggregateArgs = {
|
||||
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
|
||||
limit?: InputMaybe<Scalars['Int']>;
|
||||
offset?: InputMaybe<Scalars['Int']>;
|
||||
order_by?: InputMaybe<Array<Todos_Order_By>>;
|
||||
where?: InputMaybe<Todos_Bool_Exp>;
|
||||
};
|
||||
|
||||
|
||||
export type Subscription_RootTodos_By_PkArgs = {
|
||||
id: Scalars['uuid'];
|
||||
};
|
||||
|
||||
|
||||
export type Subscription_RootTodos_StreamArgs = {
|
||||
batch_size: Scalars['Int'];
|
||||
cursor: Array<InputMaybe<Todos_Stream_Cursor_Input>>;
|
||||
where?: InputMaybe<Todos_Bool_Exp>;
|
||||
};
|
||||
|
||||
|
||||
export type Subscription_RootUserArgs = {
|
||||
id: Scalars['uuid'];
|
||||
};
|
||||
@@ -5944,19 +5802,6 @@ export type Subscription_RootVirusesAggregateArgs = {
|
||||
where?: InputMaybe<Virus_Bool_Exp>;
|
||||
};
|
||||
|
||||
/** Boolean expression to compare columns of type "timestamp". All fields are combined with logical 'AND'. */
|
||||
export type Timestamp_Comparison_Exp = {
|
||||
_eq?: InputMaybe<Scalars['timestamp']>;
|
||||
_gt?: InputMaybe<Scalars['timestamp']>;
|
||||
_gte?: InputMaybe<Scalars['timestamp']>;
|
||||
_in?: InputMaybe<Array<Scalars['timestamp']>>;
|
||||
_is_null?: InputMaybe<Scalars['Boolean']>;
|
||||
_lt?: InputMaybe<Scalars['timestamp']>;
|
||||
_lte?: InputMaybe<Scalars['timestamp']>;
|
||||
_neq?: InputMaybe<Scalars['timestamp']>;
|
||||
_nin?: InputMaybe<Array<Scalars['timestamp']>>;
|
||||
};
|
||||
|
||||
/** Boolean expression to compare columns of type "timestamptz". All fields are combined with logical 'AND'. */
|
||||
export type Timestamptz_Comparison_Exp = {
|
||||
_eq?: InputMaybe<Scalars['timestamptz']>;
|
||||
@@ -5970,208 +5815,6 @@ export type Timestamptz_Comparison_Exp = {
|
||||
_nin?: InputMaybe<Array<Scalars['timestamptz']>>;
|
||||
};
|
||||
|
||||
/** columns and relationships of "todos" */
|
||||
export type Todos = {
|
||||
__typename?: 'todos';
|
||||
/** An object relationship */
|
||||
attachment?: Maybe<Files>;
|
||||
createdAt: Scalars['timestamp'];
|
||||
done: Scalars['Boolean'];
|
||||
file_id?: Maybe<Scalars['uuid']>;
|
||||
id: Scalars['uuid'];
|
||||
title: Scalars['String'];
|
||||
updatedAt: Scalars['timestamptz'];
|
||||
/** An object relationship */
|
||||
user: Users;
|
||||
user_id: Scalars['uuid'];
|
||||
};
|
||||
|
||||
/** aggregated selection of "todos" */
|
||||
export type Todos_Aggregate = {
|
||||
__typename?: 'todos_aggregate';
|
||||
aggregate?: Maybe<Todos_Aggregate_Fields>;
|
||||
nodes: Array<Todos>;
|
||||
};
|
||||
|
||||
/** aggregate fields of "todos" */
|
||||
export type Todos_Aggregate_Fields = {
|
||||
__typename?: 'todos_aggregate_fields';
|
||||
count: Scalars['Int'];
|
||||
max?: Maybe<Todos_Max_Fields>;
|
||||
min?: Maybe<Todos_Min_Fields>;
|
||||
};
|
||||
|
||||
|
||||
/** aggregate fields of "todos" */
|
||||
export type Todos_Aggregate_FieldsCountArgs = {
|
||||
columns?: InputMaybe<Array<Todos_Select_Column>>;
|
||||
distinct?: InputMaybe<Scalars['Boolean']>;
|
||||
};
|
||||
|
||||
/** Boolean expression to filter rows from the table "todos". All fields are combined with a logical 'AND'. */
|
||||
export type Todos_Bool_Exp = {
|
||||
_and?: InputMaybe<Array<Todos_Bool_Exp>>;
|
||||
_not?: InputMaybe<Todos_Bool_Exp>;
|
||||
_or?: InputMaybe<Array<Todos_Bool_Exp>>;
|
||||
attachment?: InputMaybe<Files_Bool_Exp>;
|
||||
createdAt?: InputMaybe<Timestamp_Comparison_Exp>;
|
||||
done?: InputMaybe<Boolean_Comparison_Exp>;
|
||||
file_id?: InputMaybe<Uuid_Comparison_Exp>;
|
||||
id?: InputMaybe<Uuid_Comparison_Exp>;
|
||||
title?: InputMaybe<String_Comparison_Exp>;
|
||||
updatedAt?: InputMaybe<Timestamptz_Comparison_Exp>;
|
||||
user?: InputMaybe<Users_Bool_Exp>;
|
||||
user_id?: InputMaybe<Uuid_Comparison_Exp>;
|
||||
};
|
||||
|
||||
/** unique or primary key constraints on table "todos" */
|
||||
export enum Todos_Constraint {
|
||||
/** unique or primary key constraint on columns "id" */
|
||||
TodosPkey = 'todos_pkey'
|
||||
}
|
||||
|
||||
/** input type for inserting data into table "todos" */
|
||||
export type Todos_Insert_Input = {
|
||||
attachment?: InputMaybe<Files_Obj_Rel_Insert_Input>;
|
||||
createdAt?: InputMaybe<Scalars['timestamp']>;
|
||||
done?: InputMaybe<Scalars['Boolean']>;
|
||||
file_id?: InputMaybe<Scalars['uuid']>;
|
||||
id?: InputMaybe<Scalars['uuid']>;
|
||||
title?: InputMaybe<Scalars['String']>;
|
||||
updatedAt?: InputMaybe<Scalars['timestamptz']>;
|
||||
user?: InputMaybe<Users_Obj_Rel_Insert_Input>;
|
||||
user_id?: InputMaybe<Scalars['uuid']>;
|
||||
};
|
||||
|
||||
/** aggregate max on columns */
|
||||
export type Todos_Max_Fields = {
|
||||
__typename?: 'todos_max_fields';
|
||||
createdAt?: Maybe<Scalars['timestamp']>;
|
||||
file_id?: Maybe<Scalars['uuid']>;
|
||||
id?: Maybe<Scalars['uuid']>;
|
||||
title?: Maybe<Scalars['String']>;
|
||||
updatedAt?: Maybe<Scalars['timestamptz']>;
|
||||
user_id?: Maybe<Scalars['uuid']>;
|
||||
};
|
||||
|
||||
/** aggregate min on columns */
|
||||
export type Todos_Min_Fields = {
|
||||
__typename?: 'todos_min_fields';
|
||||
createdAt?: Maybe<Scalars['timestamp']>;
|
||||
file_id?: Maybe<Scalars['uuid']>;
|
||||
id?: Maybe<Scalars['uuid']>;
|
||||
title?: Maybe<Scalars['String']>;
|
||||
updatedAt?: Maybe<Scalars['timestamptz']>;
|
||||
user_id?: Maybe<Scalars['uuid']>;
|
||||
};
|
||||
|
||||
/** response of any mutation on the table "todos" */
|
||||
export type Todos_Mutation_Response = {
|
||||
__typename?: 'todos_mutation_response';
|
||||
/** number of rows affected by the mutation */
|
||||
affected_rows: Scalars['Int'];
|
||||
/** data from the rows affected by the mutation */
|
||||
returning: Array<Todos>;
|
||||
};
|
||||
|
||||
/** on_conflict condition type for table "todos" */
|
||||
export type Todos_On_Conflict = {
|
||||
constraint: Todos_Constraint;
|
||||
update_columns?: Array<Todos_Update_Column>;
|
||||
where?: InputMaybe<Todos_Bool_Exp>;
|
||||
};
|
||||
|
||||
/** Ordering options when selecting data from "todos". */
|
||||
export type Todos_Order_By = {
|
||||
attachment?: InputMaybe<Files_Order_By>;
|
||||
createdAt?: InputMaybe<Order_By>;
|
||||
done?: InputMaybe<Order_By>;
|
||||
file_id?: InputMaybe<Order_By>;
|
||||
id?: InputMaybe<Order_By>;
|
||||
title?: InputMaybe<Order_By>;
|
||||
updatedAt?: InputMaybe<Order_By>;
|
||||
user?: InputMaybe<Users_Order_By>;
|
||||
user_id?: InputMaybe<Order_By>;
|
||||
};
|
||||
|
||||
/** primary key columns input for table: todos */
|
||||
export type Todos_Pk_Columns_Input = {
|
||||
id: Scalars['uuid'];
|
||||
};
|
||||
|
||||
/** select columns of table "todos" */
|
||||
export enum Todos_Select_Column {
|
||||
/** column name */
|
||||
CreatedAt = 'createdAt',
|
||||
/** column name */
|
||||
Done = 'done',
|
||||
/** column name */
|
||||
FileId = 'file_id',
|
||||
/** column name */
|
||||
Id = 'id',
|
||||
/** column name */
|
||||
Title = 'title',
|
||||
/** column name */
|
||||
UpdatedAt = 'updatedAt',
|
||||
/** column name */
|
||||
UserId = 'user_id'
|
||||
}
|
||||
|
||||
/** input type for updating data in table "todos" */
|
||||
export type Todos_Set_Input = {
|
||||
createdAt?: InputMaybe<Scalars['timestamp']>;
|
||||
done?: InputMaybe<Scalars['Boolean']>;
|
||||
file_id?: InputMaybe<Scalars['uuid']>;
|
||||
id?: InputMaybe<Scalars['uuid']>;
|
||||
title?: InputMaybe<Scalars['String']>;
|
||||
updatedAt?: InputMaybe<Scalars['timestamptz']>;
|
||||
user_id?: InputMaybe<Scalars['uuid']>;
|
||||
};
|
||||
|
||||
/** Streaming cursor of the table "todos" */
|
||||
export type Todos_Stream_Cursor_Input = {
|
||||
/** Stream column input with initial value */
|
||||
initial_value: Todos_Stream_Cursor_Value_Input;
|
||||
/** cursor ordering */
|
||||
ordering?: InputMaybe<Cursor_Ordering>;
|
||||
};
|
||||
|
||||
/** Initial value of the column from where the streaming should start */
|
||||
export type Todos_Stream_Cursor_Value_Input = {
|
||||
createdAt?: InputMaybe<Scalars['timestamp']>;
|
||||
done?: InputMaybe<Scalars['Boolean']>;
|
||||
file_id?: InputMaybe<Scalars['uuid']>;
|
||||
id?: InputMaybe<Scalars['uuid']>;
|
||||
title?: InputMaybe<Scalars['String']>;
|
||||
updatedAt?: InputMaybe<Scalars['timestamptz']>;
|
||||
user_id?: InputMaybe<Scalars['uuid']>;
|
||||
};
|
||||
|
||||
/** update columns of table "todos" */
|
||||
export enum Todos_Update_Column {
|
||||
/** column name */
|
||||
CreatedAt = 'createdAt',
|
||||
/** column name */
|
||||
Done = 'done',
|
||||
/** column name */
|
||||
FileId = 'file_id',
|
||||
/** column name */
|
||||
Id = 'id',
|
||||
/** column name */
|
||||
Title = 'title',
|
||||
/** column name */
|
||||
UpdatedAt = 'updatedAt',
|
||||
/** column name */
|
||||
UserId = 'user_id'
|
||||
}
|
||||
|
||||
export type Todos_Updates = {
|
||||
/** sets the columns of the filtered rows to the given values */
|
||||
_set?: InputMaybe<Todos_Set_Input>;
|
||||
/** filter the rows which have to be updated */
|
||||
where: Todos_Bool_Exp;
|
||||
};
|
||||
|
||||
/** User account information. Don't modify its structure as Hasura Auth relies on it to function properly. */
|
||||
export type Users = {
|
||||
__typename?: 'users';
|
||||
@@ -7150,11 +6793,11 @@ export type GetGraphiteAutoEmbeddingsConfigurationsQueryVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type GetGraphiteAutoEmbeddingsConfigurationsQuery = { __typename?: 'query_root', graphiteAutoEmbeddingsConfigurations: Array<{ __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: any, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null, createdAt: any, updatedAt: any }>, graphiteAutoEmbeddingsConfigurationAggregate: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate', aggregate?: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate_fields', count: number } | null } };
|
||||
export type GetGraphiteAutoEmbeddingsConfigurationsQuery = { __typename?: 'query_root', graphiteAutoEmbeddingsConfigurations: Array<{ __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: string, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null, createdAt: any, updatedAt: any }>, graphiteAutoEmbeddingsConfigurationAggregate: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate', aggregate?: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate_fields', count: number } | null } };
|
||||
|
||||
export type InsertGraphiteAutoEmbeddingsConfigurationMutationVariables = Exact<{
|
||||
name?: InputMaybe<Scalars['String']>;
|
||||
model?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
model?: InputMaybe<Scalars['String']>;
|
||||
schemaName?: InputMaybe<Scalars['String']>;
|
||||
tableName?: InputMaybe<Scalars['String']>;
|
||||
columnName?: InputMaybe<Scalars['String']>;
|
||||
@@ -7168,7 +6811,7 @@ export type InsertGraphiteAutoEmbeddingsConfigurationMutation = { __typename?: '
|
||||
export type UpdateGraphiteAutoEmbeddingsConfigurationMutationVariables = Exact<{
|
||||
id: Scalars['uuid'];
|
||||
name?: InputMaybe<Scalars['String']>;
|
||||
model?: InputMaybe<Scalars['embedding_model_enum']>;
|
||||
model?: InputMaybe<Scalars['String']>;
|
||||
schemaName?: InputMaybe<Scalars['String']>;
|
||||
tableName?: InputMaybe<Scalars['String']>;
|
||||
columnName?: InputMaybe<Scalars['String']>;
|
||||
@@ -7177,7 +6820,7 @@ export type UpdateGraphiteAutoEmbeddingsConfigurationMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type UpdateGraphiteAutoEmbeddingsConfigurationMutation = { __typename?: 'mutation_root', updateGraphiteAutoEmbeddingsConfiguration?: { __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: any, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null } | null };
|
||||
export type UpdateGraphiteAutoEmbeddingsConfigurationMutation = { __typename?: 'mutation_root', updateGraphiteAutoEmbeddingsConfiguration?: { __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: string, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null } | null };
|
||||
|
||||
export type SendDevMessageMutationVariables = Exact<{
|
||||
sessionId: Scalars['String'];
|
||||
@@ -7489,7 +7132,7 @@ export function refetchGetGraphiteAutoEmbeddingsConfigurationsQuery(variables: G
|
||||
return { query: GetGraphiteAutoEmbeddingsConfigurationsDocument, variables: variables }
|
||||
}
|
||||
export const InsertGraphiteAutoEmbeddingsConfigurationDocument = gql`
|
||||
mutation insertGraphiteAutoEmbeddingsConfiguration($name: String, $model: embedding_model_enum, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
|
||||
mutation insertGraphiteAutoEmbeddingsConfiguration($name: String, $model: String, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
|
||||
insertGraphiteAutoEmbeddingsConfiguration(
|
||||
object: {name: $name, model: $model, schemaName: $schemaName, tableName: $tableName, columnName: $columnName, query: $query, mutation: $mutation}
|
||||
) {
|
||||
@@ -7530,7 +7173,7 @@ export type InsertGraphiteAutoEmbeddingsConfigurationMutationHookResult = Return
|
||||
export type InsertGraphiteAutoEmbeddingsConfigurationMutationResult = Apollo.MutationResult<InsertGraphiteAutoEmbeddingsConfigurationMutation>;
|
||||
export type InsertGraphiteAutoEmbeddingsConfigurationMutationOptions = Apollo.BaseMutationOptions<InsertGraphiteAutoEmbeddingsConfigurationMutation, InsertGraphiteAutoEmbeddingsConfigurationMutationVariables>;
|
||||
export const UpdateGraphiteAutoEmbeddingsConfigurationDocument = gql`
|
||||
mutation updateGraphiteAutoEmbeddingsConfiguration($id: uuid!, $name: String, $model: embedding_model_enum, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
|
||||
mutation updateGraphiteAutoEmbeddingsConfiguration($id: uuid!, $name: String, $model: String, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
|
||||
updateGraphiteAutoEmbeddingsConfiguration(
|
||||
pk_columns: {id: $id}
|
||||
_set: {name: $name, model: $model, schemaName: $schemaName, tableName: $tableName, columnName: $columnName, query: $query, mutation: $mutation}
|
||||
|
||||
3
dashboard/src/utils/__generated__/graphql.ts
generated
3
dashboard/src/utils/__generated__/graphql.ts
generated
@@ -22886,7 +22886,7 @@ export type GetSmtpSettingsQueryVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type GetSmtpSettingsQuery = { __typename?: 'query_root', config?: { __typename: 'ConfigConfig', id: 'ConfigConfig', provider?: { __typename: 'ConfigProvider', id: 'ConfigProvider', smtp?: { __typename?: 'ConfigSmtp', host: string, method: string, port: any, secure: boolean, sender: string, user: string } | null } | null } | null };
|
||||
export type GetSmtpSettingsQuery = { __typename?: 'query_root', config?: { __typename: 'ConfigConfig', id: 'ConfigConfig', provider?: { __typename: 'ConfigProvider', id: 'ConfigProvider', smtp?: { __typename?: 'ConfigSmtp', host: string, method: string, port: any, secure: boolean, sender: string, user: string, password: string } | null } | null } | null };
|
||||
|
||||
export type UpdateConfigMutationVariables = Exact<{
|
||||
appId: Scalars['uuid'];
|
||||
@@ -25353,6 +25353,7 @@ export const GetSmtpSettingsDocument = gql`
|
||||
secure
|
||||
sender
|
||||
user
|
||||
password
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
10
dashboard/src/utils/env/env.ts
vendored
10
dashboard/src/utils/env/env.ts
vendored
@@ -87,3 +87,13 @@ export function getHasuraApiUrl() {
|
||||
'https://local.hasura.nhost.run'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom URL of the config service.
|
||||
*/
|
||||
export function getConfigServerUrl() {
|
||||
return (
|
||||
process.env.NEXT_PUBLIC_NHOST_CONFIGSERVER_URL ||
|
||||
'https://local.dashboard.nhost.run/v1/configserver/graphql'
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @nhost/docs
|
||||
|
||||
## 2.10.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 9525fd7: fix: update AI docs for 0.5.0
|
||||
- 076fd4a: fix: update permissions page to indicate we use jsonpath
|
||||
|
||||
## 2.10.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -147,6 +147,7 @@ mutation {
|
||||
insertGraphiteAutoEmbeddingsConfiguration(
|
||||
object: {
|
||||
name: "movies",
|
||||
model: "text-embedding-3-small",
|
||||
schemaName: "public",
|
||||
tableName: "movies",
|
||||
columnName: "embeddings",
|
||||
@@ -184,3 +185,7 @@ The second thing that will happen is that the queries `graphiteSearchMovies`, `g
|
||||
|
||||

|
||||

|
||||
|
||||
<Note>
|
||||
Both queries accept a third argument `maxDistance`. This argument allows you to filter responses that are too far from the query, useful for ensuring that very specific queries do not return entirely unrelated responses. The argument is a float between `0.0` (an exact match) and 1.0 (completely unrelated), with a default setting of `1.0`, ensuring the best matches are always returned even if they are unrelated to the query.
|
||||
</Note>
|
||||
|
||||
@@ -7,7 +7,7 @@ icon: octagon-exclamation
|
||||
|
||||
**Permissions** or authorization rules are used to control acess to data and are set per role and table for each of the **select**, **insert**, **update**, and **delete** database operations.
|
||||
|
||||
Permissions follow a **Zero Trust** model, meaning that by default, no role, with the exception of **admin**, has any access. Access has to be explicitly granted.
|
||||
Permissions follow a **Zero Trust** model, meaning that by default, no role, with the exception of **admin**, has any access. Access has to be explicitly granted.
|
||||
|
||||

|
||||
|
||||
@@ -39,13 +39,13 @@ query {
|
||||
}
|
||||
```
|
||||
|
||||
### Arrays
|
||||
### JSONPath
|
||||
|
||||
You must add `[]` at the end of the path for permission variables that are arrays.
|
||||
We leverage [JSONPath](https://goessner.net/articles/JsonPath/) to extract the data which means you have a good amount of flexibility. To help you build your queries you can leverage the following [playground](https://jsonpath.com). Just remember to skip `$.` when configuring them.
|
||||
|
||||
#### Example
|
||||
#### Example
|
||||
|
||||
Let's say you have a permission variable `x-hasura-organization-ids`, the path should be, e.g., `user.profile.organizations.id[]`.
|
||||
Let's say you have a permission variable `x-hasura-organization-ids`, the path should be, e.g., `user.profile.organizations[*].id`.
|
||||
|
||||
This will result in the following GraphQL query internally:
|
||||
|
||||
@@ -69,6 +69,10 @@ And result in the following permission variable:
|
||||
}
|
||||
```
|
||||
|
||||
<Note>
|
||||
This example is very useful for those building multi-tenant applications.
|
||||
</Note>
|
||||
|
||||
### Limitation on JSON/JSONB columns
|
||||
|
||||
JSON columns cannot be used in custom claims, except the `users.metadata` column.
|
||||
@@ -77,7 +81,7 @@ JSON columns cannot be used in custom claims, except the `users.metadata` column
|
||||
|
||||
To use permission variables locally, add your claims to `nhost.toml` as follows:
|
||||
|
||||
#### Example
|
||||
#### Example
|
||||
|
||||
Add a permission variable `x-hasura-organization-id`:
|
||||
|
||||
@@ -95,7 +99,7 @@ Every GraphQL request resolves permissions using a **single role**.
|
||||
|
||||
#### Default Role
|
||||
|
||||
Every user has one **default role**. The default role is used to resolve permissions if no role is specified using the `x-hasura-role` header in the GraphQL request.
|
||||
Every user has one **default role**. The default role is used to resolve permissions if no role is specified using the `x-hasura-role` header in the GraphQL request.
|
||||
|
||||
`user` is the default role for authenticated users.
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 931 KiB After Width: | Height: | Size: 984 KiB |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nhost/docs",
|
||||
"version": "2.10.0",
|
||||
"version": "2.10.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "mintlify dev"
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
version: '3.6'
|
||||
services:
|
||||
traefik:
|
||||
image: "traefik:v2.5"
|
||||
container_name: "traefik"
|
||||
image: 'traefik:v2.5'
|
||||
container_name: 'traefik'
|
||||
command:
|
||||
- "--api.insecure=true"
|
||||
- "--providers.docker=true"
|
||||
- "--providers.docker.exposedbydefault=false"
|
||||
- "--entrypoints.web.address=:1337"
|
||||
- "--entryPoints.admin.address=:3030"
|
||||
- '--api.insecure=true'
|
||||
- '--providers.docker=true'
|
||||
- '--providers.docker.exposedbydefault=false'
|
||||
- '--entrypoints.web.address=:1337'
|
||||
- '--entryPoints.admin.address=:3030'
|
||||
ports:
|
||||
# hasura/services
|
||||
- "1337:1337"
|
||||
- '1337:1337'
|
||||
# traefik interface
|
||||
- "9090:8080"
|
||||
- '9090:8080'
|
||||
# dashboard
|
||||
- "3030:3030"
|
||||
- '3030:3030'
|
||||
volumes:
|
||||
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||
- '/var/run/docker.sock:/var/run/docker.sock:ro'
|
||||
postgres:
|
||||
image: postgres
|
||||
restart: always
|
||||
@@ -43,16 +43,16 @@ services:
|
||||
HASURA_GRAPHQL_LOG_LEVEL: debug
|
||||
HASURA_GRAPHQL_ENABLE_CONSOLE: 'true'
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- curl http://localhost:8080/healthz > /dev/null 2>&1
|
||||
timeout: 60s
|
||||
interval: 30s
|
||||
start_period: 90s
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- curl http://localhost:8080/healthz > /dev/null 2>&1
|
||||
timeout: 60s
|
||||
interval: 30s
|
||||
start_period: 90s
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.hasura.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/`)"
|
||||
- "traefik.http.routers.hasura.entrypoints=web"
|
||||
- 'traefik.enable=true'
|
||||
- 'traefik.http.routers.hasura.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/`)'
|
||||
- 'traefik.http.routers.hasura.entrypoints=web'
|
||||
auth:
|
||||
image: nhost/hasura-auth:0.24
|
||||
depends_on:
|
||||
@@ -76,11 +76,11 @@ services:
|
||||
expose:
|
||||
- 4000
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.middlewares.strip-auth.stripprefix.prefixes=/v1/auth"
|
||||
- "traefik.http.routers.auth.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/auth`)"
|
||||
- "traefik.http.routers.auth.middlewares=strip-auth@docker"
|
||||
- "traefik.http.routers.auth.entrypoints=web"
|
||||
- 'traefik.enable=true'
|
||||
- 'traefik.http.middlewares.strip-auth.stripprefix.prefixes=/v1/auth'
|
||||
- 'traefik.http.routers.auth.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/auth`)'
|
||||
- 'traefik.http.routers.auth.middlewares=strip-auth@docker'
|
||||
- 'traefik.http.routers.auth.entrypoints=web'
|
||||
storage:
|
||||
image: nhost/hasura-storage:0.4.1
|
||||
depends_on:
|
||||
@@ -102,22 +102,22 @@ services:
|
||||
POSTGRES_MIGRATIONS: 1
|
||||
POSTGRES_MIGRATIONS_SOURCE: postgres://postgres:${POSTGRES_PASSWORD:-secretpgpassword}@postgres:5432/postgres?sslmode=disable
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.storage.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/storage`)"
|
||||
- "traefik.http.routers.storage.entrypoints=web"
|
||||
- 'traefik.enable=true'
|
||||
- 'traefik.http.routers.storage.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/storage`)'
|
||||
- 'traefik.http.routers.storage.entrypoints=web'
|
||||
# Rewrite the path so it matches with the new storage API path introduced in hasura-storage 0.2
|
||||
- "traefik.http.middlewares.strip-suffix.replacepathregex.regex=^/v1/storage/(.*)"
|
||||
- "traefik.http.middlewares.strip-suffix.replacepathregex.replacement=/v1/$$1"
|
||||
- "traefik.http.routers.storage.middlewares=strip-suffix@docker"
|
||||
- 'traefik.http.middlewares.strip-suffix.replacepathregex.regex=^/v1/storage/(.*)'
|
||||
- 'traefik.http.middlewares.strip-suffix.replacepathregex.replacement=/v1/$$1'
|
||||
- 'traefik.http.routers.storage.middlewares=strip-suffix@docker'
|
||||
command: serve
|
||||
functions:
|
||||
image: nhost/functions:1.0.0
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.middlewares.strip-functions.stripprefix.prefixes=/v1/functions"
|
||||
- "traefik.http.routers.functions.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/functions`)"
|
||||
- "traefik.http.routers.functions.middlewares=strip-functions@docker"
|
||||
- "traefik.http.routers.functions.entrypoints=web"
|
||||
- 'traefik.enable=true'
|
||||
- 'traefik.http.middlewares.strip-functions.stripprefix.prefixes=/v1/functions'
|
||||
- 'traefik.http.routers.functions.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/functions`)'
|
||||
- 'traefik.http.routers.functions.middlewares=strip-functions@docker'
|
||||
- 'traefik.http.routers.functions.entrypoints=web'
|
||||
restart: always
|
||||
expose:
|
||||
- 3000
|
||||
@@ -144,7 +144,7 @@ services:
|
||||
SMTP_PORT: ${AUTH_SMTP_PORT:-1025}
|
||||
SMTP_PASS: ${AUTH_SMTP_PASS:-password}
|
||||
SMTP_USER: ${AUTH_SMTP_USER:-user}
|
||||
SMTP_SECURE: "${AUTH_SMTP_SECURE:-false}"
|
||||
SMTP_SECURE: '${AUTH_SMTP_SECURE:-false}'
|
||||
SMTP_SENDER: ${AUTH_SMTP_SENDER:-hbp@hbp.com}
|
||||
ports:
|
||||
- ${AUTH_SMTP_PORT:-1025}:1025
|
||||
@@ -162,12 +162,13 @@ services:
|
||||
NEXT_PUBLIC_NHOST_GRAPHQL_URL: ${NEXT_PUBLIC_NHOST_GRAPHQL_URL}
|
||||
NEXT_PUBLIC_NHOST_STORAGE_URL: ${NEXT_PUBLIC_NHOST_STORAGE_URL}
|
||||
NEXT_PUBLIC_NHOST_FUNCTIONS_URL: ${NEXT_PUBLIC_NHOST_FUNCTIONS_URL}
|
||||
NEXT_PUBLIC_NHOST_CONFIGSERVER_URL: ${NEXT_PUBLIC_NHOST_CONFIGSERVER_URL}
|
||||
expose:
|
||||
- 3000
|
||||
- 3000
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.nhost.rule=Host(`${NHOST_HOST}`)"
|
||||
- "traefik.http.routers.nhost.entrypoints=admin"
|
||||
- 'traefik.enable=true'
|
||||
- 'traefik.http.routers.nhost.rule=Host(`${NHOST_HOST}`)'
|
||||
- 'traefik.http.routers.nhost.entrypoints=admin'
|
||||
# If you would like to protect your dashboard with a username and password if it is publicly-facing, uncomment and fill in the following lines below according to the documentation at https://doc.traefik.io/traefik/middlewares/http/basicauth/
|
||||
#- "traefik.http.routers.nhost.middlewares=auth"
|
||||
#- "traefik.http.middlewares.auth.basicauth.users=
|
||||
|
||||
Reference in New Issue
Block a user