diff --git a/web/src/actions/api/service.ts b/web/src/actions/api/service.ts index ead6305..58c4e5f 100644 --- a/web/src/actions/api/service.ts +++ b/web/src/actions/api/service.ts @@ -46,6 +46,9 @@ export const apiServiceActions = { const service = await prisma.service.findFirst({ where: { + listedAt: { lte: new Date() }, + serviceVisibility: { in: ['PUBLIC', 'ARCHIVED', 'UNLISTED'] }, + OR: [ ...(input.id ? ([{ id: input.id }] satisfies Prisma.ServiceWhereInput[]) : []), ...(input.slug ? ([{ slug: input.slug }] satisfies Prisma.ServiceWhereInput[]) : []), @@ -76,10 +79,20 @@ export const apiServiceActions = { i2pUrls: true, tosUrls: true, referral: true, + listedAt: true, + verifiedAt: true, + serviceVisibility: true, }, }) - if (!service) { + if ( + !service || + (service.serviceVisibility !== 'PUBLIC' && + service.serviceVisibility !== 'ARCHIVED' && + service.serviceVisibility !== 'UNLISTED') || + !service.listedAt || + service.listedAt > new Date() + ) { throw new ActionError({ code: 'NOT_FOUND', message: 'Service not found', @@ -91,6 +104,7 @@ export const apiServiceActions = { slug: service.slug, name: service.name, description: service.description, + serviceVisibility: service.serviceVisibility, verificationStatus: service.verificationStatus, verificationStatusInfo: pick(getVerificationStatusInfo(service.verificationStatus), [ 'value', @@ -99,9 +113,11 @@ export const apiServiceActions = { 'labelShort', 'description', ]), + verifiedAt: service.verifiedAt, kycLevel: service.kycLevel, kycLevelInfo: pick(getKycLevelInfo(service.kycLevel.toString()), ['value', 'name', 'description']), categories: service.categories, + listedAt: service.listedAt, serviceUrls: [...service.serviceUrls, ...service.onionUrls, ...service.i2pUrls].map( (url) => url + (service.referral ?? '') ), diff --git a/web/src/actions/serviceSuggestion.ts b/web/src/actions/serviceSuggestion.ts index 74b0e62..c595345 100644 --- a/web/src/actions/serviceSuggestion.ts +++ b/web/src/actions/serviceSuggestion.ts @@ -1,10 +1,4 @@ -import { - Currency, - ServiceSuggestionStatus, - ServiceSuggestionType, - ServiceVisibility, - VerificationStatus, -} from '@prisma/client' +import { Currency } from '@prisma/client' import { z } from 'astro/zod' import { ActionError } from 'astro:actions' import { formatDistanceStrict } from 'date-fns' @@ -118,9 +112,9 @@ export const serviceSuggestionActions = { const serviceSuggestion = await prisma.serviceSuggestion.create({ data: { - type: ServiceSuggestionType.EDIT_SERVICE, + type: 'EDIT_SERVICE', notes: combinedNotes, - status: ServiceSuggestionStatus.PENDING, + status: 'PENDING', userId: context.locals.user.id, serviceId: service.id, }, @@ -229,12 +223,12 @@ export const serviceSuggestionActions = { kycLevel: input.kycLevel, acceptedCurrencies: input.acceptedCurrencies, imageUrl, - verificationStatus: VerificationStatus.COMMUNITY_CONTRIBUTED, + verificationStatus: 'COMMUNITY_CONTRIBUTED', overallScore: 0, privacyScore: 0, trustScore: 0, listedAt: new Date(), - serviceVisibility: ServiceVisibility.UNLISTED, + serviceVisibility: 'UNLISTED', categories: { connect: input.categories.map((id) => ({ id })), }, @@ -250,8 +244,8 @@ export const serviceSuggestionActions = { const serviceSuggestion = await tx.serviceSuggestion.create({ data: { notes: input.notes, - type: ServiceSuggestionType.CREATE_SERVICE, - status: ServiceSuggestionStatus.PENDING, + type: 'CREATE_SERVICE', + status: 'PENDING', userId: context.locals.user.id, serviceId: service.id, }, diff --git a/web/src/components/Footer.astro b/web/src/components/Footer.astro index 37a4eda..7e9d849 100644 --- a/web/src/components/Footer.astro +++ b/web/src/components/Footer.astro @@ -15,17 +15,31 @@ const links = [ icon: 'ri:git-repository-line', external: true, }, + ...(Astro.url.origin !== new URL(ONION_ADDRESS).origin + ? [ + { + href: ONION_ADDRESS, + label: 'Tor', + icon: 'onion', + external: true, + }, + ] + : []), + ...(Astro.url.origin !== new URL(I2P_ADDRESS).origin + ? [ + { + href: I2P_ADDRESS, + label: 'I2P', + icon: 'i2p', + external: true, + }, + ] + : []), { - href: ONION_ADDRESS, - label: 'Tor', - icon: 'onion', - external: true, - }, - { - href: I2P_ADDRESS, - label: 'I2P', - icon: 'i2p', - external: true, + href: '/docs/api', + label: 'API', + icon: 'ri:plug-line', + external: false, }, { href: '/about', diff --git a/web/src/constants/serviceVisibility.ts b/web/src/constants/serviceVisibility.ts index ca9634e..3864286 100644 --- a/web/src/constants/serviceVisibility.ts +++ b/web/src/constants/serviceVisibility.ts @@ -65,7 +65,7 @@ export const { value: 'ARCHIVED', slug: 'archived', label: 'Archived', - description: 'No longer operational', + description: 'No longer operational.', longDescription: 'Archived service, no longer exists or ceased operations. Information may be outdated.', icon: 'ri:archive-line', diff --git a/web/src/pages/admin/releases.astro b/web/src/pages/admin/releases.astro index 9c25637..b86e20b 100644 --- a/web/src/pages/admin/releases.astro +++ b/web/src/pages/admin/releases.astro @@ -1,8 +1,8 @@ --- import { RELEASE_DATE, RELEASE_NUMBER } from 'astro:env/server' -import TimeFormatted from '../../components/TimeFormatted.astro' import MiniLayout from '../../layouts/MiniLayout.astro' +import { timeAgo } from '../../lib/timeAgo' const releaseDate = RELEASE_DATE && !isNaN(new Date(RELEASE_DATE).getTime()) ? new Date(RELEASE_DATE) : undefined @@ -37,7 +37,7 @@ const releaseDate = { !!releaseDate && (
- (