diff --git a/src/subscriptions/components/subscriptions-insert-table.tsx b/src/subscriptions/components/subscriptions-insert-table.tsx index 3232de4..8e8b069 100644 --- a/src/subscriptions/components/subscriptions-insert-table.tsx +++ b/src/subscriptions/components/subscriptions-insert-table.tsx @@ -19,6 +19,7 @@ import { type SubmitHandler, } from 'react-hook-form'; import type { InsertSubscriptionModel } from '../models/subscription.model.ts'; +import { insertSubscriptions } from '../models/subscription.table.ts'; import { subscriptionCyclePeriodsComboboxData } from '../types/subscription-cycle-period.ts'; import { subscriptionIconsComboboxData } from '../types/subscription-icon.tsx'; @@ -48,18 +49,17 @@ export const SubscriptionsInsertTable = memo( })); }, [tags]); - const insertSubscriptions: SubmitHandler< + const insertSubscriptionsCb: SubmitHandler< SubscriptionsInsertTableFormValue > = async ({ subscriptions }) => { - // TODO bulk insert subscriptions here - console.log(subscriptions); + await insertSubscriptions(subscriptions); onInsert?.(); }; return (
diff --git a/src/subscriptions/models/subscription.table.ts b/src/subscriptions/models/subscription.table.ts index cb73635..ed24e5c 100644 --- a/src/subscriptions/models/subscription.table.ts +++ b/src/subscriptions/models/subscription.table.ts @@ -35,72 +35,41 @@ export function findSubscriptions(): Promise> { ); } -// TODO optionally allow to accept transaction -export function getSubscription(id: number): Promise { +export function insertSubscription( + raw: InsertSubscriptionModel, +): Promise { return db.transaction( - 'r', + 'rw', db.subscriptions, db.subscriptionsTags, db.tags, - async () => { - const raw = await db.subscriptions.get(id); - if (!raw) { - throw new Error(`Subscription not found!`); - } - - const tagsLinks = await db.subscriptionsTags - .where({ subscriptionId: raw.id }) - .toArray(); - - const tags = await Promise.all( - tagsLinks.map(async (link) => db.tags.get(link.tagId)), - ); - - return subscriptionSchema.parse({ ...raw, tags }); - }, + () => insertSubscription(raw), ); } -export async function insertSubscription( - raw: InsertSubscriptionModel, -): Promise { - const { tags, ...rest } = insertSubscriptionSchema.parse(raw); - - const id = await db.transaction( - 'rw', +export function insertSubscriptions( + raw: Array, +): Promise> { + return db.transaction( + `rw`, db.subscriptions, db.subscriptionsTags, - async () => { - const id = await db.subscriptions.add(rest); - - await Promise.all( - tags.map(async (tag) => { - const link: UpsertSubscriptionTagModel = { - tagId: tag.id, - subscriptionId: id, - }; - - await db.subscriptionsTags.add(link); - }), - ); - - return id; - }, + db.tags, + () => Promise.all(raw.map((raw) => _insertSubscription(raw))), ); - - return await getSubscription(id); } -export async function updateSubscription( +export function updateSubscription( raw: UpdateSubscriptionModel, ): Promise { - const { id, tags, ...rest } = updateSubscriptionSchema.parse(raw); - - await db.transaction( + return db.transaction( 'rw', db.subscriptions, db.subscriptionsTags, + db.tags, async () => { + const { id, tags, ...rest } = updateSubscriptionSchema.parse(raw); + await db.subscriptionsTags.where({ subscriptionId: id }).delete(); await Promise.all( @@ -115,10 +84,10 @@ export async function updateSubscription( ); await db.subscriptions.update(id, rest); + + return _getSubscription(id); }, ); - - return await getSubscription(id); } export function deleteSubscription(id: number): Promise { @@ -134,3 +103,41 @@ export function deleteSubscription(id: number): Promise { }, ); } + +async function _getSubscription(id: number): Promise { + const raw = await db.subscriptions.get(id); + if (!raw) { + throw new Error(`Subscription not found!`); + } + + const tagsLinks = await db.subscriptionsTags + .where({ subscriptionId: raw.id }) + .toArray(); + + const tags = await Promise.all( + tagsLinks.map(async (link) => db.tags.get(link.tagId)), + ); + + return subscriptionSchema.parse({ ...raw, tags }); +} + +async function _insertSubscription( + raw: InsertSubscriptionModel, +): Promise { + const { tags, ...rest } = insertSubscriptionSchema.parse(raw); + + const id = await db.subscriptions.add(rest); + + await Promise.all( + tags.map(async (tag) => { + const link: UpsertSubscriptionTagModel = { + tagId: tag.id, + subscriptionId: id, + }; + + await db.subscriptionsTags.add(link); + }), + ); + + return _getSubscription(id); +}