Skip to content

Commit

Permalink
Merge pull request #2544 from Infisical/daniel/project-env-position-f…
Browse files Browse the repository at this point in the history
…ixes

fix: project environment positions
  • Loading branch information
DanielHougaard authored Oct 7, 2024
2 parents 4c1253d + f94e100 commit 56798f0
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 5 deletions.
2 changes: 1 addition & 1 deletion backend/e2e-test/routes/v1/project-env.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ describe("Project Environment Router", async () => {
id: deletedProjectEnvironment.id,
name: mockProjectEnv.name,
slug: mockProjectEnv.slug,
position: 4,
position: 5,
createdAt: expect.any(String),
updatedAt: expect.any(String)
})
Expand Down
3 changes: 2 additions & 1 deletion backend/src/lib/api-docs/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,8 @@ export const ENVIRONMENTS = {
CREATE: {
workspaceId: "The ID of the project to create the environment in.",
name: "The name of the environment to create.",
slug: "The slug of the environment to create."
slug: "The slug of the environment to create.",
position: "The position of the environment. The lowest number will be displayed as the first environment."
},
UPDATE: {
workspaceId: "The ID of the project to update the environment in.",
Expand Down
1 change: 1 addition & 0 deletions backend/src/server/routes/v1/project-env-router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ export const registerProjectEnvRouter = async (server: FastifyZodProvider) => {
}),
body: z.object({
name: z.string().trim().describe(ENVIRONMENTS.CREATE.name),
position: z.number().min(1).optional().describe(ENVIRONMENTS.CREATE.position),
slug: z
.string()
.trim()
Expand Down
8 changes: 7 additions & 1 deletion backend/src/services/project-env/project-env-dal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,16 @@ export const projectEnvDALFactory = (db: TDbClient) => {
}
};

const shiftPositions = async (projectId: string, pos: number, tx?: Knex) => {
// Shift all positions >= the new position up by 1
await (tx || db)(TableName.Environment).where({ projectId }).where("position", ">=", pos).increment("position", 1);
};

return {
...projectEnvOrm,
findBySlugs,
findLastEnvPosition,
updateAllPosition
updateAllPosition,
shiftPositions
};
};
24 changes: 22 additions & 2 deletions backend/src/services/project-env/project-env-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export const projectEnvServiceFactory = ({
actor,
actorOrgId,
actorAuthMethod,
position,
name,
slug
}: TCreateEnvDTO) => {
Expand Down Expand Up @@ -83,9 +84,25 @@ export const projectEnvServiceFactory = ({
}

const env = await projectEnvDAL.transaction(async (tx) => {
if (position !== undefined) {
// Check if there's an environment at the specified position
const existingEnvWithPosition = await projectEnvDAL.findOne({ projectId, position }, tx);

// If there is, then shift positions
if (existingEnvWithPosition) {
await projectEnvDAL.shiftPositions(projectId, position, tx);
}

const doc = await projectEnvDAL.create({ slug, name, projectId, position }, tx);
await folderDAL.create({ name: "root", parentId: null, envId: doc.id, version: 1 }, tx);

return doc;
}
// If no position is specified, add to the end
const lastPos = await projectEnvDAL.findLastEnvPosition(projectId, tx);
const doc = await projectEnvDAL.create({ slug, name, projectId, position: lastPos + 1 }, tx);
await folderDAL.create({ name: "root", parentId: null, envId: doc.id, version: 1 }, tx);

return doc;
});

Expand Down Expand Up @@ -150,7 +167,11 @@ export const projectEnvServiceFactory = ({

const env = await projectEnvDAL.transaction(async (tx) => {
if (position) {
await projectEnvDAL.updateAllPosition(projectId, oldEnv.position, position, tx);
const existingEnvWithPosition = await projectEnvDAL.findOne({ projectId, position }, tx);

if (existingEnvWithPosition && existingEnvWithPosition.id !== oldEnv.id) {
await projectEnvDAL.updateAllPosition(projectId, oldEnv.position, position, tx);
}
}
return projectEnvDAL.updateById(oldEnv.id, { name, slug, position }, tx);
});
Expand Down Expand Up @@ -199,7 +220,6 @@ export const projectEnvServiceFactory = ({
name: "DeleteEnvironment"
});

await projectEnvDAL.updateAllPosition(projectId, doc.position, -1, tx);
return doc;
});

Expand Down
1 change: 1 addition & 0 deletions backend/src/services/project-env/project-env-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { TProjectPermission } from "@app/lib/types";
export type TCreateEnvDTO = {
name: string;
slug: string;
position?: number;
} & TProjectPermission;

export type TUpdateEnvDTO = {
Expand Down

0 comments on commit 56798f0

Please sign in to comment.