diff --git a/api/resolvers/sub.js b/api/resolvers/sub.js index ead446c9..ef18d92e 100644 --- a/api/resolvers/sub.js +++ b/api/resolvers/sub.js @@ -212,7 +212,7 @@ export default { throw new GraphQLError('you must be logged in', { extensions: { code: 'UNAUTHENTICATED' } }) } - await ssValidate(territorySchema, data, { models, me }) + await ssValidate(territorySchema, data, { models, me, sub: { name: data.oldName } }) if (data.oldName) { return await updateSub(parent, data, { me, models, lnd, hash, hmac }) diff --git a/components/territory-form.js b/components/territory-form.js index 279cecc0..70dc3157 100644 --- a/components/territory-form.js +++ b/components/territory-form.js @@ -86,7 +86,7 @@ export default function TerritoryForm ({ sub }) { moderated: sub?.moderated || false, nsfw: sub?.nsfw || false }} - schema={territorySchema({ client, me })} + schema={territorySchema({ client, me, sub })} invoiceable onSubmit={onSubmit} className='mb-5' diff --git a/lib/validate.js b/lib/validate.js index 9e65b5e5..a07a823c 100644 --- a/lib/validate.js +++ b/lib/validate.js @@ -183,7 +183,7 @@ async function usernameExists (name, { client, models }) { return !!user } -async function subExists (name, { client, models, me }) { +async function subExists (name, { client, models, me, filter }) { if (!client && !models) { throw new Error('cannot check for territory') } @@ -191,13 +191,13 @@ async function subExists (name, { client, models, me }) { let sub // apollo client if (client) { - const { data } = await client.query({ query: SUB, variables: { sub: name } }) + const { data } = await client.query({ query: SUB, variables: { sub: name }, fetchPolicy: 'no-cache' }) sub = data?.sub } else { sub = await models.sub.findUnique({ where: { name } }) } - return !!sub && sub.userId !== Number(me?.id) + return !!sub && (!filter || filter(sub)) } async function subActive (name, { client, models, me }) { @@ -277,22 +277,19 @@ export function advPostSchemaMembers ({ me, existingBoost = 0, ...args }) { } export function subSelectSchemaMembers (args) { - // for subSelectSchemaMembers we want to filter out me - // because we want to allow the user to select their own territory - const { me, ...filteredArgs } = args return { sub: string().required('required').test({ name: 'sub', test: async sub => { if (!sub || !sub.length) return false - return await subExists(sub, filteredArgs) + return await subExists(sub, args) }, message: 'pick valid territory' }).test({ name: 'sub', test: async sub => { if (!sub || !sub.length) return false - return await subActive(sub, filteredArgs) + return await subActive(sub, args) }, message: 'territory is not active' }) @@ -414,7 +411,15 @@ export function territorySchema (args) { name: 'name', test: async name => { if (!name || !name.length) return false - return !(await subExists(name, args)) + const edit = !!args.sub + let exists + if (edit) { + // ignore the sub we are currently editing + exists = await subExists(name, { ...args, filter: sub => sub.name !== args.sub.name }) + } else { + exists = await subExists(name, args) + } + return !exists }, message: 'taken' }),