diff --git a/svelte/src/routes/crates/[crate_id]/delete/+page.svelte b/svelte/src/routes/crates/[crate_id]/delete/+page.svelte index a221ddf432f..a74c6fedda5 100644 --- a/svelte/src/routes/crates/[crate_id]/delete/+page.svelte +++ b/svelte/src/routes/crates/[crate_id]/delete/+page.svelte @@ -1,6 +1,206 @@ -

Delete Crate: {data.crate_id}

-

Stub route for /crates/:crate_id/delete

+ + +
+
+

Delete the {crateName} crate?

+ +

Are you sure you want to delete the crate "{crateName}"?

+ + + Important: + This action will permanently delete the crate and its associated versions. Deleting a crate cannot be reversed! + + +
+

Potential Impact:

+
    +
  • Users will no longer be able to download this crate.
  • +
  • Any dependencies or projects relying on this crate will be broken.
  • +
  • Deleted crates cannot be restored.
  • +
  • Publishing a crate with the same name will be blocked for 24 hours.
  • +
+
+ +
+

Requirements:

+

A crate can only be deleted if it is not depended upon by any other crate on crates.io.

+

Additionally, a crate can only be deleted if either:

+
    +
  1. the crate has been published for less than 72 hours
  2. +
+
or
+
    +
  1. +
      +
    1. the crate only has a single owner, and
    2. +
    3. the crate has been downloaded less than 1000 times for each month it has been published.
    4. +
    +
  2. +
+
+ +
+

Reason:

+ +
+ + + + + +
+ + {#if isDeleting} +
+ +
+ {/if} +
+
+
+ + diff --git a/svelte/src/routes/crates/[crate_id]/delete/+page.ts b/svelte/src/routes/crates/[crate_id]/delete/+page.ts index 73ecd54e902..9500c03c8f1 100644 --- a/svelte/src/routes/crates/[crate_id]/delete/+page.ts +++ b/svelte/src/routes/crates/[crate_id]/delete/+page.ts @@ -1,3 +1,16 @@ -export function load({ params }) { - return { crate_id: params.crate_id }; +import { error } from '@sveltejs/kit'; + +export async function load({ parent }) { + let { userPromise, ownersPromise } = await parent(); + + let user = await userPromise; + if (!user) { + error(401, { message: 'This page requires authentication', loginNeeded: true }); + } + + let owners = await ownersPromise; + let isOwner = owners.some(o => o.kind === 'user' && o.id === user.id); + if (!isOwner) { + error(403, { message: 'This page is only accessible by crate owners' }); + } }