Skip to content

Commit

Permalink
feat(api): Add pagination metadata to Environment module (#382)
Browse files Browse the repository at this point in the history
Co-authored-by: Rajdip Bhattacharya <agentR47@gmail.com>
  • Loading branch information
muntaxir4 and rajdip-b authored Jul 29, 2024
1 parent 13ebc0d commit 9eb5c5c
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export class EnvironmentController {
async getEnvironmentsOfProject(
@CurrentUser() user: User,
@Param('projectId') projectId: string,
@Query('page') page: number = 1,
@Query('page') page: number = 0,
@Query('limit') limit: number = 10,
@Query('sort') sort: string = 'name',
@Query('order') order: string = 'asc',
Expand Down
19 changes: 18 additions & 1 deletion apps/api/src/environment/environment.e2e.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import { EventService } from '../event/service/event.service'
import { EnvironmentService } from './service/environment.service'
import { UserModule } from '../user/user.module'
import { UserService } from '../user/service/user.service'
import { QueryTransformPipe } from '../common/query.transform.pipe'

describe('Environment Controller Tests', () => {
let app: NestFastifyApplication
Expand Down Expand Up @@ -64,6 +65,8 @@ describe('Environment Controller Tests', () => {
environmentService = moduleRef.get(EnvironmentService)
userService = moduleRef.get(UserService)

app.useGlobalPipes(new QueryTransformPipe())

await app.init()
await app.getHttpAdapter().getInstance().ready()
})
Expand Down Expand Up @@ -399,13 +402,27 @@ describe('Environment Controller Tests', () => {
it('should be able to fetch all environments of a project', async () => {
const response = await app.inject({
method: 'GET',
url: `/environment/all/${project1.id}`,
url: `/environment/all/${project1.id}?page=0&limit=10`,
headers: {
'x-e2e-user-email': user1.email
}
})

expect(response.statusCode).toBe(200)
//check metadata
const metadata = response.json().metadata
expect(metadata.totalCount).toEqual(2)
expect(metadata.links.self).toBe(
`/environment/all/${project1.id}?page=0&limit=10&sort=name&order=asc&search=`
)
expect(metadata.links.first).toBe(
`/environment/all/${project1.id}?page=0&limit=10&sort=name&order=asc&search=`
)
expect(metadata.links.previous).toBeNull()
expect(metadata.links.next).toBeNull()
expect(metadata.links.last).toBe(
`/environment/all/${project1.id}?page=0&limit=10&sort=name&order=asc&search=`
)
})

it('should not be able to fetch all environments of a project that does not exist', async () => {
Expand Down
23 changes: 21 additions & 2 deletions apps/api/src/environment/service/environment.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { UpdateEnvironment } from '../dto/update.environment/update.environment'
import { PrismaService } from '../../prisma/prisma.service'
import createEvent from '../../common/create-event'
import { AuthorityCheckerService } from '../../common/authority-checker.service'
import { paginate } from '../../common/paginate'

@Injectable()
export class EnvironmentService {
Expand Down Expand Up @@ -171,8 +172,8 @@ export class EnvironmentService {
prisma: this.prisma
})

// Get the environments
return await this.prisma.environment.findMany({
// Get the environments for the required page
const items = await this.prisma.environment.findMany({
where: {
projectId,
name: {
Expand Down Expand Up @@ -200,6 +201,24 @@ export class EnvironmentService {
[sort]: order
}
})
// Calculate metadata for pagination
const totalCount = await this.prisma.environment.count({
where: {
projectId,
name: {
contains: search
}
}
})
const metadata = paginate(totalCount, `/environment/all/${projectId}`, {
page,
limit,
sort,
order,
search
})

return { items, metadata }
}

async deleteEnvironment(user: User, environmentId: Environment['id']) {
Expand Down
17 changes: 17 additions & 0 deletions apps/cli/src/types/index.types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,21 @@ export interface ProfileConfig {
}
}

export interface Page<T> {
items: T[]
metadata: {
page: number
perPage: number
pageCount: number
totalCount: number
links: {
self: string
first: string
previous: string | null
next: string | null
last: string
}
}
}

export type PrivateKeyConfig = Record<string, string>
9 changes: 5 additions & 4 deletions packages/api-client/src/types/environment.types.d.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { Page } from '../../../../apps/cli/src/types/index.types'

export interface CreateEnvironmentRequest {
name: string
description?: string
Expand Down Expand Up @@ -53,8 +55,8 @@ export interface GetAllEnvironmentsOfProjectRequest {
search?: string
}

export interface GetAllEnvironmentsOfProjectResponse {
items: {
export interface GetAllEnvironmentsOfProjectResponse
extends Page<{
id: string
name: string
description: string | null
Expand All @@ -66,8 +68,7 @@ export interface GetAllEnvironmentsOfProjectResponse {
email: string
profilePictureUrl: string | null
}
}[]
}
}> {}

export interface DeleteEnvironmentRequest {
id: string
Expand Down
37 changes: 33 additions & 4 deletions packages/api-client/tests/environment.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,32 @@ describe('Get Environments Tests', () => {
const environments =
await EnvironmentController.getAllEnvironmentsOfProject(
{
projectId

projectId,
page: 0,
limit: 10

},
{
'x-e2e-user-email': email
}
)
expect(environments.items).toHaveLength(2)
expect(environments.items[0].name).toBe('Default')

expect(environments).toHaveLength(2)
expect(environments[0].name).toBe('Default')
//check metadata
expect(environments.metadata.totalCount).toEqual(2)
expect(environments.metadata.links.self).toBe(
`/environment/all/${projectId}?page=0&limit=10&sort=name&order=asc&search=`
)
expect(environments.metadata.links.first).toBe(
`/environment/all/${projectId}?page=0&limit=10&sort=name&order=asc&search=`
)
expect(environments.metadata.links.previous).toBeNull()
expect(environments.metadata.links.next).toBeNull()
expect(environments.metadata.links.last).toBe(
`/environment/all/${projectId}?page=0&limit=10&sort=name&order=asc&search=`
)
})

it('should be able to fetch environment by ID', async () => {
Expand Down Expand Up @@ -179,6 +196,18 @@ describe('Get Environments Tests', () => {
}
)

expect(environments).toHaveLength(2)
expect(environments.items).toHaveLength(2)
expect(environments.metadata.totalCount).toEqual(2)
expect(environments.metadata.links.self).toBe(
`/environment/all/${projectId}?page=0&limit=10&sort=name&order=asc&search=`
)
expect(environments.metadata.links.first).toBe(
`/environment/all/${projectId}?page=0&limit=10&sort=name&order=asc&search=`
)
expect(environments.metadata.links.previous).toBeNull()
expect(environments.metadata.links.next).toBeNull()
expect(environments.metadata.links.last).toBe(
`/environment/all/${projectId}?page=0&limit=10&sort=name&order=asc&search=`
)
})
})

0 comments on commit 9eb5c5c

Please sign in to comment.