Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions apps/web/src/app/(private)/projects/[projectId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
'use server'

import {
findCommitsByProjectCached,
findProjectCached,
getDocumentsAtCommitCached,
} from '$/app/(private)/_data-access'
import { lastSeenCommitCookieName } from '$/helpers/cookies/lastSeenCommit'
import {
SessionData,
getCurrentUserOrRedirect,
} from '$/services/auth/getCurrentUser'
import { ROUTES } from '$/services/routes'
import { computeProductAccess } from '@latitude-data/core/services/productAccess/computeProductAccess'
import { NotFoundError } from '@latitude-data/core/lib/errors'
import { Project } from '@latitude-data/core/schema/models/types/Project'
import { cookies } from 'next/headers'
Expand Down Expand Up @@ -46,6 +46,8 @@ export default async function ProjectPage({ params }: ProjectPageParams) {

try {
session = await getCurrentUserOrRedirect()
const productAccess = computeProductAccess(session.workspace)

project = await findProjectCached({
projectId: Number(projectId),
workspaceId: session.workspace.id,
Expand All @@ -54,12 +56,19 @@ export default async function ProjectPage({ params }: ProjectPageParams) {
projectId: project.id,
})

const headCommit = commits.find((c) => c.mergedAt) ?? commits[0]
const documents = headCommit
? await getDocumentsAtCommitCached({ commit: headCommit })
: []

url = getRedirectUrl({
commits,
projectId: project.id,
lastSeenCommitUuid,
lastSeenDocumentUuid,
PROJECT_ROUTE,
agentBuilder: productAccess.agentBuilder,
documents,
})
} catch (error) {
if (error instanceof NotFoundError) {
Expand Down
289 changes: 197 additions & 92 deletions apps/web/src/app/(private)/projects/[projectId]/utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,126 +1,231 @@
import { describe, expect, it } from 'vitest'
import { HEAD_COMMIT } from '@latitude-data/core/constants'
import { Commit } from '@latitude-data/core/schema/models/types/Commit'
import { DocumentVersion } from '@latitude-data/core/schema/models/types/DocumentVersion'

import { ROUTES } from '../../../../services/routes'
import { getRedirectUrl } from './utils'

const PROJECT_ROUTE = ROUTES.projects.detail

describe('getRedirectUrl', () => {
const mockCommits = [
{ uuid: '1', mergedAt: new Date() },
{ uuid: '2', mergedAt: null },
{ uuid: '3', mergedAt: null },
] as Commit[]

it('returns latest commit home URL when lastSeenCommitUuid is HEAD_COMMIT', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: HEAD_COMMIT,
PROJECT_ROUTE,
const mockDocuments = [
{ documentUuid: 'doc-1' },
{ documentUuid: 'doc-2' },
] as DocumentVersion[]

describe('when agentBuilder is enabled', () => {
it('returns latest commit home URL when lastSeenCommitUuid is HEAD_COMMIT', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: HEAD_COMMIT,
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe('/projects/1/versions/live/home')
})
expect(result).toBe('/projects/1/versions/live/home')
})

it('returns latest commit home URL when lastSeenCommitUuid is not found and there is a head commit', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: 'non-existent',
PROJECT_ROUTE,
it('returns latest commit home URL when lastSeenCommitUuid is not found and there is a head commit', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: 'non-existent',
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe('/projects/1/versions/live/home')
})
expect(result).toBe('/projects/1/versions/live/home')
})

it('returns specific commit home URL when lastSeenCommitUuid is found and not merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '2',
PROJECT_ROUTE,
it('returns specific commit home URL when lastSeenCommitUuid is found and not merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '2',
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe('/projects/1/versions/2/home')
})
expect(result).toBe('/projects/1/versions/2/home')
})

it('returns latest commit home URL when lastSeenCommitUuid is found but merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '1',
PROJECT_ROUTE,
it('returns latest commit home URL when lastSeenCommitUuid is found but merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '1',
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe('/projects/1/versions/live/home')
})
expect(result).toBe('/projects/1/versions/live/home')
})

it('returns latest commit home URL when there is a head commit and no lastSeenCommitUuid', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: undefined,
PROJECT_ROUTE,
it('returns latest commit home URL when there is a head commit and no lastSeenCommitUuid', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: undefined,
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe('/projects/1/versions/live/home')
})
expect(result).toBe('/projects/1/versions/live/home')
})

it('returns first commit home URL when there is no head commit and no lastSeenCommitUuid', () => {
const noHeadCommits = [{ uuid: '1', mergedAt: null }] as Commit[]
const result = getRedirectUrl({
commits: noHeadCommits,
projectId: 1,
lastSeenCommitUuid: undefined,
PROJECT_ROUTE,
it('returns first commit home URL when there is no head commit and no lastSeenCommitUuid', () => {
const noHeadCommits = [{ uuid: '1', mergedAt: null }] as Commit[]
const result = getRedirectUrl({
commits: noHeadCommits,
projectId: 1,
lastSeenCommitUuid: undefined,
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe('/projects/1/versions/1/home')
})
expect(result).toBe('/projects/1/versions/1/home')
})

it('returns document detail URL when lastSeenDocumentUuid is provided', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '2',
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
it('returns document detail URL when lastSeenDocumentUuid is provided', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '2',
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe('/projects/1/versions/2/documents/fake-document-uuid')
})
expect(result).toBe('/projects/1/versions/2/documents/fake-document-uuid')
})

it('returns default commit document detail URL when lastSeenDocumentUuid is provided but lastSeenCommitUuid is HEAD_COMMIT', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: HEAD_COMMIT,
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
})
expect(result).toBe(
'/projects/1/versions/live/documents/fake-document-uuid',
)
})
it('returns default commit document detail URL when lastSeenDocumentUuid is provided but lastSeenCommitUuid is HEAD_COMMIT', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: HEAD_COMMIT,
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe(
'/projects/1/versions/live/documents/fake-document-uuid',
)
})

it('returns default commit document detail URL when lastSeenDocumentUuid is provided but lastSeenCommitUuid is merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '1',
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe(
'/projects/1/versions/live/documents/fake-document-uuid',
)
})

it('returns default commit document detail URL when lastSeenDocumentUuid is provided but lastSeenCommitUuid is merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '1',
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
})
expect(result).toBe(
'/projects/1/versions/live/documents/fake-document-uuid',
)
it('returns default commit document detail URL when lastSeenDocumentUuid is provided but lastSeenCommitUuid is not found', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: 'non-existent',
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
agentBuilder: true,
documents: [],
})
expect(result).toBe(
'/projects/1/versions/live/documents/fake-document-uuid',
)
})
})

it('returns default commit document detail URL when lastSeenDocumentUuid is provided but lastSeenCommitUuid is not found', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: 'non-existent',
lastSeenDocumentUuid: 'fake-document-uuid',
PROJECT_ROUTE,
})
expect(result).toBe(
'/projects/1/versions/live/documents/fake-document-uuid',
)
describe('when agentBuilder is disabled', () => {
it('returns first document URL when documents exist', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: HEAD_COMMIT,
PROJECT_ROUTE,
agentBuilder: false,
documents: mockDocuments,
})
expect(result).toBe('/projects/1/versions/live/documents/doc-1')
})

it('returns issues URL when no documents exist', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: HEAD_COMMIT,
PROJECT_ROUTE,
agentBuilder: false,
documents: [],
})
expect(result).toBe('/projects/1/versions/live/issues')
})

it('ignores lastSeenDocumentUuid and returns first document URL', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '2',
lastSeenDocumentUuid: 'some-other-document',
PROJECT_ROUTE,
agentBuilder: false,
documents: mockDocuments,
})
expect(result).toBe('/projects/1/versions/2/documents/doc-1')
})

it('uses correct commit when lastSeenCommitUuid is not merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '2',
PROJECT_ROUTE,
agentBuilder: false,
documents: mockDocuments,
})
expect(result).toBe('/projects/1/versions/2/documents/doc-1')
})

it('uses head commit when lastSeenCommitUuid is merged', () => {
const result = getRedirectUrl({
commits: mockCommits,
projectId: 1,
lastSeenCommitUuid: '1',
PROJECT_ROUTE,
agentBuilder: false,
documents: mockDocuments,
})
expect(result).toBe('/projects/1/versions/live/documents/doc-1')
})

it('returns issues URL on first commit when no head commit and no documents', () => {
const noHeadCommits = [{ uuid: '1', mergedAt: null }] as Commit[]
const result = getRedirectUrl({
commits: noHeadCommits,
projectId: 1,
lastSeenCommitUuid: undefined,
PROJECT_ROUTE,
agentBuilder: false,
documents: [],
})
expect(result).toBe('/projects/1/versions/1/issues')
})
})
})
Loading
Loading