diff --git a/httpd-client/lib/project.ts b/httpd-client/lib/project.ts index 563c4f564..4846227f8 100644 --- a/httpd-client/lib/project.ts +++ b/httpd-client/lib/project.ts @@ -25,6 +25,7 @@ import { object, string, union, + z, } from "zod"; import { @@ -46,26 +47,6 @@ import { patchCreatedSchema, } from "./project/patch.js"; -export interface Project { - id: string; - name: string; - description: string; - defaultBranch: string; - delegates: string[]; - head: string; - patches: { - open: number; - draft: number; - archived: number; - merged: number; - }; - issues: { - open: number; - closed: number; - }; - trackings: number; -} - const projectSchema = object({ id: string(), name: string(), @@ -84,25 +65,16 @@ const projectSchema = object({ closed: number(), }), trackings: number(), -}) satisfies ZodSchema; +}); +const projectsSchema = array(projectSchema); -const projectsSchema = array(projectSchema) satisfies ZodSchema; - -export interface Activity { - activity: number[]; -} +export type Project = z.infer; const activitySchema = object({ activity: array(number()), -}) satisfies ZodSchema; +}); -export interface Blob { - binary: boolean; - content?: string; - name: string; - path: string; - lastCommit: CommitHeader; -} +export type Activity = z.infer; const blobSchema = object({ binary: boolean(), @@ -110,19 +82,17 @@ const blobSchema = object({ name: string(), path: string(), lastCommit: commitHeaderSchema, -}) satisfies ZodSchema; +}); -interface TreeEntry { - path: string; - name: string; - kind: "tree" | "blob"; -} +export type Blob = z.infer; const treeEntrySchema = object({ path: string(), name: string(), kind: union([literal("blob"), literal("tree")]), -}) satisfies ZodSchema; +}); + +export type TreeEntry = z.infer; export interface TreeStats { commits: number; diff --git a/src/views/nodes/View.svelte b/src/views/nodes/View.svelte index 4e38e6e37..9bf92f2ea 100644 --- a/src/views/nodes/View.svelte +++ b/src/views/nodes/View.svelte @@ -29,6 +29,11 @@ const result = await loadProjects(projectPageIndex, baseUrl); projectCount = result.total; projects = [...projects, ...result.projects]; + projects.sort( + (a, b) => + b.latestCommitHeader.committer.time - + a.latestCommitHeader.committer.time, + ); projectPageIndex += 1; } catch (err) { error = err; diff --git a/src/views/nodes/router.ts b/src/views/nodes/router.ts index 2f8c67c21..f5a14be3d 100644 --- a/src/views/nodes/router.ts +++ b/src/views/nodes/router.ts @@ -1,4 +1,4 @@ -import type { BaseUrl, Project } from "@httpd-client"; +import type { BaseUrl, CommitHeader, Project } from "@httpd-client"; import type { NotFoundRoute } from "@app/lib/router/definitions"; import type { WeeklyActivity } from "@app/lib/commit"; @@ -13,6 +13,7 @@ export interface NodesRouteParams { export interface ProjectActivity { project: Project; + latestCommitHeader: CommitHeader; activity: WeeklyActivity[]; } @@ -52,15 +53,22 @@ export async function loadProjects( const results = await Promise.all( projects.map(async project => { const activity = await loadProjectActivity(project.id, baseUrl); + const { commit: latestCommitHeader } = await api.project.getCommitBySha( + project.id, + project.head, + ); return { project, + latestCommitHeader, activity, }; }), ); + // Sorts projects by most recent commit descending. const sortedProjects = results.sort( - (a, b) => b.activity[0]?.time - a.activity[0]?.time, + (a, b) => + b.latestCommitHeader.committer.time - a.latestCommitHeader.committer.time, ); return {