add deleteStory function, fix schema to allow it
This commit is contained in:
		
							parent
							
								
									f454f6739e
								
							
						
					
					
						commit
						7b68a7451e
					
				
							
								
								
									
										
											BIN
										
									
								
								prisma/dev.db
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								prisma/dev.db
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | -- RedefineTables | ||||||
|  | PRAGMA defer_foreign_keys=ON; | ||||||
|  | PRAGMA foreign_keys=OFF; | ||||||
|  | CREATE TABLE "new_Sub" ( | ||||||
|  |     "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, | ||||||
|  |     "storyId" INTEGER, | ||||||
|  |     "pubId" INTEGER, | ||||||
|  |     "submitted" TEXT NOT NULL, | ||||||
|  |     "responded" TEXT, | ||||||
|  |     "responseId" INTEGER, | ||||||
|  |     CONSTRAINT "Sub_storyId_fkey" FOREIGN KEY ("storyId") REFERENCES "Story" ("id") ON DELETE SET NULL ON UPDATE CASCADE, | ||||||
|  |     CONSTRAINT "Sub_pubId_fkey" FOREIGN KEY ("pubId") REFERENCES "Pub" ("id") ON DELETE SET NULL ON UPDATE CASCADE, | ||||||
|  |     CONSTRAINT "Sub_responseId_fkey" FOREIGN KEY ("responseId") REFERENCES "Response" ("id") ON DELETE SET NULL ON UPDATE CASCADE | ||||||
|  | ); | ||||||
|  | INSERT INTO "new_Sub" ("id", "pubId", "responded", "responseId", "storyId", "submitted") SELECT "id", "pubId", "responded", "responseId", "storyId", "submitted" FROM "Sub"; | ||||||
|  | DROP TABLE "Sub"; | ||||||
|  | ALTER TABLE "new_Sub" RENAME TO "Sub"; | ||||||
|  | PRAGMA foreign_keys=ON; | ||||||
|  | PRAGMA defer_foreign_keys=OFF; | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | /* | ||||||
|  |   Warnings: | ||||||
|  | 
 | ||||||
|  |   - You are about to drop the column `deleted` on the `Story` table. All the data in the column will be lost. | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | -- RedefineTables | ||||||
|  | PRAGMA defer_foreign_keys=ON; | ||||||
|  | PRAGMA foreign_keys=OFF; | ||||||
|  | CREATE TABLE "new_Story" ( | ||||||
|  |     "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, | ||||||
|  |     "word_count" INTEGER NOT NULL, | ||||||
|  |     "title" TEXT NOT NULL | ||||||
|  | ); | ||||||
|  | INSERT INTO "new_Story" ("id", "title", "word_count") SELECT "id", "title", "word_count" FROM "Story"; | ||||||
|  | DROP TABLE "Story"; | ||||||
|  | ALTER TABLE "new_Story" RENAME TO "Story"; | ||||||
|  | PRAGMA foreign_keys=ON; | ||||||
|  | PRAGMA defer_foreign_keys=OFF; | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | /* | ||||||
|  |   Warnings: | ||||||
|  | 
 | ||||||
|  |   - You are about to drop the column `deleted` on the `Pub` table. All the data in the column will be lost. | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | -- RedefineTables | ||||||
|  | PRAGMA defer_foreign_keys=ON; | ||||||
|  | PRAGMA foreign_keys=OFF; | ||||||
|  | CREATE TABLE "new_Pub" ( | ||||||
|  |     "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, | ||||||
|  |     "title" TEXT NOT NULL, | ||||||
|  |     "link" TEXT NOT NULL DEFAULT '', | ||||||
|  |     "query_after_days" INTEGER NOT NULL | ||||||
|  | ); | ||||||
|  | INSERT INTO "new_Pub" ("id", "link", "query_after_days", "title") SELECT "id", "link", "query_after_days", "title" FROM "Pub"; | ||||||
|  | DROP TABLE "Pub"; | ||||||
|  | ALTER TABLE "new_Pub" RENAME TO "Pub"; | ||||||
|  | PRAGMA foreign_keys=ON; | ||||||
|  | PRAGMA defer_foreign_keys=OFF; | ||||||
|  | @ -14,7 +14,6 @@ model Story { | ||||||
|   id         Int     @id @default(autoincrement()) |   id         Int     @id @default(autoincrement()) | ||||||
|   word_count Int |   word_count Int | ||||||
|   title      String |   title      String | ||||||
|   deleted    Int     @default(0) |  | ||||||
|   subs       Sub[] |   subs       Sub[] | ||||||
|   genres     Genre[] |   genres     Genre[] | ||||||
| } | } | ||||||
|  | @ -24,7 +23,6 @@ model Pub { | ||||||
|   title            String |   title            String | ||||||
|   link             String  @default("") |   link             String  @default("") | ||||||
|   query_after_days Int |   query_after_days Int | ||||||
|   deleted          Int     @default(0) |  | ||||||
|   subs             Sub[] |   subs             Sub[] | ||||||
|   genres           Genre[] |   genres           Genre[] | ||||||
| } | } | ||||||
|  | @ -44,12 +42,12 @@ model Response { | ||||||
| 
 | 
 | ||||||
| model Sub { | model Sub { | ||||||
|   id         Int      @id @default(autoincrement()) |   id         Int      @id @default(autoincrement()) | ||||||
|   story      Story    @relation(fields: [storyId], references: [id]) |   story      Story?    @relation(fields: [storyId], references: [id]) | ||||||
|   storyId    Int |   storyId    Int? | ||||||
|   pub        Pub      @relation(fields: [pubId], references: [id]) |   pub        Pub?      @relation(fields: [pubId], references: [id]) | ||||||
|   pubId      Int |   pubId      Int? | ||||||
|   submitted  String |   submitted  String | ||||||
|   responded  String |   responded  String? | ||||||
|   response   Response @relation(fields: [responseId], references: [id]) |   response   Response? @relation(fields: [responseId], references: [id]) | ||||||
|   responseId Int |   responseId Int? | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | "use server" | ||||||
|  | import prisma from "./db"; | ||||||
|  | 
 | ||||||
|  | export async function deleteStory(id) { | ||||||
|  | 	console.log(`id: ${id}`) | ||||||
|  | 	const res = await prisma.story.delete({ | ||||||
|  | 		where: { id } | ||||||
|  | 	}) | ||||||
|  | 	console.log(res) | ||||||
|  | } | ||||||
|  | @ -4,11 +4,14 @@ import { StoryWithGenres } from "./page" | ||||||
| import { ArrowUpDown, MoreHorizontal } from "lucide-react" | import { ArrowUpDown, MoreHorizontal } from "lucide-react" | ||||||
| import { Button } from "@/components/ui/button" | import { Button } from "@/components/ui/button" | ||||||
| import { Badge } from "@/components/ui/badge" | import { Badge } from "@/components/ui/badge" | ||||||
| 
 | import { CircleX } from "lucide-react" | ||||||
|  | import { deleteStory } from "app/lib/del" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| const columnHelper = createColumnHelper<StoryWithGenres>() | const columnHelper = createColumnHelper<StoryWithGenres>() | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| export const columns: ColumnDef<StoryWithGenres>[] = [ | export const columns: ColumnDef<StoryWithGenres>[] = [ | ||||||
|   { |   { | ||||||
|     accessorKey: "title", |     accessorKey: "title", | ||||||
|  | @ -40,29 +43,22 @@ export const columns: ColumnDef<StoryWithGenres>[] = [ | ||||||
|     }, |     }, | ||||||
|     enableColumnFilter: false |     enableColumnFilter: false | ||||||
|   }, |   }, | ||||||
|   // {
 |  | ||||||
|   //   accessorFn: row => {
 |  | ||||||
|   //     let unpacked = ""
 |  | ||||||
|   //     for (let i = 0; i < row.genres.length; i++) {
 |  | ||||||
|   //       unpacked = unpacked + " " + row.genres[i].name
 |  | ||||||
|   //     }
 |  | ||||||
|   //     return unpacked
 |  | ||||||
|   //   },
 |  | ||||||
|   //   header: "Genres"
 |  | ||||||
|   //
 |  | ||||||
|   //
 |  | ||||||
|   // },
 |  | ||||||
|   columnHelper.accessor("genres", { |   columnHelper.accessor("genres", { | ||||||
|     cell: props => { |     cell: props => { | ||||||
|       const genres = props.getValue() |       const genres = props.getValue() | ||||||
|         .map(e => <Badge>{e.name}</Badge>) |         .map(e => <Badge>{e.name}</Badge>) | ||||||
|       return genres |       return genres | ||||||
|     } |     } | ||||||
|   }) |   }), | ||||||
|   // {
 |   { | ||||||
|   //   accessorKey: "deleted",
 |     id: "actions", | ||||||
|   //   header: "Deleted"
 |     header: "Actions", | ||||||
|   // },
 |     cell: ({ row }) => { | ||||||
|  |       return <Button variant="ghost" | ||||||
|  |         onClick={() => { deleteStory(row.original.id) }}> | ||||||
|  |         <CircleX /></Button> | ||||||
|  |     } | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ import { | ||||||
|   TableHeader, |   TableHeader, | ||||||
|   TableRow, |   TableRow, | ||||||
| } from "@/components/ui/table" | } from "@/components/ui/table" | ||||||
|  | import { EyeIcon } from "lucide-react" | ||||||
| 
 | 
 | ||||||
| interface DataTableProps<TData, TValue> { | interface DataTableProps<TData, TValue> { | ||||||
|   columns: ColumnDef<TData, TValue>[] |   columns: ColumnDef<TData, TValue>[] | ||||||
|  | @ -105,7 +106,7 @@ export function DataTable<TData, TValue>({ | ||||||
|       <DropdownMenu> |       <DropdownMenu> | ||||||
|         <DropdownMenuTrigger asChild> |         <DropdownMenuTrigger asChild> | ||||||
|           <Button variant="outline" className="justify-self-end"> |           <Button variant="outline" className="justify-self-end"> | ||||||
|             Show/hide |             <EyeIcon /> | ||||||
|           </Button> |           </Button> | ||||||
|         </DropdownMenuTrigger> |         </DropdownMenuTrigger> | ||||||
|         <DropdownMenuContent align="end"> |         <DropdownMenuContent align="end"> | ||||||
|  |  | ||||||
|  | @ -907,6 +907,10 @@ body { | ||||||
|   gap: 0.25rem; |   gap: 0.25rem; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .gap-2 { | ||||||
|  |   gap: 0.5rem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .space-x-1 > :not([hidden]) ~ :not([hidden]) { | .space-x-1 > :not([hidden]) ~ :not([hidden]) { | ||||||
|   --tw-space-x-reverse: 0; |   --tw-space-x-reverse: 0; | ||||||
|   margin-right: calc(0.25rem * var(--tw-space-x-reverse)); |   margin-right: calc(0.25rem * var(--tw-space-x-reverse)); | ||||||
|  | @ -967,6 +971,18 @@ body { | ||||||
|   margin-bottom: calc(2rem * var(--tw-space-y-reverse)); |   margin-bottom: calc(2rem * var(--tw-space-y-reverse)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .justify-self-start { | ||||||
|  |   justify-self: start; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .justify-self-end { | ||||||
|  |   justify-self: end; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .justify-self-center { | ||||||
|  |   justify-self: center; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .overflow-auto { | .overflow-auto { | ||||||
|   overflow: auto; |   overflow: auto; | ||||||
| } | } | ||||||
|  | @ -987,6 +1003,10 @@ body { | ||||||
|   border-radius: calc(var(--radius) - 4px); |   border-radius: calc(var(--radius) - 4px); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .rounded-full { | ||||||
|  |   border-radius: 9999px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .border { | .border { | ||||||
|   border-width: 1px; |   border-width: 1px; | ||||||
| } | } | ||||||
|  | @ -1011,6 +1031,10 @@ body { | ||||||
|   border-color: hsl(var(--primary)); |   border-color: hsl(var(--primary)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .border-transparent { | ||||||
|  |   border-color: transparent; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .bg-accent { | .bg-accent { | ||||||
|   background-color: hsl(var(--accent)); |   background-color: hsl(var(--accent)); | ||||||
| } | } | ||||||
|  | @ -1121,6 +1145,21 @@ body { | ||||||
|   padding-bottom: 1rem; |   padding-bottom: 1rem; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .px-2\.5 { | ||||||
|  |   padding-left: 0.625rem; | ||||||
|  |   padding-right: 0.625rem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .py-0 { | ||||||
|  |   padding-top: 0px; | ||||||
|  |   padding-bottom: 0px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .py-0\.5 { | ||||||
|  |   padding-top: 0.125rem; | ||||||
|  |   padding-bottom: 0.125rem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .pl-3 { | .pl-3 { | ||||||
|   padding-left: 0.75rem; |   padding-left: 0.75rem; | ||||||
| } | } | ||||||
|  | @ -1400,6 +1439,14 @@ body { | ||||||
|   background-color: hsl(var(--secondary) / 0.8); |   background-color: hsl(var(--secondary) / 0.8); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .hover\:bg-destructive\/80:hover { | ||||||
|  |   background-color: hsl(var(--destructive) / 0.8); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .hover\:bg-primary\/80:hover { | ||||||
|  |   background-color: hsl(var(--primary) / 0.8); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .hover\:text-accent-foreground:hover { | .hover\:text-accent-foreground:hover { | ||||||
|   color: hsl(var(--accent-foreground)); |   color: hsl(var(--accent-foreground)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -24,4 +24,4 @@ export default function GenresTrigger({ value, genres }) { | ||||||
| 			</PopoverTrigger> | 			</PopoverTrigger> | ||||||
| 		</> | 		</> | ||||||
| 	) | 	) | ||||||
| } | }   | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue