diff --git a/pkgs/@strootje/listmonk-api/models.ts b/pkgs/@strootje/listmonk-api/models.ts index e7aa626..88f87bc 100644 --- a/pkgs/@strootje/listmonk-api/models.ts +++ b/pkgs/@strootje/listmonk-api/models.ts @@ -1,10 +1,22 @@ +import { err, ok } from "neverthrow"; import * as v from "valibot"; const m = { response: (data: v.ObjectSchema) => { return v.pipe( - v.object({ data }), - v.transform(({ data }) => data), + v.union([ + v.object({ + error: v.object({ message: v.string() }), + }), + v.object({ data }), + ]), + v.transform((dataOrError) => { + if ("error" in dataOrError) { + return err(dataOrError.error.message); + } + + return ok(dataOrError.data); + }), ); }, diff --git a/pkgs/@strootje/more/mod.api.ts b/pkgs/@strootje/more/mod.api.ts index f7c34fb..80568bf 100644 --- a/pkgs/@strootje/more/mod.api.ts +++ b/pkgs/@strootje/more/mod.api.ts @@ -31,10 +31,6 @@ export const reqres = ( return async (input: SS.InferInput): Promise> => { const result = await func(validateSync(schema.req, input)); - if (!result.ok) { - console.log(`[@strootje/more/api] ::: [ERROR]: ${result}`); - } - return validateSync(schema.res, await result.json()); }; }; diff --git a/src/data.functions/mailing-list.service.ts b/src/data.functions/mailing-list.service.ts index ba4cbdb..724a5ce 100644 --- a/src/data.functions/mailing-list.service.ts +++ b/src/data.functions/mailing-list.service.ts @@ -19,25 +19,36 @@ const getSubscriberMiddleware = createMiddleware().middleware([ next, }) => { if (user.subscriberId) { + const subcriberResult = await listmonk().subscribers(user.subscriberId).get({}); + + if (!subcriberResult.isOk()) { + throw subcriberResult.error; + } + return await next({ context: { - subscriber: await listmonk().subscribers(user.subscriberId).get({}), + subscriber: subcriberResult.value, }, }); } - const { results: foundSubscribers } = await listmonk().subscribers.find({ + const foundSubscribersResult = await listmonk().subscribers.find({ query: `subscribers.email = '${user.email}'`, }); - if (foundSubscribers.length > 1) { - throw "[src/data.functions/mailing-list] ::: found more than 0 or 1 existing subscribers with email"; - } + const foundSubscribers = foundSubscribersResult.isOk() ? foundSubscribersResult.value.results : []; + const subscriber = foundSubscribers[0] ?? await (async () => { + const newSubscriberResult = await listmonk().subscribers.new({ + email: user.email, + name: user.name, + }); - const subscriber = foundSubscribers[0] ?? await listmonk().subscribers.new({ - email: user.email, - name: user.name, - }); + if (!newSubscriberResult.isOk()) { + throw newSubscriberResult.error; + } + + return newSubscriberResult.value; + })(); await updateUser({ data: { @@ -63,23 +74,33 @@ export const updateSubscriber = createServerFn().middleware([ ]).inputValidator(v.object({ listId: v.number(), subscribe: v.boolean(), -})).handler(({ +})).handler(async ({ context: { subscriber }, data: { listId, subscribe }, }) => { - return listmonk().subscribers(subscriber.id).update({ + const subscriberResult = await listmonk().subscribers(subscriber.id).update({ ...subscriber, lists: [ ...subscriber.lists.filter((p) => subscribe || p.id !== listId).map((p) => p.id), ...subscribe ? [listId] : [], ], }); + + if (!subscriberResult.isOk()) { + throw subscriberResult.error; + } + + return subscriberResult.value; }); export const getMailingLists = createServerFn().handler(async () => { - const lists = await listmonk().lists.get({ + const listsResult = await listmonk().lists.get({ tags: ["app-later"], }); - return lists.results; + if (!listsResult.isOk()) { + throw listsResult.error; + } + + return listsResult.value.results; });