Skip to content

Commit 03fb544

Browse files
authored
Tidying Up Data Layer (#6)
1 parent 2f4fc90 commit 03fb544

File tree

6 files changed

+55
-49
lines changed

6 files changed

+55
-49
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,5 @@ Just finished up the database connection, next steps:
104104
The database and UI are now connected, some improvements to make:
105105

106106
- [x] Change folders to link components, remove all client state
107-
- [ ] Clean up the database and data fetching patterns
107+
- [x] Clean up the database and data fetching patterns
108108
- [ ] Real homepage

src/app/drive-contents.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import { ChevronRight, Upload } from "lucide-react";
44
import Link from "next/link";
55

66
import { Button } from "~/components/ui/button";
7-
import type { files, folders } from "~/server/db/schema";
7+
import type { File, Folder } from "~/server/db/schema";
88

99
import { FileRow, FolderRow } from "./file-row";
1010

1111
export default function DriveContents(props: {
12-
files: (typeof files.$inferSelect)[];
13-
folders: (typeof folders.$inferSelect)[];
14-
parents: (typeof folders.$inferSelect)[];
12+
files: File[];
13+
folders: Folder[];
14+
parents: Folder[];
1515
}) {
1616
const handleUpload = () => {
1717
alert("Upload functionality would be implemented here");

src/app/f/[folderId]/page.tsx

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,9 @@
1-
import { eq } from "drizzle-orm";
21
import { z } from "zod";
32

4-
import { db } from "~/server/db";
5-
import {
6-
files as fileSchema,
7-
folders as folderSchema,
8-
} from "~/server/db/schema";
3+
import * as queries from "~/server/db/queries";
94

105
import DriveContents from "../../drive-contents";
116

12-
async function getAllParents(folderId: number) {
13-
const parents = [];
14-
let currentId: number | null = folderId;
15-
while (currentId != null) {
16-
const folders = await db
17-
.selectDistinct()
18-
.from(folderSchema)
19-
.where(eq(folderSchema.id, currentId));
20-
21-
if (!folders[0]) throw new Error("parent folder not found");
22-
23-
parents.unshift(folders[0]);
24-
currentId = folders[0]?.parent; // parent can be null
25-
}
26-
27-
return parents;
28-
}
29-
307
export default async function GoogleDriveClone(props: {
318
params: Promise<{ folderId: number }>;
329
}) {
@@ -37,22 +14,10 @@ export default async function GoogleDriveClone(props: {
3714

3815
if (!success) return <div>Invalid Folder ID</div>;
3916

40-
const folderId = data.folderId;
41-
const parentsPromise = getAllParents(folderId);
42-
43-
const foldersPromise = db
44-
.select()
45-
.from(folderSchema)
46-
.where(eq(folderSchema.parent, folderId));
47-
const filesPromise = db
48-
.select()
49-
.from(fileSchema)
50-
.where(eq(fileSchema.parent, folderId));
51-
5217
const [folders, files, parents] = await Promise.all([
53-
foldersPromise,
54-
filesPromise,
55-
parentsPromise,
18+
queries.getAllFolders(data.folderId),
19+
queries.getAllFiles(data.folderId),
20+
queries.getAllParentsForFolder(data.folderId),
5621
]);
5722

5823
return <DriveContents folders={folders} files={files} parents={parents} />;

src/app/file-row.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { FileIcon, Folder as FolderIcon } from "lucide-react";
22
import Link from "next/link";
33

4-
import type { files, folders } from "~/server/db/schema";
4+
import type { File, Folder } from "~/server/db/schema";
55

6-
export function FileRow(props: { file: typeof files.$inferSelect }) {
6+
export function FileRow(props: { file: File }) {
77
const { file } = props;
88

99
return (
@@ -29,7 +29,7 @@ export function FileRow(props: { file: typeof files.$inferSelect }) {
2929
);
3030
}
3131

32-
export function FolderRow(props: { folder: typeof folders.$inferSelect }) {
32+
export function FolderRow(props: { folder: Folder }) {
3333
const { folder } = props;
3434

3535
return (

src/server/db/queries.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import "server-only"; // Ensure this file is only run on the server
2+
3+
import { eq } from "drizzle-orm";
4+
5+
import { db } from "~/server/db";
6+
import {
7+
files_table as fileSchema,
8+
folders_table as folderSchema,
9+
} from "~/server/db/schema";
10+
11+
export async function getAllParentsForFolder(folderId: number) {
12+
const parents = [];
13+
let currentId: number | null = folderId;
14+
while (currentId != null) {
15+
const folders = await db
16+
.selectDistinct()
17+
.from(folderSchema)
18+
.where(eq(folderSchema.id, currentId));
19+
20+
if (!folders[0]) throw new Error("parent folder not found");
21+
22+
parents.unshift(folders[0]);
23+
currentId = folders[0]?.parent; // parent can be null
24+
}
25+
26+
return parents;
27+
}
28+
29+
export function getAllFolders(folderId: number) {
30+
return db
31+
.select()
32+
.from(folderSchema)
33+
.where(eq(folderSchema.parent, folderId));
34+
}
35+
36+
export function getAllFiles(folderId: number) {
37+
return db.select().from(fileSchema).where(eq(fileSchema.parent, folderId));
38+
}

src/server/db/schema.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88

99
const createTable = singlestoreTableCreator((name) => `drive_tutorial_${name}`);
1010

11-
export const files = createTable(
11+
export const files_table = createTable(
1212
"files",
1313
{
1414
id: bigint("id", { mode: "number", unsigned: true })
@@ -22,7 +22,7 @@ export const files = createTable(
2222
(table) => [index("parent_index").on(table.parent)],
2323
);
2424

25-
export const folders = createTable(
25+
export const folders_table = createTable(
2626
"folders",
2727
{
2828
id: bigint("id", { mode: "number", unsigned: true })
@@ -33,3 +33,6 @@ export const folders = createTable(
3333
},
3434
(table) => [index("parent_index").on(table.parent)],
3535
);
36+
37+
export type File = typeof files_table.$inferSelect;
38+
export type Folder = typeof folders_table.$inferSelect;

0 commit comments

Comments
 (0)