diff --git a/src/lib/prisma/prisma-client.ts b/src/lib/prisma/prisma-client.ts index 5e990e4..7a3c155 100644 --- a/src/lib/prisma/prisma-client.ts +++ b/src/lib/prisma/prisma-client.ts @@ -7,4 +7,5 @@ export default function getPrismaClient(): PrismaClient { return global.prismaClient } -export { getPrismaClient as usePrisma } \ No newline at end of file +export { getPrismaClient as usePrisma } +export { getPrismaClient as useDB } \ No newline at end of file diff --git a/src/lib/prisma/schema.prisma b/src/lib/prisma/schema.prisma index fd2f5c2..79d312d 100644 --- a/src/lib/prisma/schema.prisma +++ b/src/lib/prisma/schema.prisma @@ -8,84 +8,85 @@ datasource db { } model user { - id Int @id @default(autoincrement()) - createdAt DateTime? @default(now()) @db.Timestamptz(6) - ghLogin String @unique + id Int @id @default(autoincrement()) + createdAt DateTime? @default(now()) @db.Timestamptz(6) + ghLogin String @unique - name String - defaultTeam String - bio String? + name String + defaultTeam String + bio String? - teams teamMember[] - result result[] + teams teamMember[] + result result[] } model team { - id Int @id @default(autoincrement()) - createdAt DateTime? @default(now()) @db.Timestamptz(6) - name String @unique - avatarUrl String? + id Int @id @default(autoincrement()) + createdAt DateTime? @default(now()) @db.Timestamptz(6) + name String @unique + avatarUrl String? - members teamMember[] - projects project[] + members teamMember[] + projects project[] } model teamMember { - createdAt DateTime? @default(now()) @db.Timestamptz(6) - member user @relation(fields: [userId], references: [id]) - team team @relation(fields: [teamId], references: [id]) - userId Int - teamId Int + createdAt DateTime? @default(now()) @db.Timestamptz(6) + member user @relation(fields: [userId], references: [id]) + team team @relation(fields: [teamId], references: [id]) + userId Int + teamId Int @@id([userId, teamId]) } model project { - id Int @id @default(autoincrement()) - createdAt DateTime? @default(now()) @db.Timestamptz(6) - name String - description String? + id Int @id @default(autoincrement()) + createdAt DateTime? @default(now()) @db.Timestamptz(6) + name String + description String? - projectOwner team @relation(fields: [projectOwnerName], references: [name]) - projectOwnerName String + projectOwner team @relation(fields: [projectOwnerName], references: [name]) + projectOwnerName String + repos repo[] - repos repo[] @@unique(fields: [name, projectOwnerName], name: "name_projectOwnerName") } model repo { - id Int @id @default(autoincrement()) - createdAt DateTime? @default(now()) @db.Timestamptz(6) - owner String - repo String - description String? - parentProject Int - project project? @relation(fields: [parentProject], references: [id], onDelete: NoAction, onUpdate: NoAction) - tests test[] + id Int @id @default(autoincrement()) + createdAt DateTime? @default(now()) @db.Timestamptz(6) + owner String + repo String + description String? + parentProjectId Int + + tests test[] + project project? @relation(fields: [parentProjectId], references: [id], onDelete: NoAction, onUpdate: NoAction) - @@unique(fields: [repo, parentProject], name: "repo_project") + @@unique(fields: [repo, parentProjectId], name: "repo_project") } model test { - id Int @id @default(autoincrement()) - path String - name String - repo repo @relation(fields: [repoId], references: [id]) - repoId Int - results result[] + id Int @id @default(autoincrement()) + path String + name String + repo repo @relation(fields: [repoId], references: [id]) + repoId Int + results result[] @@unique(fields: [path, repoId], name: "test_repo") } model result { - id Int @id @default(autoincrement()) - timestamp DateTime @default(now()) @db.Timestamptz(6) - test test @relation(fields: [testId], references: [id]) - testId Int - data String? - user user @relation(fields: [ghLogin], references: [ghLogin]) - ghLogin String + id Int @id @default(autoincrement()) + timestamp DateTime @default(now()) @db.Timestamptz(6) + test test @relation(fields: [testId], references: [id]) + testId Int + data String? + user user @relation(fields: [ghLogin], references: [ghLogin]) + ghLogin String @@unique(fields: [id, testId], name: "result_test") } diff --git a/src/pages/api/projects/index.ts b/src/pages/api/projects/index.ts index b8c7286..2c3125a 100644 --- a/src/pages/api/projects/index.ts +++ b/src/pages/api/projects/index.ts @@ -1,21 +1,22 @@ -import getPrismaClient from '@prismaClient' -import { NextApiRequest } from 'next' +import { useDB } from '@prismaClient' +import type { NextApiRequest, NextApiResponse } from 'next' /** - * !todo: clean up cause it's a mess - * !todo: add middleware to parse json body cause it's cringe that that is not done for us + * Ko6a projects API */ -export default async function handler(req: NextApiRequest, res) { - const prisma = getPrismaClient() - - if (req.method === 'GET') { - const projects = await prisma.project.findMany({ include: { repos: true } }) - if (projects) { - res.json(projects) - } else { - return res.status(404).json({ error: 'No projects found' }) +export default async function projectsApi(req: NextApiRequest, res: NextApiResponse) { + const { project } = useDB() + + switch (req.method) { + case 'GET': { + const projects = await project.findMany({ include: { repos: true } }) + if (projects) { + return res.json(projects) + } else { + return res.status(404).json({ error: 'Project not found' }) + } } - } else { - return res.status(405).json({ error: 'Method not allowed' }) + default: + return res.status(405).end() } } diff --git a/src/pages/api/repos/[repoName].ts b/src/pages/api/repos/[repoName].ts new file mode 100644 index 0000000..0c0cf2b --- /dev/null +++ b/src/pages/api/repos/[repoName].ts @@ -0,0 +1,29 @@ +import { useDB } from '@prismaClient' +import type { NextApiRequest, NextApiResponse } from 'next' + +export default async function repoAPI(req: NextApiRequest, res: NextApiResponse) { + const { repoName, team, project }: any = req.query + const { repo } = useDB() + + switch (req.method) { + case 'GET': { + const repoData = await repo.findFirst({ + where: { + repo: repoName, + project: { + name: project, + projectOwner: { + name: team + } + } + } + }) + + repoData + ? res.status(200).json(repoData) + : res.status(404).json({ message: 'Repo not found' }) + } + default: + return res.status(405) + } +} \ No newline at end of file diff --git a/src/pages/api/repos/index.ts b/src/pages/api/repos/index.ts new file mode 100644 index 0000000..406510e --- /dev/null +++ b/src/pages/api/repos/index.ts @@ -0,0 +1,9 @@ +import { useDB } from '@prismaClient' +import type { NextApiRequest, NextApiResponse } from 'next' + +export default function reposAPI(req: NextApiRequest, res: NextApiResponse) { + + // currently need to be able to get a list of repos for a given project + // and a single repo + +} \ No newline at end of file diff --git a/src/pages/api/results/[id].ts b/src/pages/api/results/[id].ts index 6041c77..394d237 100644 --- a/src/pages/api/results/[id].ts +++ b/src/pages/api/results/[id].ts @@ -1,6 +1,9 @@ import { NextApiRequest } from 'next' import { usePrisma } from '@prismaClient' +/** + * Ko6a test results API + */ export default async function handler(req: NextApiRequest, res) { const { method } = req const { result } = usePrisma() diff --git a/src/pages/api/teams/[team]/projects/[project]/index.ts b/src/pages/api/teams/[team]/projects/[project]/index.ts index 16a00c5..ee25827 100644 --- a/src/pages/api/teams/[team]/projects/[project]/index.ts +++ b/src/pages/api/teams/[team]/projects/[project]/index.ts @@ -1,6 +1,7 @@ import getPrismaClient from '@prismaClient' import { NextApiRequest, NextApiResponse } from 'next' +// project API for a given team export default async function handler(req: NextApiRequest, res: NextApiResponse) { const { team, project }: any = req.query const prisma = getPrismaClient() @@ -28,7 +29,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // if project is found, delete all child repos if (projectToDelete) { - await prisma.repo.deleteMany({ where: { parentProject: projectToDelete.id } }) + await prisma.repo.deleteMany({ where: { parentProjectId: projectToDelete.id } }) } const deletedProject = await prisma.project.delete({ where: { id: projectToDelete.id } }) if (deletedProject) { diff --git a/src/pages/api/teams/[team]/projects/[project]/repos/[repo]/index.ts b/src/pages/api/teams/[team]/projects/[project]/repos/[repo]/index.ts deleted file mode 100644 index f46be9b..0000000 --- a/src/pages/api/teams/[team]/projects/[project]/repos/[repo]/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import getPrismaClient from '@prismaClient' -import { NextApiRequest, NextApiResponse } from 'next' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - const { team, project, repo }: any = req.query - const prisma = getPrismaClient() - - const projectData = await prisma.project.findUnique({ where: { name_projectOwnerName: { name: project, projectOwnerName: team } } }) - if (!projectData) { - return res.status(404).json({ error: 'Project not found' }) - } - - if (req.method === 'GET') { - const _repo = await prisma.repo.findUnique({ - where: { repo_project: { repo, parentProject: projectData.id } } - }) - if (_repo) { - res.json(_repo) - } else { - return res.status(404).json({ error: 'Repo not found' }) - } - } -} diff --git a/src/pages/api/teams/[team]/projects/[project]/repos/index.ts b/src/pages/api/teams/[team]/projects/[project]/repos/index.ts index c026747..21ced09 100644 --- a/src/pages/api/teams/[team]/projects/[project]/repos/index.ts +++ b/src/pages/api/teams/[team]/projects/[project]/repos/index.ts @@ -8,7 +8,7 @@ export interface Repo { parentProject: string } -// endpoint handler that returns a list of repos for a project +// this returns a list of repos for a project under a given team export default async function repos(req: NextApiRequest, res: NextApiResponse) { const { project, team }: any = req.query const prisma = getPrismaClient() @@ -28,7 +28,7 @@ export default async function repos(req: NextApiRequest, res: NextApiResponse) { owner, repo, description, - parentProject: projectData.id + parentProjectId: projectData.id }}) res.status(201).json({ message: 'Repo created!', repo: newRepo }) } diff --git a/src/pages/api/tests/index.ts b/src/pages/api/tests/index.ts index 46b431d..4d3f437 100644 --- a/src/pages/api/tests/index.ts +++ b/src/pages/api/tests/index.ts @@ -1,6 +1,9 @@ import { NextApiRequest } from 'next' import { usePrisma } from '@prismaClient' +/** + * Ko6a tests API + */ export default async function handler(req: NextApiRequest, res) { const { method } = req const { test, result } = usePrisma() diff --git a/src/pages/projects/[project].js b/src/pages/projects/[project].js index 3f0f29d..7cd42b4 100644 --- a/src/pages/projects/[project].js +++ b/src/pages/projects/[project].js @@ -16,6 +16,9 @@ export default function Project({ ...props }) { const { data: project, error } = useSWR(projectName && `/api/teams/${currentTeam}/projects/${projectName}`) const { isOpen: newRepoModalIsOpen, onOpen: onNewRepoModalOpen, onClose: onNewRepoModalClose } = useDisclosure() + const { data, _error } = useSWR('/api/repos/ko6a?projectName=beanteam-proj') + // console.log("🚀 ~ file: [project].js ~ line 20 ~ Project ~ data", data) + if (error) return 'scawy :(' if (!project) return null diff --git a/src/pages/projects/[project]/[repo].js b/src/pages/projects/[project]/[repo].js index 7db2155..c3f6706 100644 --- a/src/pages/projects/[project]/[repo].js +++ b/src/pages/projects/[project]/[repo].js @@ -1,15 +1,19 @@ import { useContext } from 'react' +import useSWR from 'swr' import { useRouter } from 'next/router' import { Explorer } from '@components/projects/explorer' -import useSWR from 'swr' import { TeamContext } from '@components/contexts/team-context' -export default function RepoPage({ ...props }) { +export default function RepoPage() { const router = useRouter() const { project, repo } = router?.query const { currentTeam } = useContext(TeamContext) - const { data: repoData, error } = useSWR(project && currentTeam && `/api/teams/${currentTeam}/projects/${project}/repos/${repo}`) + const canFetch = project && currentTeam && repo + const repoQueryUrl = `/api/repos/${repo}?team=${currentTeam}&project=${project}` + const { data: repoData, error } = useSWR(canFetch && repoQueryUrl) + + console.log("🚀 ~ file: [repo].js ~ line 15 ~ RepoPage ~ repoData", repoData) if (error) { console.log(error) diff --git a/src/pages/projects/[project]/[repo]/[...file].js b/src/pages/projects/[project]/[repo]/[...file].js index 10a902d..72f2987 100644 --- a/src/pages/projects/[project]/[repo]/[...file].js +++ b/src/pages/projects/[project]/[repo]/[...file].js @@ -10,7 +10,8 @@ export default function FilePage({ ...props }) { const { currentTeam } = useContext(TeamContext) const canFetch = project && currentTeam && repo - const { data: repoData, error } = useSWR(canFetch && `/api/teams/${currentTeam}/projects/${project}/repos/${repo}`) + const repoQueryUrl = `/api/repos/${repo}?team=${currentTeam}&project=${project}` + const { data: repoData, error } = useSWR(canFetch && repoQueryUrl) if (error) { console.log(error)