This external crate was either deleted or set to private by its original owner. You can remove it now or keep it in the case that it's set back to public.
+
+
+
@@ -95,7 +103,6 @@ export default {
}
const crate = isExternal ? await $api.getExternalCrate(crateId) : await $api.getCrate(crateId)
-
if (!crate) {
return redirect('/home')
}
@@ -108,7 +115,7 @@ export default {
$modal.replace('linkDetails', { link, endpoint: crate.endpoint, editable })
}
- return { crate, isExternal, isPublic, editable }
+ return { crate, isExternal, isPublic, editable, deleted: crate.deleted }
},
data() {
return {
@@ -129,6 +136,8 @@ export default {
async fetch() {
this.$store.commit('SET_CURRENT_CRATE_LINKS', [])
+ if (this.deleted) return
+
const res = this.isExternal ? await this.$api.getLinksOfExternalCrate(this.crate) : await this.$api.getLinksOfCrate(this.crate.id)
if (res.last) {
@@ -331,7 +340,7 @@ export default {
async deleteCrate() {
const confirm = await this.$confirm({
title: `Are you sure you want to delete this crate?`,
- message: 'This will also permanently delete all links belonging to that crate.',
+ message: `This will also permanently delete all links belonging to that crate.${ this.crate.public ? ' All users who are subscribed to this crate or try to access it by its link will see an error.' : '' }`,
confirmText: 'Delete Crate',
danger: true
})
@@ -348,7 +357,7 @@ export default {
async deleteExternal() {
const confirm = await this.$confirm({
title: `Are you sure you want to remove this external crate?`,
- message: 'You can always readd it later.',
+ ...(!this.deleted && { message: 'You can always re-add with its original sharing link later.' }),
confirmText: 'Remove Crate',
danger: true
})
@@ -373,7 +382,7 @@ export default {
async makePrivate() {
const confirm = await this.$confirm({
title: `Are you sure you want to make this crate private?`,
- message: 'If you have already shared this crate, users will see a 404 error.',
+ message: 'All users who are subscribed to this crate or try to access it by its link will see an error.',
confirmText: 'Make Private',
danger: true
})
@@ -538,6 +547,11 @@ export default {
align-items: center;
justify-content: center;
margin-top: 4rem;
+ text-align: center;
+
+ .deleted {
+ color: var(--red);
+ }
& .link-icon {
color: var(--text-light);
diff --git a/server/models/externalCrate.ts b/server/models/externalCrate.ts
index 3c1d194..7736f66 100644
--- a/server/models/externalCrate.ts
+++ b/server/models/externalCrate.ts
@@ -10,6 +10,7 @@ export class ExternalCrate {
name?: string
description?: string
icon?: string
+ deleted?: boolean
endpoint: string
addedAt: Date
diff --git a/server/router/api/external.ts b/server/router/api/external.ts
index eb5c34c..1dd1237 100644
--- a/server/router/api/external.ts
+++ b/server/router/api/external.ts
@@ -56,8 +56,12 @@ router.get('/', parsePaginate, async (req: express.Request, res: express.Respons
if (externalCrates.count > 0) {
const crates = await Promise.all(externalCrates.items.map(async (externalCrate: ExternalCrate) => {
- await externalCrate.refresh()
- return externalCrate
+ try {
+ await externalCrate.refresh()
+ return externalCrate
+ } catch (err) {
+ return { ...externalCrate, deleted: true }
+ }
}))
return res.ok(crates)
@@ -81,7 +85,11 @@ router.get('/:id', async (req: express.Request, res: express.Response, next: exp
return res.fail(404, 'crate not found')
}
- await crate.refresh()
+ try {
+ await crate.refresh()
+ } catch (err) {
+ return res.ok({ ...crate, deleted: true })
+ }
// await Stat.addRecentlyUsedCrate(crate.id)