diff --git a/Dockerfile b/Dockerfile index de57fd2..f068e4a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,9 +2,9 @@ FROM node:16-alpine WORKDIR /app COPY package.json . -COPY package-lock.json . +# COPY package-lock.json . -RUN npm ci --include=dev +RUN npm i --include=dev COPY tsconfig.json . COPY nodemon.json . diff --git a/src/handlers/mutation.ts b/src/handlers/mutation.ts new file mode 100644 index 0000000..4f36b26 --- /dev/null +++ b/src/handlers/mutation.ts @@ -0,0 +1,47 @@ +import { + ColumnInsertFieldValue, + MutationRequest, + MutationResponse, + QueryRequest, + QueryResponse, +} from "@hasura/dc-api-types"; +import { Config } from "../config"; +import def from "ajv/dist/vocabularies/discriminator"; +import { builtInPropertiesKeys } from "./collections"; +import { getQdrantClient } from "../qdrant"; +import { executeQueryById } from "./query"; + +export async function executeMutation( + mutation: MutationRequest, + config: Config +): Promise { + const response: MutationResponse = { + operation_results: [], + }; + const qdrantClient = getQdrantClient(config); + + for (const operation of mutation.operations) { + + switch (operation.type) { + case "insert": + // construct list of points + let points: any = []; + for (const row of operation.rows) { + points.push({ + id: Number(row.id), + vector: JSON.parse(row.vector as string), + payload: JSON.parse(row.payload as string), + }); + } + + await qdrantClient.upsert(operation.table[0], {points: points}); + response.operation_results.push({ + affected_rows: operation.rows.length, + }); + break; + case "delete": + break; + } + } + return response; +} diff --git a/src/handlers/query.ts b/src/handlers/query.ts index 84d9036..fce9b46 100644 --- a/src/handlers/query.ts +++ b/src/handlers/query.ts @@ -63,7 +63,7 @@ async function executeQueryAll(table: string, query: Query, config: Config) { -async function executeQueryById( +export async function executeQueryById( id: string, table: string, query: Query, @@ -107,7 +107,6 @@ async function executeQueryById( function expressionQueryType(query: any){ - console.log(query); switch (query.where.value.value_type) { case "uuid": return Number(query.where.value.value); diff --git a/src/index.ts b/src/index.ts index b7b64e2..6a50071 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,7 @@ import { import { getCapabilities } from "./handlers/capabilities"; import { getSchema } from "./handlers/collections"; import { executeQuery } from "./handlers/query"; -// import { executeMutation } from "./handlers/mutation"; +import { executeMutation } from "./handlers/mutation"; const port = Number(process.env.PORT) || 8200; const server = Fastify({ logger: { transport: { target: "pino-pretty" } } }); @@ -65,20 +65,20 @@ server.post<{ Body: QueryRequest; Reply: QueryResponse }>( } ); -// server.post<{ Body: MutationRequest; Reply: MutationResponse }>( -// "/mutation", -// async (request, _response) => { -// server.log.info( -// { headers: request.headers, query: request.body }, -// "mutation.request" -// ); +server.post<{ Body: MutationRequest; Reply: MutationResponse }>( + "/mutation", + async (request, _response) => { + server.log.info( + { headers: request.headers, query: request.body }, + "mutation.request" + ); -// const config = getConfig(request); -// const mutation = request.body; -// const response = await executeMutation(mutation, config); -// return response; -// } -// ); + const config = getConfig(request); + const mutation = request.body; + const response = await executeMutation(mutation, config); + return response; + } +); server.get("/health", async (request, response) => { server.log.info(