Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement the Partnership section to the Project View page #155

Merged
merged 2 commits into from
Mar 23, 2021
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
78 changes: 77 additions & 1 deletion api/src/models/project.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import {
GetFundingData,
PostSpeciesData,
GetSpeciesData,
PostPartnershipsData
PostPartnershipsData,
GetPartnershipsData
} from './project';

describe('PostProjectData', () => {
Expand Down Expand Up @@ -288,6 +289,81 @@ describe('GetSpeciesData', () => {
});
});

describe('GetPartnershipsData', () => {
describe('No values provided', () => {
let data: GetPartnershipsData;

before(() => {
data = new GetPartnershipsData([], []);
});

it('sets indigenous_partnerships', function () {
expect(data.indigenous_partnerships).to.eql([]);
});

it('sets stakeholder_partnerships', function () {
expect(data.stakeholder_partnerships).to.eql([]);
});
});

describe('indigenous_partnerships values provided', () => {
let data: GetPartnershipsData;

const indigenous_partnerships = [{ name: 'partner 1' }, { name: 'partner 2' }];
const stakeholder_partnerships: string[] = [];

before(() => {
data = new GetPartnershipsData(indigenous_partnerships, stakeholder_partnerships);
});

it('sets indigenous_partnerships', function () {
expect(data.indigenous_partnerships).to.eql(['partner 1', 'partner 2']);
});

it('sets stakeholder_partnerships', function () {
expect(data.stakeholder_partnerships).to.eql([]);
});
});

describe('stakeholder_partnerships values provided', () => {
let data: GetPartnershipsData;

const indigenous_partnerships: string[] = [];
const stakeholder_partnerships = [{ name: 'partner 1' }, { name: 'partner 2' }];

before(() => {
data = new GetPartnershipsData(indigenous_partnerships, stakeholder_partnerships);
});

it('sets indigenous_partnerships', function () {
expect(data.indigenous_partnerships).to.eql([]);
});

it('sets stakeholder_partnerships', function () {
expect(data.stakeholder_partnerships).to.eql(['partner 1', 'partner 2']);
});
});

describe('All values provided', () => {
let data: GetPartnershipsData;

const indigenous_partnerships = [{ name: 'partner 1' }, { name: 'partner 2' }];
const stakeholder_partnerships = [{ name: 'partner 3' }, { name: 'partner 4' }];

before(() => {
data = new GetPartnershipsData(indigenous_partnerships, stakeholder_partnerships);
});

it('sets indigenous_partnerships', function () {
expect(data.indigenous_partnerships).to.eql(['partner 1', 'partner 2']);
});

it('sets stakeholder_partnerships', function () {
expect(data.stakeholder_partnerships).to.eql(['partner 3', 'partner 4']);
});
});
});

describe('PostIUCNData', () => {
describe('No values provided', () => {
let projectIUCNData: PostIUCNData;
Expand Down
25 changes: 25 additions & 0 deletions api/src/models/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -560,3 +560,28 @@ export class GetFundingData {
[];
}
}

/**
* Pre-processes GET /projects/{id} partnerships data
*
* @export
* @class GetPartnershipsData
*/
export class GetPartnershipsData {
indigenous_partnerships: string[];
stakeholder_partnerships: string[];

constructor(indigenous_partnerships?: any[], stakeholder_partnerships?: any[]) {
defaultLog.debug({
label: 'GetPartnershipsData',
message: 'params',
indigenous_partnerships,
stakeholder_partnerships
});

this.indigenous_partnerships =
(indigenous_partnerships?.length && indigenous_partnerships.map((item: any) => item.name)) || [];
this.stakeholder_partnerships =
(stakeholder_partnerships?.length && stakeholder_partnerships.map((item: any) => item.name)) || [];
}
}
41 changes: 36 additions & 5 deletions api/src/paths/project/{projectId}.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import {
GetCoordinatorData,
GetIUCNClassificationData,
GetFundingData,
GetSpeciesData
GetSpeciesData,
GetPartnershipsData
} from '../../models/project';
import { projectResponseBody } from '../../openapi/schemas/project';
import {
Expand All @@ -20,7 +21,9 @@ import {
getIUCNActionClassificationByProjectSQL,
getFundingSourceByProjectSQL,
getFocalSpeciesByProjectSQL,
getAncillarySpeciesByProjectSQL
getAncillarySpeciesByProjectSQL,
getIndigenousPartnershipsByProjectSQL,
getStakeholderPartnershipsByProjectSQL
} from '../../queries/project-queries';
import { getLogger } from '../../utils/logger';
import { logRequest } from '../../utils/path-utils';
Expand Down Expand Up @@ -101,6 +104,13 @@ function getProjectWithDetails(): RequestHandler {
const getProjectFundingSourceSQLStatement = getFundingSourceByProjectSQL(Number(req.params.projectId));
const getProjectFocalSpeciesSQLStatement = getFocalSpeciesByProjectSQL(Number(req.params.projectId));
const getProjectAncillarySpeciesSQLStatement = getAncillarySpeciesByProjectSQL(Number(req.params.projectId));
const getProjectIndigenousPartnershipsSQLStatement = getIndigenousPartnershipsByProjectSQL(
Number(req.params.projectId)
);
const getProjectStakeholderPartnershipsSQLStatement = getStakeholderPartnershipsByProjectSQL(
Number(req.params.projectId)
);

if (
!getProjectSQLStatement ||
!getRegionsByProjectSQLStatement ||
Expand All @@ -109,7 +119,9 @@ function getProjectWithDetails(): RequestHandler {
!getProjectIUCNActionClassificationSQLStatement ||
!getProjectFundingSourceSQLStatement ||
!getProjectFocalSpeciesSQLStatement ||
!getProjectAncillarySpeciesSQLStatement
!getProjectAncillarySpeciesSQLStatement ||
!getProjectIndigenousPartnershipsSQLStatement ||
!getProjectStakeholderPartnershipsSQLStatement
) {
throw new CustomError(400, 'Failed to build SQL statement');
}
Expand All @@ -124,7 +136,9 @@ function getProjectWithDetails(): RequestHandler {
iucnClassificationData,
fundingData,
focalSpecies,
ancillarySpecies
ancillarySpecies,
indigenousPartnerships,
stakeholderPartnerships
] = await Promise.all([
await connection.query(getProjectSQLStatement.text, getProjectSQLStatement.values),
await connection.query(getRegionsByProjectSQLStatement.text, getRegionsByProjectSQLStatement.values),
Expand All @@ -142,6 +156,14 @@ function getProjectWithDetails(): RequestHandler {
await connection.query(
getProjectAncillarySpeciesSQLStatement.text,
getProjectAncillarySpeciesSQLStatement.values
),
connection.query(
getProjectIndigenousPartnershipsSQLStatement.text,
getProjectIndigenousPartnershipsSQLStatement.values
),
connection.query(
getProjectStakeholderPartnershipsSQLStatement.text,
getProjectStakeholderPartnershipsSQLStatement.values
)
]);

Expand Down Expand Up @@ -178,6 +200,14 @@ function getProjectWithDetails(): RequestHandler {
new GetSpeciesData(focalSpecies.rows, ancillarySpecies.rows)) ||
null;

const getPartnershipsData =
(indigenousPartnerships &&
indigenousPartnerships.rows &&
stakeholderPartnerships &&
stakeholderPartnerships.rows &&
new GetPartnershipsData(indigenousPartnerships.rows, stakeholderPartnerships.rows)) ||
null;

const getIUCNClassificationData =
(iucnClassificationData &&
iucnClassificationData.rows &&
Expand All @@ -194,7 +224,8 @@ function getProjectWithDetails(): RequestHandler {
location: getLocationData,
iucn: getIUCNClassificationData,
funding: getFundingData,
species: getSpeciesData
species: getSpeciesData,
partnerships: getPartnershipsData
};

defaultLog.debug('result:', result);
Expand Down
32 changes: 31 additions & 1 deletion api/src/queries/project-queries.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ import {
getIUCNActionClassificationByProjectSQL,
getFundingSourceByProjectSQL,
getFocalSpeciesByProjectSQL,
getAncillarySpeciesByProjectSQL
getAncillarySpeciesByProjectSQL,
getStakeholderPartnershipsByProjectSQL,
getIndigenousPartnershipsByProjectSQL
} from './project-queries';

describe('postProjectSQL', () => {
Expand Down Expand Up @@ -366,6 +368,34 @@ describe('getAncillarySpeciesByProjectSQL', () => {
});
});

describe('getIndigenousPartnershipsByProjectSQL', () => {
it('Null projectId', () => {
const response = getIndigenousPartnershipsByProjectSQL((null as unknown) as number);

expect(response).to.be.null;
});

it('valid projectId', () => {
const response = getIndigenousPartnershipsByProjectSQL(1);

expect(response).to.not.be.null;
});
});

describe('getStakeholderPartnershipsByProjectSQL', () => {
it('Null projectId', () => {
const response = getStakeholderPartnershipsByProjectSQL((null as unknown) as number);

expect(response).to.be.null;
});

it('valid projectId', () => {
const response = getStakeholderPartnershipsByProjectSQL(1);

expect(response).to.not.be.null;
});
});

describe('postProjectActivitySQL', () => {
it('Null activityId', () => {
const response = postProjectActivitySQL((null as unknown) as number, 1);
Expand Down
68 changes: 68 additions & 0 deletions api/src/queries/project-queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,74 @@ export const getAncillarySpeciesByProjectSQL = (projectId: number): SQLStatement
return sqlStatement;
};

/**
* SQL query to get project stakeholder partnerships.
* @param {number} projectId
* @returns {SQLStatement} sql query object
*/
export const getStakeholderPartnershipsByProjectSQL = (projectId: number): SQLStatement | null => {
defaultLog.debug({ label: 'getStakeholderPartnershipsByProjectSQL', message: 'params', projectId });

if (!projectId) {
return null;
}

const sqlStatement = SQL`
SELECT
name
FROM
stakeholder_partnership
WHERE
p_id = ${projectId};
`;

defaultLog.debug({
label: 'getStakeholderPartnershipsByProjectSQL',
message: 'sql',
'sqlStatement.text': sqlStatement.text,
'sqlStatement.values': sqlStatement.values
});

return sqlStatement;
};

/**
* SQL query to get project indigenous partnerships.
* @param {number} projectId
* @returns {SQLStatement} sql query object
*/
export const getIndigenousPartnershipsByProjectSQL = (projectId: number): SQLStatement | null => {
defaultLog.debug({ label: 'getIndigenousPartnershipsByProjectSQL', message: 'params', projectId });

if (!projectId) {
return null;
}

const sqlStatement = SQL`
SELECT
fn.name
FROM
project_first_nation pfn
LEFT OUTER JOIN
first_nations fn
ON
pfn.fn_id = fn.id
WHERE
pfn.p_id = ${projectId}
GROUP BY
fn.name;
`;

defaultLog.debug({
label: 'getIndigenousPartnershipsByProjectSQL',
message: 'sql',
'sqlStatement.text': sqlStatement.text,
'sqlStatement.values': sqlStatement.values
});

return sqlStatement;
};

/**
* SQL query to get IUCN action classifications.
*
Expand Down
9 changes: 9 additions & 0 deletions app/src/features/projects/view/ProjectDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import GeneralInformation from 'features/projects/view/components/GeneralInforma
import LocationBoundary from 'features/projects/view/components/LocationBoundary';
import IUCNClassification from 'features/projects/view/components/IUCNClassification';
import FundingSource from 'features/projects/view/components/FundingSource';
import Partnerships from 'features/projects/view/components/Partnerships';
import { IProjectWithDetails } from 'interfaces/project-interfaces';
import { IGetAllCodesResponse } from 'interfaces/useBioHubApi-interfaces';
import Species from './components/Species';
Expand Down Expand Up @@ -81,6 +82,14 @@ const ProjectDetails: React.FC<IProjectDetailsProps> = (props) => {
</Box>
</Paper>
</Box>

<Box mb={4}>
<Paper>
<Box m={3}>
<Partnerships projectWithDetailsData={projectWithDetailsData}></Partnerships>
</Box>
</Paper>
</Box>
</>
);
};
Expand Down
Loading