chore: added log-elements schema
This commit is contained in:
217
src/common/contract/get-v1-schema.ts
Normal file
217
src/common/contract/get-v1-schema.ts
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
import { Z } from "./types";
|
||||||
|
|
||||||
|
export function exportGetV1Schema(z: Z) {
|
||||||
|
const PostLogElementsMetadataNoOpenApiSchema = z
|
||||||
|
.record(z.string(), z.string().optional())
|
||||||
|
.optional();
|
||||||
|
/// common elements
|
||||||
|
|
||||||
|
const PostLogElementsMetadataSchema =
|
||||||
|
PostLogElementsMetadataNoOpenApiSchema.openapi({
|
||||||
|
title: "Metadata",
|
||||||
|
description:
|
||||||
|
"Optional metadata to provide extra information about this object",
|
||||||
|
});
|
||||||
|
|
||||||
|
/// session start
|
||||||
|
|
||||||
|
const PostLogElementsUserSchema = z.object({
|
||||||
|
platform: z.string().openapi({
|
||||||
|
title: "Platform",
|
||||||
|
description: "Name of the platform of this user",
|
||||||
|
example: "Steam",
|
||||||
|
}),
|
||||||
|
id: z.string().openapi({
|
||||||
|
title: "Id",
|
||||||
|
description: "Unique identifier for this user on the given platform",
|
||||||
|
example: "RedGlow",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const PostLogElementsMachineSchema = z.object({
|
||||||
|
id: z.string().openapi({
|
||||||
|
title: "Id",
|
||||||
|
description:
|
||||||
|
"Unique identifier for this machine; it can be produced by hashing together a number of unique characteristics of the machine in a privacy-sensitive way",
|
||||||
|
example: "8662d7bdb037dc82a49d7579d9309397",
|
||||||
|
}),
|
||||||
|
metadata: PostLogElementsMetadataSchema,
|
||||||
|
});
|
||||||
|
|
||||||
|
const PostLogElementsGameSchema = z.object({
|
||||||
|
author: z.string().openapi({
|
||||||
|
title: "Author",
|
||||||
|
description: "The author of this game",
|
||||||
|
example: "owof games",
|
||||||
|
}),
|
||||||
|
name: z.string().openapi({
|
||||||
|
title: "Name",
|
||||||
|
description: "Name of the game",
|
||||||
|
example: "The Good Dog Show",
|
||||||
|
}),
|
||||||
|
version: z.string().openapi({
|
||||||
|
title: "Version",
|
||||||
|
description: "The version of the game",
|
||||||
|
example: "1.2.1.d352cd643ee8028826273c16af0963a4a73295b5",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const PostLogElementsSessionStartSchema = z.object({
|
||||||
|
type: z.literal("session-start"),
|
||||||
|
id: z.string().openapi({
|
||||||
|
title: "Id",
|
||||||
|
description: "Unique id for this session",
|
||||||
|
example: "d3f53283-0e84-449c-81a0-9031b2037bfb",
|
||||||
|
}),
|
||||||
|
user: PostLogElementsUserSchema.openapi({
|
||||||
|
title: "User",
|
||||||
|
description: "User that has started this session",
|
||||||
|
}),
|
||||||
|
machine: PostLogElementsMachineSchema.openapi({
|
||||||
|
title: "Machine",
|
||||||
|
description: "Information about the machine this session started from",
|
||||||
|
}),
|
||||||
|
game: PostLogElementsGameSchema,
|
||||||
|
startTime: z.string().datetime().openapi({
|
||||||
|
title: "Start timestamp",
|
||||||
|
description: "Timestamp of the start of this session",
|
||||||
|
}),
|
||||||
|
metadata: PostLogElementsMetadataSchema,
|
||||||
|
});
|
||||||
|
|
||||||
|
/// session end
|
||||||
|
|
||||||
|
const PostLogElementsSessionEndSchema = z.object({
|
||||||
|
type: z.literal("session-end"),
|
||||||
|
id: z.string().openapi({
|
||||||
|
title: "Id",
|
||||||
|
description:
|
||||||
|
"Unique id for this session (must match the id of a start session)",
|
||||||
|
example: "d3f53283-0e84-449c-81a0-9031b2037bfb",
|
||||||
|
}),
|
||||||
|
endTime: z.string().datetime().openapi({
|
||||||
|
title: "End timestamp",
|
||||||
|
description:
|
||||||
|
"Timestamp of the end of this session (must be greater than the start time)",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
/// activity start
|
||||||
|
|
||||||
|
const PostLogElementsActivityStartSchema = z.object({
|
||||||
|
type: z.literal("activity-start"),
|
||||||
|
id: z.string().openapi({
|
||||||
|
title: "Id",
|
||||||
|
description: "Unique id for this activity",
|
||||||
|
example: "3fcfc0be-a430-4425-b033-daa2c8340d13",
|
||||||
|
}),
|
||||||
|
sessionId: z.string().openapi({
|
||||||
|
title: "Id",
|
||||||
|
description:
|
||||||
|
"Unique id for the session this activity belongs to (must be the same id of a previous session-start)",
|
||||||
|
example: "d3f53283-0e84-449c-81a0-9031b2037bfb",
|
||||||
|
}),
|
||||||
|
parentId: z.string().optional().openapi({
|
||||||
|
title: "Parent Id",
|
||||||
|
description:
|
||||||
|
"Unique id of the parent activity (an activity that contains this activity); optional",
|
||||||
|
example: "c2c62510-3b96-4be8-bad1-3acca2e559fe",
|
||||||
|
}),
|
||||||
|
saveId: z.string().optional().openapi({
|
||||||
|
title: "Save Id",
|
||||||
|
description:
|
||||||
|
"Id of the save file that is currently being used; must be unique for the user of the session this activity belongs to; optional",
|
||||||
|
example: "1442",
|
||||||
|
}),
|
||||||
|
startTime: z.string().datetime().openapi({
|
||||||
|
title: "Start timestamp",
|
||||||
|
description: "Timestamp of the start of this activity",
|
||||||
|
}),
|
||||||
|
metadata: PostLogElementsMetadataSchema,
|
||||||
|
});
|
||||||
|
|
||||||
|
/// activity end
|
||||||
|
|
||||||
|
const PostLogElementsActivityEndSchema = z.object({
|
||||||
|
type: z.literal("activity-end"),
|
||||||
|
id: z.string().openapi({
|
||||||
|
title: "Id",
|
||||||
|
description:
|
||||||
|
"Unique id for this activity (must match the id of a previous start-activity)",
|
||||||
|
example: "3fcfc0be-a430-4425-b033-daa2c8340d13",
|
||||||
|
}),
|
||||||
|
saveId: z.string().optional().openapi({
|
||||||
|
title: "Save Id",
|
||||||
|
description:
|
||||||
|
"Id of the save file that is currently being used; must be unique for the user of the session this activity belongs to; if not null, overwrites the value of the matching start-activity; optional",
|
||||||
|
example: "1442",
|
||||||
|
}),
|
||||||
|
endTime: z.string().datetime().openapi({
|
||||||
|
title: "End timestamp",
|
||||||
|
description:
|
||||||
|
"Timestamp of the end of this activity (must be greather than the startTime of the matching start-activity)",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
/// log
|
||||||
|
|
||||||
|
const PostLogElementsLogSchema = z.object({
|
||||||
|
type: z.literal("log"),
|
||||||
|
activityId: z.string().optional().openapi({
|
||||||
|
title: "Activity Id",
|
||||||
|
description:
|
||||||
|
"Id of the activity this log belongs to; can be null if it does not belong to an activity",
|
||||||
|
example: "3fcfc0be-a430-4425-b033-daa2c8340d13",
|
||||||
|
}),
|
||||||
|
sessionId: z.string().optional().openapi({
|
||||||
|
title: "Session id",
|
||||||
|
description:
|
||||||
|
"Id of the session this log belongs to; it's compulsory if activityId is missing, optional otherwise; if both are present, they must be consistent",
|
||||||
|
example: "d3f53283-0e84-449c-81a0-9031b2037bfb",
|
||||||
|
}),
|
||||||
|
level: z.number().openapi({
|
||||||
|
title: "Level",
|
||||||
|
description:
|
||||||
|
"A log level; the log levels are in range 0-599 (from least significant to most significant); they are logically mapped in blocks of 100 values at a time on the names trace, debug, information, warning, error, critical",
|
||||||
|
example: "400",
|
||||||
|
}),
|
||||||
|
category: z.string().openapi({
|
||||||
|
title: "Category",
|
||||||
|
description:
|
||||||
|
"A category for the log, used to filter them in the interface, either by full match or by prefix",
|
||||||
|
example: "UI.SaveGameView",
|
||||||
|
}),
|
||||||
|
timestamp: z.string().datetime().openapi({
|
||||||
|
title: "Timestamp",
|
||||||
|
description: "The ISO date and time at which this log was emitted",
|
||||||
|
}),
|
||||||
|
message: z.string().openapi({
|
||||||
|
title: "Log message",
|
||||||
|
description: "The message of this log",
|
||||||
|
}),
|
||||||
|
genericMetadata: PostLogElementsMetadataNoOpenApiSchema.openapi({
|
||||||
|
title: "Metadata",
|
||||||
|
description:
|
||||||
|
"Optional metadata to provide extra information about this object (e.g.: file name, line, function name)",
|
||||||
|
}),
|
||||||
|
specificMetadata: PostLogElementsMetadataNoOpenApiSchema.openapi({
|
||||||
|
title: "Metadata",
|
||||||
|
description:
|
||||||
|
"Optional metadata to provide the information used to interpolate the message line (e.g.: button name, character, item)",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
/// union and array
|
||||||
|
|
||||||
|
const PostLogElementsSchema = z
|
||||||
|
.discriminatedUnion("type", [
|
||||||
|
PostLogElementsSessionStartSchema,
|
||||||
|
PostLogElementsSessionEndSchema,
|
||||||
|
PostLogElementsActivityStartSchema,
|
||||||
|
PostLogElementsActivityEndSchema,
|
||||||
|
PostLogElementsLogSchema,
|
||||||
|
])
|
||||||
|
.array();
|
||||||
|
|
||||||
|
return { PostLogElementsSchema };
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ import { exportGetSessionsSchema } from "./get-sessions";
|
|||||||
import { exportPostLogSchema } from "./post-log";
|
import { exportPostLogSchema } from "./post-log";
|
||||||
import { exportGetEntriesSchema } from "./get-entries";
|
import { exportGetEntriesSchema } from "./get-entries";
|
||||||
import { exportGetCategoriesSchema } from "./get-categories";
|
import { exportGetCategoriesSchema } from "./get-categories";
|
||||||
|
import { exportGetV1Schema } from "./get-v1-schema";
|
||||||
|
|
||||||
extendZodWithOpenApi(z);
|
extendZodWithOpenApi(z);
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ const {
|
|||||||
} = exportGetEntriesSchema(z);
|
} = exportGetEntriesSchema(z);
|
||||||
const { GetCategoriesRequestQuerySchema, GetCategoriesResponseSchema } =
|
const { GetCategoriesRequestQuerySchema, GetCategoriesResponseSchema } =
|
||||||
exportGetCategoriesSchema(z);
|
exportGetCategoriesSchema(z);
|
||||||
|
const { PostLogElementsSchema } = exportGetV1Schema(z);
|
||||||
|
|
||||||
const ErrorSchema = z.object({
|
const ErrorSchema = z.object({
|
||||||
code: z.number().optional().openapi({
|
code: z.number().optional().openapi({
|
||||||
@@ -43,6 +45,23 @@ const ErrorSchema = z.object({
|
|||||||
|
|
||||||
const c = initContract();
|
const c = initContract();
|
||||||
|
|
||||||
|
const v1Contract = c.router(
|
||||||
|
{
|
||||||
|
postLogElements: {
|
||||||
|
method: "POST",
|
||||||
|
path: "/logElements",
|
||||||
|
body: PostLogElementsSchema,
|
||||||
|
responses: {
|
||||||
|
204: c.noBody(),
|
||||||
|
500: ErrorSchema,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pathPrefix: "/v1",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
export const contract = c.router(
|
export const contract = c.router(
|
||||||
{
|
{
|
||||||
postLog: {
|
postLog: {
|
||||||
@@ -102,6 +121,7 @@ export const contract = c.router(
|
|||||||
},
|
},
|
||||||
summary: "get the OpenAPI document for this API",
|
summary: "get the OpenAPI document for this API",
|
||||||
},
|
},
|
||||||
|
v1: v1Contract,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pathPrefix: "/api",
|
pathPrefix: "/api",
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ export function installRouter(app: Express, openAPIObject: OpenAPIObject) {
|
|||||||
body: openAPIObject,
|
body: openAPIObject,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
postLogElements() {
|
||||||
});
|
});
|
||||||
|
|
||||||
createExpressEndpoints(contract, router, app);
|
createExpressEndpoints(contract, router, app);
|
||||||
|
|||||||
Reference in New Issue
Block a user