Skip to content

Commit 037f658

Browse files
committed
publish: Trigger OG image generation after version updates
1 parent ee9c8b8 commit 037f658

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/controllers/krate/publish.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::app::AppState;
44
use crate::auth::{AuthCheck, AuthHeader, Authentication};
55
use crate::worker::jobs::{
6-
self, CheckTyposquat, SendPublishNotificationsJob, UpdateDefaultVersion,
6+
self, CheckTyposquat, GenerateOgImage, SendPublishNotificationsJob, UpdateDefaultVersion,
77
};
88
use axum::Json;
99
use axum::body::{Body, Bytes};
@@ -549,14 +549,14 @@ pub async fn publish(app: AppState, req: Parts, body: Body) -> AppResult<Json<Go
549549
// Compared to only using a background job, this prevents us from getting into a
550550
// situation where a crate exists in the `crates` table but doesn't have a default
551551
// version in the `default_versions` table.
552-
if let Some((existing_default_version, _)) = existing_default_version {
552+
if let Some((existing_default_version, _)) = &existing_default_version {
553553
let published_default_version = DefaultVersion {
554554
id: version.id,
555555
num: semver,
556556
yanked: false,
557557
};
558558

559-
if existing_default_version < published_default_version {
559+
if existing_default_version < &published_default_version {
560560
diesel::update(default_versions::table)
561561
.filter(default_versions::crate_id.eq(krate.id))
562562
.set(default_versions::version_id.eq(version.id))
@@ -631,6 +631,14 @@ pub async fn publish(app: AppState, req: Parts, body: Body) -> AppResult<Json<Go
631631
}),
632632
)?;
633633

634+
// Enqueue OG image generation job if not handled by UpdateDefaultVersion
635+
if existing_default_version.is_none() {
636+
let og_image_job = GenerateOgImage::new(krate.name.clone());
637+
if let Err(error) = og_image_job.enqueue(conn).await {
638+
error!("Failed to enqueue `GenerateOgImage` job: {error}");
639+
}
640+
};
641+
634642
// Experiment: check new crates for potential typosquatting.
635643
if existing_crate.is_none() {
636644
let crates_feed_job = jobs::rss::SyncCratesFeed;

src/worker/jobs/update_default_version.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use crate::models::update_default_version;
2+
use crate::schema::crates;
23
use crate::worker::Environment;
4+
use crate::worker::jobs::GenerateOgImage;
35
use crates_io_worker::BackgroundJob;
6+
use diesel::prelude::*;
7+
use diesel_async::RunQueryDsl;
48
use serde::{Deserialize, Serialize};
59
use std::sync::Arc;
610
use tracing::info;
@@ -30,6 +34,17 @@ impl BackgroundJob for UpdateDefaultVersion {
3034
let mut conn = ctx.deadpool.get().await?;
3135
update_default_version(crate_id, &mut conn).await?;
3236

37+
// Get the crate name for OG image generation
38+
let crate_name: String = crates::table
39+
.filter(crates::id.eq(crate_id))
40+
.select(crates::name)
41+
.first(&mut conn)
42+
.await?;
43+
44+
// Generate OG image after updating default version
45+
info!("Enqueueing OG image generation for crate {crate_name}");
46+
GenerateOgImage::new(crate_name).enqueue(&mut conn).await?;
47+
3348
Ok(())
3449
}
3550
}

0 commit comments

Comments
 (0)