From f79c7711f0455e2e77ecf1d35ccf7e453515b180 Mon Sep 17 00:00:00 2001 From: Xevion Date: Tue, 13 Jan 2026 21:43:45 -0600 Subject: [PATCH] refactor: use GitHub activity for project sorting instead of update timestamp --- ...222026aafa8a385615129eb0d407e44faa9c.json} | 4 ++-- ...327cc50ed2c914abe1293644cc860df74d34.json} | 4 ++-- ...65cd2cc275e2776929d660f9351dad5b418f.json} | 4 ++-- Justfile | 1 + src/cli/output.rs | 6 +++++- src/db/projects.rs | 21 ++++++++++--------- src/db/tags.rs | 2 +- web/src/lib/admin-types.ts | 3 +-- web/src/lib/components/ProjectCard.svelte | 2 +- web/src/lib/mock-data/projects.ts | 14 ++++++------- web/src/routes/admin/projects/+page.svelte | 4 ++-- 11 files changed, 35 insertions(+), 30 deletions(-) rename .sqlx/{query-73404037b3f04ace5f775906ed25d4c572647889dc0185aed652038447ef9642.json => query-3401838a054f29a17d96086529b7222026aafa8a385615129eb0d407e44faa9c.json} (92%) rename .sqlx/{query-7210d993016792490832230c09ed3c4dfc1a6292fcc9c16ded0b182b9952b7ce.json => query-4a2a394398d4597d2366023baad3327cc50ed2c914abe1293644cc860df74d34.json} (91%) rename .sqlx/{query-92641a97d3f5329df38e2ecb456b1f43392b34bba0b286ab9bd75a8207354fea.json => query-d851d8d7117d3cfcd8c50304d60565cd2cc275e2776929d660f9351dad5b418f.json} (92%) diff --git a/.sqlx/query-73404037b3f04ace5f775906ed25d4c572647889dc0185aed652038447ef9642.json b/.sqlx/query-3401838a054f29a17d96086529b7222026aafa8a385615129eb0d407e44faa9c.json similarity index 92% rename from .sqlx/query-73404037b3f04ace5f775906ed25d4c572647889dc0185aed652038447ef9642.json rename to .sqlx/query-3401838a054f29a17d96086529b7222026aafa8a385615129eb0d407e44faa9c.json index 3b46a08..f00ce7c 100644 --- a/.sqlx/query-73404037b3f04ace5f775906ed25d4c572647889dc0185aed652038447ef9642.json +++ b/.sqlx/query-3401838a054f29a17d96086529b7222026aafa8a385615129eb0d407e44faa9c.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT \n p.id, \n p.slug, \n p.name,\n p.short_description,\n p.description, \n p.status as \"status: super::ProjectStatus\", \n p.github_repo, \n p.demo_url, \n p.last_github_activity, \n p.created_at, \n p.updated_at\n FROM projects p\n JOIN project_tags pt ON p.id = pt.project_id\n WHERE pt.tag_id = $1\n ORDER BY p.updated_at DESC\n ", + "query": "\n SELECT \n p.id, \n p.slug, \n p.name,\n p.short_description,\n p.description, \n p.status as \"status: super::ProjectStatus\", \n p.github_repo, \n p.demo_url, \n p.last_github_activity, \n p.created_at, \n p.updated_at\n FROM projects p\n JOIN project_tags pt ON p.id = pt.project_id\n WHERE pt.tag_id = $1\n ORDER BY COALESCE(p.last_github_activity, p.created_at) DESC\n ", "describe": { "columns": [ { @@ -90,5 +90,5 @@ false ] }, - "hash": "73404037b3f04ace5f775906ed25d4c572647889dc0185aed652038447ef9642" + "hash": "3401838a054f29a17d96086529b7222026aafa8a385615129eb0d407e44faa9c" } diff --git a/.sqlx/query-7210d993016792490832230c09ed3c4dfc1a6292fcc9c16ded0b182b9952b7ce.json b/.sqlx/query-4a2a394398d4597d2366023baad3327cc50ed2c914abe1293644cc860df74d34.json similarity index 91% rename from .sqlx/query-7210d993016792490832230c09ed3c4dfc1a6292fcc9c16ded0b182b9952b7ce.json rename to .sqlx/query-4a2a394398d4597d2366023baad3327cc50ed2c914abe1293644cc860df74d34.json index 4a5661d..bf4c4c5 100644 --- a/.sqlx/query-7210d993016792490832230c09ed3c4dfc1a6292fcc9c16ded0b182b9952b7ce.json +++ b/.sqlx/query-4a2a394398d4597d2366023baad3327cc50ed2c914abe1293644cc860df74d34.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n id,\n slug,\n name,\n short_description,\n description,\n status as \"status: ProjectStatus\",\n github_repo,\n demo_url,\n last_github_activity,\n created_at,\n updated_at\n FROM projects\n ORDER BY updated_at DESC\n ", + "query": "\n SELECT\n id,\n slug,\n name,\n short_description,\n description,\n status as \"status: ProjectStatus\",\n github_repo,\n demo_url,\n last_github_activity,\n created_at,\n updated_at\n FROM projects\n ORDER BY COALESCE(last_github_activity, created_at) DESC\n ", "describe": { "columns": [ { @@ -88,5 +88,5 @@ false ] }, - "hash": "7210d993016792490832230c09ed3c4dfc1a6292fcc9c16ded0b182b9952b7ce" + "hash": "4a2a394398d4597d2366023baad3327cc50ed2c914abe1293644cc860df74d34" } diff --git a/.sqlx/query-92641a97d3f5329df38e2ecb456b1f43392b34bba0b286ab9bd75a8207354fea.json b/.sqlx/query-d851d8d7117d3cfcd8c50304d60565cd2cc275e2776929d660f9351dad5b418f.json similarity index 92% rename from .sqlx/query-92641a97d3f5329df38e2ecb456b1f43392b34bba0b286ab9bd75a8207354fea.json rename to .sqlx/query-d851d8d7117d3cfcd8c50304d60565cd2cc275e2776929d660f9351dad5b418f.json index 39a812f..b0f30d9 100644 --- a/.sqlx/query-92641a97d3f5329df38e2ecb456b1f43392b34bba0b286ab9bd75a8207354fea.json +++ b/.sqlx/query-d851d8d7117d3cfcd8c50304d60565cd2cc275e2776929d660f9351dad5b418f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n id,\n slug,\n name,\n short_description,\n description,\n status as \"status: ProjectStatus\",\n github_repo,\n demo_url,\n last_github_activity,\n created_at,\n updated_at\n FROM projects\n WHERE status != 'hidden'\n ORDER BY updated_at DESC\n ", + "query": "\n SELECT\n id,\n slug,\n name,\n short_description,\n description,\n status as \"status: ProjectStatus\",\n github_repo,\n demo_url,\n last_github_activity,\n created_at,\n updated_at\n FROM projects\n WHERE status != 'hidden'\n ORDER BY COALESCE(last_github_activity, created_at) DESC\n ", "describe": { "columns": [ { @@ -88,5 +88,5 @@ false ] }, - "hash": "92641a97d3f5329df38e2ecb456b1f43392b34bba0b286ab9bd75a8207354fea" + "hash": "d851d8d7117d3cfcd8c50304d60565cd2cc275e2776929d660f9351dad5b418f" } diff --git a/Justfile b/Justfile index cc697af..00710cc 100644 --- a/Justfile +++ b/Justfile @@ -27,6 +27,7 @@ check: { name: "eslint", cmd: ["bun", "run", "--cwd", "web", "lint"] }, { name: "svelte-check", cmd: ["bun", "run", "--cwd", "web", "check"] }, { name: "clippy", cmd: ["cargo", "clippy", "--all-targets"] }, + { name: "sqlx-prepare", cmd: ["cargo", "sqlx", "prepare", "--check"] }, { name: "rustfmt", cmd: ["cargo", "fmt", "--check"] }, ]; diff --git a/src/cli/output.rs b/src/cli/output.rs index 4d001a4..90b935d 100644 --- a/src/cli/output.rs +++ b/src/cli/output.rs @@ -48,7 +48,11 @@ pub fn print_project(project: &ApiAdminProject) { println!(" {} {}", dim.paint("Tags:"), tags.join(", ")); } - println!(" {} {}", dim.paint("Updated:"), project.updated_at); + println!( + " {} {}", + dim.paint("Last Activity:"), + project.last_activity + ); } /// Print a list of projects in table format diff --git a/src/db/projects.rs b/src/db/projects.rs index c81bd8c..265f1de 100644 --- a/src/db/projects.rs +++ b/src/db/projects.rs @@ -56,10 +56,8 @@ pub struct ApiAdminProject { pub demo_url: Option, #[serde(rename = "createdAt")] pub created_at: String, // ISO 8601 - #[serde(rename = "updatedAt")] - pub updated_at: String, // ISO 8601 - #[serde(rename = "lastGithubActivity", skip_serializing_if = "Option::is_none")] - pub last_github_activity: Option, // ISO 8601 + #[serde(rename = "lastActivity")] + pub last_activity: String, // ISO 8601 } impl DbProject { @@ -91,6 +89,12 @@ impl DbProject { } pub fn to_api_admin_project(&self, tags: Vec) -> ApiAdminProject { + let last_activity = self + .last_github_activity + .unwrap_or(self.created_at) + .format(&Rfc3339) + .unwrap(); + ApiAdminProject { project: self.to_api_project(), tags: tags.into_iter().map(|t| t.to_api_tag()).collect(), @@ -99,10 +103,7 @@ impl DbProject { github_repo: self.github_repo.clone(), demo_url: self.demo_url.clone(), created_at: self.created_at.format(&Rfc3339).unwrap(), - updated_at: self.updated_at.format(&Rfc3339).unwrap(), - last_github_activity: self - .last_github_activity - .map(|dt| dt.format(&Rfc3339).unwrap()), + last_activity, } } } @@ -164,7 +165,7 @@ pub async fn get_public_projects(pool: &PgPool) -> Result, sqlx:: updated_at FROM projects WHERE status != 'hidden' - ORDER BY updated_at DESC + ORDER BY COALESCE(last_github_activity, created_at) DESC "# ) .fetch_all(pool) @@ -203,7 +204,7 @@ pub async fn get_all_projects_admin(pool: &PgPool) -> Result, sql created_at, updated_at FROM projects - ORDER BY updated_at DESC + ORDER BY COALESCE(last_github_activity, created_at) DESC "# ) .fetch_all(pool) diff --git a/src/db/tags.rs b/src/db/tags.rs index 05f84b1..b5b2079 100644 --- a/src/db/tags.rs +++ b/src/db/tags.rs @@ -314,7 +314,7 @@ pub async fn get_projects_for_tag( FROM projects p JOIN project_tags pt ON p.id = pt.project_id WHERE pt.tag_id = $1 - ORDER BY p.updated_at DESC + ORDER BY COALESCE(p.last_github_activity, p.created_at) DESC "#, tag_id ) diff --git a/web/src/lib/admin-types.ts b/web/src/lib/admin-types.ts index 9901366..d3a8451 100644 --- a/web/src/lib/admin-types.ts +++ b/web/src/lib/admin-types.ts @@ -27,8 +27,7 @@ export interface AdminProject { githubRepo?: string | null; demoUrl?: string | null; createdAt: string; - updatedAt: string; - lastGithubActivity?: string | null; + lastActivity: string; } export interface CreateProjectData { diff --git a/web/src/lib/components/ProjectCard.svelte b/web/src/lib/components/ProjectCard.svelte index fd37c2b..d16e2ce 100644 --- a/web/src/lib/components/ProjectCard.svelte +++ b/web/src/lib/components/ProjectCard.svelte @@ -63,7 +63,7 @@ {project.name} - {formatDate(project.updatedAt)} + {formatDate(project.lastActivity)}

- Updated + Last Activity - {formatDate(project.updatedAt)} + {formatDate(project.lastActivity)}