feat: create dashboards with graphql
This commit is contained in:
parent
4a28c51169
commit
4397a310fe
|
@ -1,3 +1,14 @@
|
||||||
|
input CreateDashboardInput {
|
||||||
|
creator: String
|
||||||
|
description: String
|
||||||
|
ids: [ID!]!
|
||||||
|
title: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateDashboardResult {
|
||||||
|
dashboard: Dashboard!
|
||||||
|
}
|
||||||
|
|
||||||
type Dashboard {
|
type Dashboard {
|
||||||
creator: String!
|
creator: String!
|
||||||
description: String!
|
description: String!
|
||||||
|
@ -9,6 +20,10 @@ type Dashboard {
|
||||||
"""Date serialized as the Unix timestamp."""
|
"""Date serialized as the Unix timestamp."""
|
||||||
scalar Date
|
scalar Date
|
||||||
|
|
||||||
|
type Mutation {
|
||||||
|
createDashboard(input: CreateDashboardInput!): CreateDashboardResult!
|
||||||
|
}
|
||||||
|
|
||||||
type PageInfo {
|
type PageInfo {
|
||||||
endCursor: String
|
endCursor: String
|
||||||
hasNextPage: Boolean!
|
hasNextPage: Boolean!
|
||||||
|
|
|
@ -15,7 +15,7 @@ const migrate = async () => {
|
||||||
FantasySCOTUS: "fantasyscotus",
|
FantasySCOTUS: "fantasyscotus",
|
||||||
Foretold: "foretold",
|
Foretold: "foretold",
|
||||||
"GiveWell/OpenPhilanthropy": "givewellopenphil",
|
"GiveWell/OpenPhilanthropy": "givewellopenphil",
|
||||||
"Good Judgment": "goodjudgement",
|
"Good Judgment": "goodjudgment",
|
||||||
"Good Judgment Open": "goodjudgmentopen",
|
"Good Judgment Open": "goodjudgmentopen",
|
||||||
Infer: "infer",
|
Infer: "infer",
|
||||||
Kalshi: "kalshi",
|
Kalshi: "kalshi",
|
||||||
|
|
|
@ -37,3 +37,4 @@ builder.scalarType("Date", {
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.queryType({});
|
builder.queryType({});
|
||||||
|
builder.mutationType({});
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Dashboard } from "@prisma/client";
|
import { Dashboard } from "@prisma/client";
|
||||||
|
|
||||||
import { prisma } from "../../backend/database/prisma";
|
import { prisma } from "../../backend/database/prisma";
|
||||||
|
import { hash } from "../../backend/utils/hash";
|
||||||
import { builder } from "../builder";
|
import { builder } from "../builder";
|
||||||
import { QuestionObj } from "./questions";
|
import { QuestionObj } from "./questions";
|
||||||
|
|
||||||
|
@ -40,3 +41,49 @@ builder.queryField("dashboard", (t) =>
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const CreateDashboardResult = builder
|
||||||
|
.objectRef<{ dashboard: Dashboard }>("CreateDashboardResult")
|
||||||
|
.implement({
|
||||||
|
fields: (t) => ({
|
||||||
|
dashboard: t.field({
|
||||||
|
type: DashboardObj,
|
||||||
|
resolve: (parent) => parent.dashboard,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const CreateDashboardInput = builder.inputType("CreateDashboardInput", {
|
||||||
|
fields: (t) => ({
|
||||||
|
title: t.string({ required: true }),
|
||||||
|
description: t.string(),
|
||||||
|
creator: t.string(),
|
||||||
|
ids: t.idList({ required: true }),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.mutationField("createDashboard", (t) =>
|
||||||
|
t.field({
|
||||||
|
type: CreateDashboardResult,
|
||||||
|
args: {
|
||||||
|
input: t.arg({ type: CreateDashboardInput, required: true }),
|
||||||
|
},
|
||||||
|
resolve: async (parent, args) => {
|
||||||
|
const id = hash(JSON.stringify(args.input.ids));
|
||||||
|
const dashboard = await prisma.dashboard.create({
|
||||||
|
data: {
|
||||||
|
id,
|
||||||
|
title: args.input.title,
|
||||||
|
description: args.input.description || "",
|
||||||
|
creator: args.input.creator || "",
|
||||||
|
contents: args.input.ids,
|
||||||
|
extra: [],
|
||||||
|
timestamp: new Date(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
dashboard,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
|
@ -27,7 +27,7 @@ builder.queryField("searchQuestions", (t) =>
|
||||||
const forecastsThreshold = input.forecastsThreshold;
|
const forecastsThreshold = input.forecastsThreshold;
|
||||||
const starsThreshold = input.starsThreshold;
|
const starsThreshold = input.starsThreshold;
|
||||||
const platformsIncludeGuesstimate =
|
const platformsIncludeGuesstimate =
|
||||||
input.forecastingPlatforms.includes("guesstimate") &&
|
input.forecastingPlatforms?.includes("guesstimate") &&
|
||||||
starsThreshold <= 1;
|
starsThreshold <= 1;
|
||||||
|
|
||||||
// preparation
|
// preparation
|
||||||
|
|
|
@ -14,6 +14,18 @@ export type Scalars = {
|
||||||
Date: any;
|
Date: any;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type CreateDashboardInput = {
|
||||||
|
creator?: InputMaybe<Scalars['String']>;
|
||||||
|
description?: InputMaybe<Scalars['String']>;
|
||||||
|
ids: Array<Scalars['ID']>;
|
||||||
|
title: Scalars['String'];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type CreateDashboardResult = {
|
||||||
|
__typename?: 'CreateDashboardResult';
|
||||||
|
dashboard: Dashboard;
|
||||||
|
};
|
||||||
|
|
||||||
export type Dashboard = {
|
export type Dashboard = {
|
||||||
__typename?: 'Dashboard';
|
__typename?: 'Dashboard';
|
||||||
creator: Scalars['String'];
|
creator: Scalars['String'];
|
||||||
|
@ -23,6 +35,16 @@ export type Dashboard = {
|
||||||
title: Scalars['String'];
|
title: Scalars['String'];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type Mutation = {
|
||||||
|
__typename?: 'Mutation';
|
||||||
|
createDashboard: CreateDashboardResult;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export type MutationCreateDashboardArgs = {
|
||||||
|
input: CreateDashboardInput;
|
||||||
|
};
|
||||||
|
|
||||||
export type PageInfo = {
|
export type PageInfo = {
|
||||||
__typename?: 'PageInfo';
|
__typename?: 'PageInfo';
|
||||||
endCursor?: Maybe<Scalars['String']>;
|
endCursor?: Maybe<Scalars['String']>;
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
import { NextApiRequest, NextApiResponse } from "next/types";
|
|
||||||
|
|
||||||
import { pgInsertIntoDashboard } from "../../backend/database/pg-wrapper";
|
|
||||||
import { hash } from "../../backend/utils/hash";
|
|
||||||
|
|
||||||
export default async function handler(
|
|
||||||
req: NextApiRequest,
|
|
||||||
res: NextApiResponse
|
|
||||||
) {
|
|
||||||
if (req.method !== "POST") {
|
|
||||||
res.status(400).send("Expected POST request");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let body = req.body;
|
|
||||||
console.log(body);
|
|
||||||
try {
|
|
||||||
let id = hash(JSON.stringify(body.ids));
|
|
||||||
let pgResponse = await pgInsertIntoDashboard({
|
|
||||||
datum: {
|
|
||||||
id: id,
|
|
||||||
title: body.title || "",
|
|
||||||
description: body.description || "",
|
|
||||||
contents: body.ids,
|
|
||||||
creator: body.creator || "",
|
|
||||||
extra: [],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
res.status(200).send({
|
|
||||||
dashboardId: id,
|
|
||||||
pgResponse: pgResponse,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
res.status(400).send({
|
|
||||||
id: null,
|
|
||||||
pgResponse: JSON.stringify(error),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,24 +1,33 @@
|
||||||
import axios from "axios";
|
|
||||||
import { NextPage } from "next";
|
import { NextPage } from "next";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
|
import { useMutation } from "urql";
|
||||||
|
|
||||||
|
import { CreateDashboardDocument } from "../../web/dashboards/queries.generated";
|
||||||
import { DashboardCreator } from "../../web/display/DashboardCreator";
|
import { DashboardCreator } from "../../web/display/DashboardCreator";
|
||||||
import { Layout } from "../../web/display/Layout";
|
import { Layout } from "../../web/display/Layout";
|
||||||
import { LineHeader } from "../../web/display/LineHeader";
|
import { LineHeader } from "../../web/display/LineHeader";
|
||||||
|
|
||||||
const DashboardsPage: NextPage = () => {
|
const DashboardsPage: NextPage = () => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const [createDashboardResult, createDashboard] = useMutation(
|
||||||
|
CreateDashboardDocument
|
||||||
|
);
|
||||||
|
|
||||||
const handleSubmit = async (data) => {
|
const handleSubmit = async (data: any) => {
|
||||||
// Send to server to create
|
await createDashboard({
|
||||||
// Get back the id
|
input: {
|
||||||
let response = await axios({
|
title: data.title,
|
||||||
url: "/api/create-dashboard-from-ids",
|
description: data.description,
|
||||||
method: "POST",
|
creator: data.creator,
|
||||||
headers: { "Content-Type": "application/json" },
|
ids: data.ids,
|
||||||
data: JSON.stringify(data),
|
},
|
||||||
}).then((res) => res.data);
|
});
|
||||||
await router.push(`/dashboards/view/${response.dashboardId}`);
|
console.log(createDashboardResult);
|
||||||
|
const dashboardId = createDashboardResult?.data?.result?.dashboard?.id;
|
||||||
|
if (!dashboardId) {
|
||||||
|
throw new Error("Couldn't create a dashboard"); // TODO - toaster
|
||||||
|
}
|
||||||
|
await router.push(`/dashboards/view/${dashboardId}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -11,5 +11,13 @@ export type DashboardByIdQueryVariables = Types.Exact<{
|
||||||
|
|
||||||
export type DashboardByIdQuery = { __typename?: 'Query', result: { __typename?: 'Dashboard', id: string, title: string, description: string, creator: string, questions: Array<{ __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }> } };
|
export type DashboardByIdQuery = { __typename?: 'Query', result: { __typename?: 'Dashboard', id: string, title: string, description: string, creator: string, questions: Array<{ __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }> } };
|
||||||
|
|
||||||
|
export type CreateDashboardMutationVariables = Types.Exact<{
|
||||||
|
input: Types.CreateDashboardInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
|
||||||
|
export type CreateDashboardMutation = { __typename?: 'Mutation', result: { __typename?: 'CreateDashboardResult', dashboard: { __typename?: 'Dashboard', id: string, title: string, description: string, creator: string, questions: Array<{ __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }> } } };
|
||||||
|
|
||||||
export const DashboardFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"Dashboard"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Dashboard"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"creator"}},{"kind":"Field","name":{"kind":"Name","value":"questions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Question"}}]}}]}},...QuestionFragmentDoc.definitions]} as unknown as DocumentNode<DashboardFragment, unknown>;
|
export const DashboardFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"Dashboard"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Dashboard"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"creator"}},{"kind":"Field","name":{"kind":"Name","value":"questions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Question"}}]}}]}},...QuestionFragmentDoc.definitions]} as unknown as DocumentNode<DashboardFragment, unknown>;
|
||||||
export const DashboardByIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DashboardById"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"result"},"name":{"kind":"Name","value":"dashboard"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Dashboard"}}]}}]}},...DashboardFragmentDoc.definitions]} as unknown as DocumentNode<DashboardByIdQuery, DashboardByIdQueryVariables>;
|
export const DashboardByIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DashboardById"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"result"},"name":{"kind":"Name","value":"dashboard"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Dashboard"}}]}}]}},...DashboardFragmentDoc.definitions]} as unknown as DocumentNode<DashboardByIdQuery, DashboardByIdQueryVariables>;
|
||||||
|
export const CreateDashboardDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateDashboard"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateDashboardInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"result"},"name":{"kind":"Name","value":"createDashboard"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"dashboard"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Dashboard"}}]}}]}}]}},...DashboardFragmentDoc.definitions]} as unknown as DocumentNode<CreateDashboardMutation, CreateDashboardMutationVariables>;
|
|
@ -13,3 +13,11 @@ query DashboardById($id: ID!) {
|
||||||
...Dashboard
|
...Dashboard
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutation CreateDashboard($input: CreateDashboardInput!) {
|
||||||
|
result: createDashboard(input: $input) {
|
||||||
|
dashboard {
|
||||||
|
...Dashboard
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
export async function createDashboard(payload) {
|
|
||||||
let data = { dashboardId: null };
|
|
||||||
try {
|
|
||||||
let { title, description, ids, creator, extra } = payload;
|
|
||||||
console.log(payload);
|
|
||||||
let response = await axios({
|
|
||||||
url: "/api/create-dashboard-from-ids",
|
|
||||||
method: "post",
|
|
||||||
data: {
|
|
||||||
title: title || "",
|
|
||||||
description: description || "",
|
|
||||||
ids: ids,
|
|
||||||
creator: creator || "",
|
|
||||||
extra: [],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
data = response.data;
|
|
||||||
console.log(data);
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
} finally {
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user