|
|
@@ -1,17 +1,59 @@
|
|
|
import { PorterApp } from "@porter-dev/api-contracts";
|
|
|
-import { PorterAppFormData, clientAppToProto } from "lib/porter-apps";
|
|
|
+import {
|
|
|
+ PorterAppFormData,
|
|
|
+ SourceOptions,
|
|
|
+ clientAppToProto,
|
|
|
+} from "lib/porter-apps";
|
|
|
import { useCallback, useContext } from "react";
|
|
|
import { Context } from "shared/Context";
|
|
|
import api from "shared/api";
|
|
|
+import { match } from "ts-pattern";
|
|
|
import { z } from "zod";
|
|
|
|
|
|
export const useAppValidation = ({
|
|
|
deploymentTargetID,
|
|
|
+ creating = false,
|
|
|
}: {
|
|
|
deploymentTargetID?: string;
|
|
|
+ creating?: boolean;
|
|
|
}) => {
|
|
|
const { currentProject, currentCluster } = useContext(Context);
|
|
|
|
|
|
+ const getBranchHead = async ({
|
|
|
+ projectID,
|
|
|
+ source,
|
|
|
+ }: {
|
|
|
+ projectID: number;
|
|
|
+ source: SourceOptions & {
|
|
|
+ type: "github";
|
|
|
+ };
|
|
|
+ }) => {
|
|
|
+ const [owner, repo_name] = await z
|
|
|
+ .tuple([z.string(), z.string()])
|
|
|
+ .parseAsync(source.git_repo_name?.split("/"));
|
|
|
+
|
|
|
+ const res = await api.getBranchHead(
|
|
|
+ "<token>",
|
|
|
+ {},
|
|
|
+ {
|
|
|
+ ...source,
|
|
|
+ project_id: projectID,
|
|
|
+ kind: "github",
|
|
|
+ owner,
|
|
|
+ name: repo_name,
|
|
|
+ branch: source.git_branch,
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ const commitData = await z
|
|
|
+ .object({
|
|
|
+ commit_sha: z.string(),
|
|
|
+ })
|
|
|
+ .parseAsync(res.data);
|
|
|
+
|
|
|
+ return commitData;
|
|
|
+ };
|
|
|
+
|
|
|
const validateApp = useCallback(
|
|
|
async (data: PorterAppFormData) => {
|
|
|
if (!currentProject || !currentCluster) {
|
|
|
@@ -23,6 +65,22 @@ export const useAppValidation = ({
|
|
|
}
|
|
|
|
|
|
const proto = clientAppToProto(data);
|
|
|
+ const commit_sha = await match(data.source)
|
|
|
+ .with({ type: "github" }, async (src) => {
|
|
|
+ if (!creating) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ const { commit_sha } = await getBranchHead({
|
|
|
+ projectID: currentProject.id,
|
|
|
+ source: src,
|
|
|
+ });
|
|
|
+ return commit_sha;
|
|
|
+ })
|
|
|
+ .with({ type: "docker-registry" }, () => {
|
|
|
+ return "";
|
|
|
+ })
|
|
|
+ .exhaustive();
|
|
|
|
|
|
const res = await api.validatePorterApp(
|
|
|
"<token>",
|
|
|
@@ -33,7 +91,7 @@ export const useAppValidation = ({
|
|
|
})
|
|
|
),
|
|
|
deployment_target_id: deploymentTargetID,
|
|
|
- commit_sha: "", // not sending a commit sha since the CLI will handle this
|
|
|
+ commit_sha,
|
|
|
},
|
|
|
{
|
|
|
project_id: currentProject.id,
|