Skip to content

Commit e1307cc

Browse files
committed
Support deletion of model
1 parent 08fb263 commit e1307cc

File tree

4 files changed

+76
-2
lines changed

4 files changed

+76
-2
lines changed

components/model/grid.vue

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { Cog6ToothIcon } from '@heroicons/vue/24/outline';
33
import { NormalizedModel } from '~~/types/models';
44
import useModel from '~~/stores/useModel';
5+
import ModalConfirm from '~~/components/modal/confirm.vue';
56
67
const model = useModel();
78
@@ -16,13 +17,26 @@
1617
const handleSelectModel = (md: NormalizedModel) => {
1718
model.setTarget(md);
1819
};
20+
21+
const deleteModelModal = useModal(ModalConfirm, {
22+
id: 'confirm-delete-model',
23+
onConfirm: async (closeModal) => {
24+
const deleteId = model.target?.id;
25+
26+
await model.delete(deleteId);
27+
28+
closeModal();
29+
30+
model.unsetTarget();
31+
},
32+
});
1933
</script>
2034

2135
<template>
2236
<section class="flex gap-x-2 w-full">
2337
<slot />
2438
<Dropdown
25-
:disabled="!model.target"
39+
:disabled="model.isLoading || !model.target"
2640
avatar
2741
class="rounded-lg"
2842
color="ghost"
@@ -33,7 +47,9 @@
3347
</template>
3448
<template #options>
3549
<DropdownOption>Edit</DropdownOption>
36-
<DropdownOption>Delete</DropdownOption>
50+
<DropdownOption @click="deleteModelModal.open()">
51+
Delete
52+
</DropdownOption>
3753
</template>
3854
</Dropdown>
3955
<article
@@ -55,6 +71,12 @@
5571
{{ md.name }}
5672
</a>
5773
</div>
74+
<ClientOnly>
75+
<component
76+
:is="deleteModelModal.component"
77+
content="Are you sure you want to delete this model?"
78+
/>
79+
</ClientOnly>
5880
</section>
5981
<div v-if="model.target">
6082
<ModelTable

server/routes/models/[id].delete.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { ModelServices } from '~~/server/services';
2+
import extractAppKey from '~~/server/lib/extractAppKey';
3+
4+
type QueryParams = {
5+
apiKey: string;
6+
};
7+
8+
export default defineEventHandler(async (event) => {
9+
const query = getQuery(event) as QueryParams;
10+
const { appId } = await extractAppKey(event, query.apiKey);
11+
const modelId = event.context.params?.id ?? '';
12+
13+
const model = await new ModelServices(event).delete({
14+
id: modelId,
15+
appId,
16+
});
17+
18+
return model;
19+
});

server/services/modelServices.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,24 @@ export default class ModelServices extends SupabaseService {
2222
return models.data[0];
2323
}
2424

25+
async delete(params: { id: string; appId: string }) {
26+
const model = await this.client
27+
.from('models')
28+
.update({
29+
deleted_at: new Date().toISOString(),
30+
})
31+
.eq('id', params.id)
32+
.eq('app_id', params.appId)
33+
.eq('user_id', this.user.id)
34+
.select('*');
35+
36+
if (model.error !== null) {
37+
throw ErrorResponse.supabase(model.error);
38+
}
39+
40+
return model.data[0];
41+
}
42+
2543
async find(id: string) {
2644
const models = await this.client
2745
.from('models')

stores/useModel.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ export default defineStore('models', () => {
5858
});
5959
};
6060

61+
const del = async (id: string): Promise<void> => {
62+
await $fetch(`/models/${id}`, {
63+
method: 'DELETE',
64+
query: { apiKey },
65+
async onResponse({ response }) {
66+
if (response.status === 200) {
67+
toast.success('Deleted the model!');
68+
69+
await refresh();
70+
}
71+
},
72+
});
73+
};
74+
6175
return {
6276
/** PROPERTIES */
6377
isDisabled,
@@ -68,6 +82,7 @@ export default defineStore('models', () => {
6882

6983
/** METHODS */
7084
create,
85+
delete: del,
7186
setTarget,
7287
unsetTarget,
7388
};

0 commit comments

Comments
 (0)