Skip to content

Commit

Permalink
finalize importing subs
Browse files Browse the repository at this point in the history
  • Loading branch information
vorant94 committed Jun 25, 2024
1 parent 1a3db67 commit b43f659
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 54 deletions.
8 changes: 4 additions & 4 deletions src/subscriptions/components/subscriptions-insert-table.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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 (
<form
id="subscriptionsUpsertTableForm"
onSubmit={handleSubmit(insertSubscriptions)}
onSubmit={handleSubmit(insertSubscriptionsCb)}
ref={ref}>
<Table.ScrollContainer minWidth="100%">
<Table>
Expand Down
107 changes: 57 additions & 50 deletions src/subscriptions/models/subscription.table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,72 +35,41 @@ export function findSubscriptions(): Promise<Array<SubscriptionModel>> {
);
}

// TODO optionally allow to accept transaction
export function getSubscription(id: number): Promise<SubscriptionModel> {
export function insertSubscription(
raw: InsertSubscriptionModel,
): Promise<SubscriptionModel> {
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<SubscriptionModel> {
const { tags, ...rest } = insertSubscriptionSchema.parse(raw);

const id = await db.transaction(
'rw',
export function insertSubscriptions(
raw: Array<InsertSubscriptionModel>,
): Promise<Array<SubscriptionModel>> {
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<SubscriptionModel> {
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(
Expand 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<void> {
Expand All @@ -134,3 +103,41 @@ export function deleteSubscription(id: number): Promise<void> {
},
);
}

async function _getSubscription(id: number): Promise<SubscriptionModel> {
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<SubscriptionModel> {
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);
}

0 comments on commit b43f659

Please sign in to comment.