Skip to content
Open
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
2 changes: 1 addition & 1 deletion src/backend/src/transformers/rules.transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const ruleTransformer = (rule: Prisma.RuleGetPayload<RulePreviewQueryArgs
export const projectRuleTransformer = (projectRule: any): ProjectRule => {
return {
projectRuleId: projectRule.projectRuleId,
rule: projectRule.rule,
rule: ruleTransformer(projectRule.rule),
projectId: projectRule.projectId,
currentStatus: projectRule.currentStatus,
statusHistory: projectRule.statusHistory
Expand Down
116 changes: 96 additions & 20 deletions src/frontend/src/apis/rules.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,14 @@
*/

import axios from '../utils/axios';
import { Rule, RulesetType, Ruleset } from 'shared';
import { ProjectRule, Rule, RuleCompletion, Ruleset, RulesetType } from 'shared';
import { apiUrls } from '../utils/urls';

/**
* Gets all top-level rules (rules with no parent) for a ruleset
*/
export const getTopLevelRules = (rulesetId: string) => {
return axios.get<Rule[]>(apiUrls.rulesTopLevel(rulesetId));
};

/**
* Gets all child rules of a specific rule
*/
export const getChildRules = (ruleId: string) => {
return axios.get<Rule[]>(apiUrls.rulesChildRules(ruleId));
};
import {
projectRuleTransformer,
rulesetTransformer,
rulesetTypeTransformer,
ruleTransformer
} from './transformers/rules.transformers';

/**
* Toggles team assignment for a rule
Expand All @@ -38,21 +30,105 @@ export const getTeamRulesInRulesetType = (rulesetTypeId: string, teamId: string)
/**
* Creates a new ruleset type
*
* @param payload the data for creating the ruleset type
* @param payload the data for creating the ruleset type.
* @returns the created ruleset type
*/
export const createRulesetType = (payload: { name: string }) => {
return axios.post<RulesetType>(apiUrls.rulesetTypeCreate(), payload);
};

/**
* Fetches all Ruleset Types for the current organization.
*
* @returns A list of Ruleset Types.
* Fetches all ruleset types for the organization.
*/
export const getAllRulesetTypes = () => {
return axios.get<RulesetType[]>(apiUrls.rulesetTypes(), {
transformResponse: (data) => JSON.parse(data)
transformResponse: (data) => JSON.parse(data).map(rulesetTypeTransformer)
});
};

/**
* Gets the active ruleset for a given ruleset type.
*
* @param rulesetTypeId The ID of the ruleset type.
*/
export const getActiveRuleset = (rulesetTypeId: string) => {
return axios.get<Ruleset>(apiUrls.rulesGetActiveRuleset(rulesetTypeId), {
transformResponse: (data) => rulesetTransformer(JSON.parse(data))
});
};

/**
* Gets all project rules for a given ruleset and project.
*
* @param rulesetId The ID of the ruleset.
* @param projectId The ID of the project.
*/
export const getProjectRules = (rulesetId: string, projectId: string) => {
return axios.get<ProjectRule[]>(apiUrls.rulesGetProjectRules(rulesetId, projectId), {
transformResponse: (data) => JSON.parse(data).map(projectRuleTransformer)
});
};

/**
* Gets unassigned rules for a ruleset and team.
*
* @param rulesetId The ID of the ruleset.
* @param teamId The ID of the team.
*/
export const getUnassignedRulesForRuleset = (rulesetId: string, teamId: string) => {
return axios.get<Rule[]>(apiUrls.rulesGetUnassignedRulesForRuleset(rulesetId, teamId), {
transformResponse: (data) => JSON.parse(data).map(ruleTransformer)
});
};

/**
* Creates a project rule (assigns a rule to a project).
*
* @param ruleId The ID of the rule to assign.
* @param projectId The ID of the project.
*/
export const createProjectRule = (ruleId: string, projectId: string) => {
return axios.post<ProjectRule>(apiUrls.rulesCreateProjectRule(), { ruleId, projectId });
};

/**
* Deletes a project rule.
*
* @param projectRuleId The ID of the project rule to delete.
*/
export const deleteProjectRule = (projectRuleId: string) => {
return axios.post<ProjectRule>(apiUrls.rulesDeleteProjectRule(projectRuleId));
};

/**
* Updates the status of a project rule.
*
* @param projectRuleId The ID of the project rule.
* @param newStatus The new status to set.
*/
export const editProjectRuleStatus = (projectRuleId: string, newStatus: RuleCompletion) => {
return axios.post<ProjectRule>(apiUrls.rulesEditProjectRuleStatus(projectRuleId), { newStatus });
};

/**
* Gets all child rules of a given rule.
*
* @param ruleId The ID of the parent rule.
*/
export const getChildRules = (ruleId: string) => {
return axios.get<Rule[]>(apiUrls.rulesChildRules(ruleId), {
transformResponse: (data) => JSON.parse(data).map(ruleTransformer)
});
};

/**
* Gets all top-level rules (rules with no parent) for a ruleset.
*
* @param rulesetId The ID of the ruleset.
*/
export const getTopLevelRules = (rulesetId: string) => {
return axios.get<Rule[]>(apiUrls.rulesTopLevel(rulesetId), {
transformResponse: (data) => JSON.parse(data).map(ruleTransformer)
});
};

Expand Down
66 changes: 65 additions & 1 deletion src/frontend/src/apis/transformers/rules.transformers.ts
Original file line number Diff line number Diff line change
@@ -1 +1,65 @@
// write transformer functions below here!
/*
* This file is part of NER's FinishLine and licensed under GNU AGPLv3.
* See the LICENSE file in the repository root folder for details.
*/

import { ProjectRule, Rule, RulesetType, Ruleset } from 'shared';

/**
* Transforms a rule to proper field types.
*
* @param rule Incoming rule object
* @returns Properly transformed rule object.
*/
export const ruleTransformer = (rule: Rule): Rule => {
return {
...rule,
subRuleIds: rule.subRuleIds || [],
referencedRuleIds: rule.referencedRuleIds || []
};
};

/**
* Transforms a project rule (support Date objects)
*
* @param projectRule Incoming project rule object
* @returns Properly transformed project rule object.
*/
export const projectRuleTransformer = (projectRule: ProjectRule): ProjectRule => {
return {
...projectRule,
rule: ruleTransformer(projectRule.rule),
statusHistory: (projectRule.statusHistory || []).map((history) => ({
...history,
dateCreated: new Date(history.dateCreated)
}))
};
};

/**
* Transforms a ruleset type (support Date objects)
*
* @param rulesetType Incoming ruleset type object
* @returns Properly transformed ruleset type object.
*/
export const rulesetTypeTransformer = (rulesetType: RulesetType): RulesetType => {
return {
...rulesetType,
lastUpdated: new Date(rulesetType.lastUpdated),
revisionFiles: rulesetType.revisionFiles || []
};
};

/**
* Transforms a ruleset (support Date objects)
*
* @param ruleset Incoming ruleset object
* @returns Properly transformed ruleset object.
*/
export const rulesetTransformer = (ruleset: Ruleset): Ruleset => {
return {
...ruleset,
dateCreated: new Date(ruleset.dateCreated),
rulesetType: rulesetTypeTransformer(ruleset.rulesetType)
};
};
Loading