feat: add crud for integrations (#11)
* wip: add crud for services and integrations * feat: remove services * feat: move integration definitions to homarr/definitions, add temporary test connection solution without actual request * feat: add integration count badge * feat: add translation for integrations * feat: add notifications and translate them * feat: add notice to integration forms about test connection * chore: fix ci check issues * feat: add confirm modals for integration deletion and secret card cancellation, change ordering for list page, add name property to integrations * refactor: move revalidate path action * chore: fix ci check issues * chore: install missing dependencies * chore: fix ci check issues * chore: address pull request feedback
This commit is contained in:
4
packages/validation/src/enums.ts
Normal file
4
packages/validation/src/enums.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
import { z } from "zod";
|
||||
|
||||
export const zodEnumFromArray = <T extends string>(arr: T[]) =>
|
||||
z.enum([arr[0]!, ...arr.slice(1)]);
|
||||
@@ -1,5 +1,7 @@
|
||||
import { integrationSchemas } from "./integration";
|
||||
import { userSchemas } from "./user";
|
||||
|
||||
export const validation = {
|
||||
user: userSchemas,
|
||||
integration: integrationSchemas,
|
||||
};
|
||||
|
||||
53
packages/validation/src/integration.ts
Normal file
53
packages/validation/src/integration.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { z } from "zod";
|
||||
|
||||
import { integrationKinds, integrationSecretKinds } from "@homarr/definitions";
|
||||
|
||||
import { zodEnumFromArray } from "./enums";
|
||||
|
||||
const integrationCreateSchema = z.object({
|
||||
name: z.string().nonempty().max(127),
|
||||
url: z.string().url(),
|
||||
kind: zodEnumFromArray(integrationKinds),
|
||||
secrets: z.array(
|
||||
z.object({
|
||||
kind: zodEnumFromArray(integrationSecretKinds),
|
||||
value: z.string().nonempty(),
|
||||
}),
|
||||
),
|
||||
});
|
||||
|
||||
const integrationUpdateSchema = z.object({
|
||||
id: z.string().cuid2(),
|
||||
name: z.string().nonempty().max(127),
|
||||
url: z.string().url(),
|
||||
secrets: z.array(
|
||||
z.object({
|
||||
kind: zodEnumFromArray(integrationSecretKinds),
|
||||
value: z.string().nullable(),
|
||||
}),
|
||||
),
|
||||
});
|
||||
|
||||
const idSchema = z.object({
|
||||
id: z.string(),
|
||||
});
|
||||
|
||||
const testConnectionSchema = z.object({
|
||||
id: z.string().cuid2().nullable(), // Is used to use existing secrets if they have not been updated
|
||||
url: z.string().url(),
|
||||
kind: zodEnumFromArray(integrationKinds),
|
||||
secrets: z.array(
|
||||
z.object({
|
||||
kind: zodEnumFromArray(integrationSecretKinds),
|
||||
value: z.string().nullable(),
|
||||
}),
|
||||
),
|
||||
});
|
||||
|
||||
export const integrationSchemas = {
|
||||
create: integrationCreateSchema,
|
||||
update: integrationUpdateSchema,
|
||||
delete: idSchema,
|
||||
byId: idSchema,
|
||||
testConnection: testConnectionSchema,
|
||||
};
|
||||
Reference in New Issue
Block a user