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

Refine org job overview #94

Merged
merged 13 commits into from
Dec 10, 2018
19 changes: 19 additions & 0 deletions backend/applications/server/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ type Organization {
approved: Boolean!
}

interface JobInterface {
id: ID!
title: String!
description: String!
salary: Float!
}

type Job {
id: ID!
title: String!
Expand All @@ -35,6 +42,14 @@ type Job {
applied: Boolean!
}

type OrganizationJob implements JobInterface {
id: ID!
title: String!
description: String!
salary: Float!
applicationCount: Int!
}

type JobConnection {
nodes: [Job!]!
pageInfo: JobPageInfo!
Expand Down Expand Up @@ -126,10 +141,14 @@ type Query {

organizations(organizationId: String): [Organization]!

getOrganizationJobs(organizationId: String!): [OrganizationJob]!

me: User!

applications(applicationId: String): [JobApplication]!

applicationsForJob(jobId: String!): [JobApplication]!
DonGiovanni83 marked this conversation as resolved.
Show resolved Hide resolved

skills(id: String, title: String): [Skill!]!

# search completions
Expand Down
10 changes: 6 additions & 4 deletions backend/applications/server/src/graphql/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import Mutation from "./resolvers/_mutations";
import Query from "./resolvers/_queries";
import Job from "./resolvers/Job";
import User from "./resolvers/User";
import OrganizationJob from "./resolvers/OrganizationJob";

const resolvers = {
Query,
Mutation,
Job,
User
Query,
Mutation,
Job,
OrganizationJob,
User
};

export default resolvers;
2 changes: 1 addition & 1 deletion backend/applications/server/src/graphql/resolvers/Job.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { JobResolvers } from "../__generated__/graphqlgen";
export const Job: JobResolvers.Type = {
...JobResolvers.defaultResolvers,
applied: (parent, _, ctx) =>
ctx.applicationRepository.isApplied(parent.id, ctx.session)
ctx.jobApplicationRepository.isApplied(parent.id, ctx.session)
};

export default Job;
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import {OrganizationJobResolvers} from "../__generated__/graphqlgen";

const OrganizationJob: OrganizationJobResolvers.Type = {
...OrganizationJobResolvers.defaultResolvers,
applicationCount: ({id}, args, {jobApplicationRepository, session}) =>
jobApplicationRepository.applicationsCount(id, session),
};

export default OrganizationJob;
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { MutationResolvers } from "../../__generated__/graphqlgen";

const applyForJob: MutationResolvers.ApplyForJobResolver = (_, args, ctx) =>
ctx.applicationRepository.applyForJob(args.jobId, ctx.session);
ctx.jobApplicationRepository.applyForJob(args.jobId, ctx.session);

export default applyForJob;
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const approveJobApplication: MutationResolvers.ApproveJobApplicationResolver = (
args,
ctx
) =>
ctx.applicationRepository.approveJobApplication(
ctx.jobApplicationRepository.approveJobApplication(
args.applicationId,
ctx.session
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const rejectJobApplication: MutationResolvers.RejectJobApplicationResolver = (
args,
ctx
) =>
ctx.applicationRepository.rejectJobApplication(
ctx.jobApplicationRepository.rejectJobApplication(
args.applicationId,
ctx.session
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { QueryResolvers } from "../../__generated__/graphqlgen";

const applications: QueryResolvers.ApplicationsResolver = (_, args, ctx) => {
return ctx.applicationRepository.getApplications(args, ctx.session);
return ctx.jobApplicationRepository.getApplications(args, ctx.session);
};

export default applications;
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { QueryResolvers } from "../../__generated__/graphqlgen";

const applicationsForJob: QueryResolvers.ApplicationsForJobResolver = (_, args, ctx) => {
return ctx.jobApplicationRepository.getApplicationsForJob(args.jobId, ctx.session);
};

export default applicationsForJob;
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { QueryResolvers } from "../../__generated__/graphqlgen";

const getOrganizationJobs: QueryResolvers.GetOrganizationJobsResolver = (
_,
args,
ctx
) =>
ctx.jobRepository.getOrganizationJobs(
args.organizationId,
ctx.session
) as any;

export default getOrganizationJobs;
24 changes: 14 additions & 10 deletions backend/applications/server/src/graphql/resolvers/_queries/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { QueryResolvers } from "../../__generated__/graphqlgen";
import {QueryResolvers} from "../../__generated__/graphqlgen";
import jobs from "./jobs";
import me from "./me";
import organizations from "./organizations";
Expand All @@ -8,17 +8,21 @@ import users from "./users";
import search from "./search";
import searchAutocompletions from "./searchAutocompletions";
import job from "./job"
import applicationsForJob from "./applicationsForJob";
import getOrganizationJobs from "./getOrganizationJobs";

export const Query: QueryResolvers.Type = {
jobs,
skills,
organizations,
me,
applications,
users,
search,
searchAutocompletions,
job
jobs,
skills,
organizations,
me,
applications,
applicationsForJob,
getOrganizationJobs,
users,
search,
searchAutocompletions,
job
};

export default Query;
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ describe("Get likedJobs", () => {
})))(),
organizationRepository: new (jest.fn<OrganizationRepository>())(),
userRepository: new (jest.fn<UserRepository>())(),
applicationRepository: new (jest.fn<JobApplicationRepository>())(),
jobApplicationRepository: new (jest.fn<JobApplicationRepository>())(),
skillRepository: new (jest.fn<SkillRepository>())()
};

Expand Down
12 changes: 9 additions & 3 deletions backend/applications/server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,21 @@ import client from "./lib/redis";
createConnection({
type: "postgres",
url: config.get("database_url"),
entities: [Job, Organization, User, Skill, JobApplication, StudentProfile],
entities: [
Job,
Organization,
User,
Skill,
JobApplication,
StudentProfile],
logging: true
}).then(async connection => {
const typeDefs = importSchema("./schema.graphql");

const jobRepository = new JobRepository(connection);
const organizationRepository = new OrganizationRepository(connection);
const userRepository = new UserRepository(connection);
const applicationRepository = new JobApplicationRepository(connection);
const jobApplicationRepository = new JobApplicationRepository(connection);
const skillRepository = new SkillRepository(connection);
const studentProfileRepository = new StudentProfileRepository(connection);

Expand All @@ -48,7 +54,7 @@ createConnection({
jobRepository,
organizationRepository,
userRepository,
applicationRepository,
jobApplicationRepository,
skillRepository,
studentProfileRepository,
session: request.session
Expand Down
127 changes: 69 additions & 58 deletions backend/applications/server/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,98 +1,109 @@
import { JobRepository } from "@unijobs/backend-modules-repositories";
import { OrganizationRepository } from "@unijobs/backend-modules-repositories";
import { UserRepository } from "@unijobs/backend-modules-repositories";
import { JobApplicationRepository } from "@unijobs/backend-modules-repositories";
import { SkillRepository } from "@unijobs/backend-modules-repositories";
import {JobRepository} from "@unijobs/backend-modules-repositories";
import {OrganizationRepository} from "@unijobs/backend-modules-repositories";
import {UserRepository} from "@unijobs/backend-modules-repositories";
import {JobApplicationRepository} from "@unijobs/backend-modules-repositories";
import {SkillRepository} from "@unijobs/backend-modules-repositories";

export interface Context {
jobRepository: JobRepository;
organizationRepository: OrganizationRepository;
userRepository: UserRepository;
applicationRepository: JobApplicationRepository;
skillRepository: SkillRepository;
session?: Express.Session;
jobRepository: JobRepository;
organizationRepository: OrganizationRepository;
userRepository: UserRepository;
jobApplicationRepository: JobApplicationRepository;
skillRepository: SkillRepository;
session?: Express.Session;
}

export interface Organization {
id: string;
name: string;
email: string;
phone: string;
approved: boolean;
jobs: Promise<any[]>;
id: string;
name: string;
email: string;
phone: string;
approved: boolean;
jobs: Promise<any[]>;
}

export interface Job {
id: string;
title: string;
description: string;
salary: number;
organization: any;
id: string;
title: string;
description: string;
salary: number;
organization: any;
}

export interface OrganizationJob {
id: string;
title: string;
description: string;
salary: number;
applied: boolean;
organization: any;
applicationCount: number;
}

export interface AggregationBucket {
key: string;
count: number;
label: string;
key: string;
count: number;
label: string;
}

export interface SearchAggregation {
id: string;
value: string;
id: string;
value: string;
}

export interface SearchConnection {
nodes: any[];
buckets: any[];
aggregations: any[];
nodes: any[];
buckets: any[];
aggregations: any[];
}

export interface JobConnection {
nodes: Job[];
pageInfo: JobPageInfo;
totalCount: number;
nodes: Job[];
pageInfo: JobPageInfo;
totalCount: number;
}

export interface JobPageInfo {
endCursor: string | null;
hasNextPage: boolean;
hasPreviousPage: boolean;
startCursor: string | null;
endCursor: string | null;
hasNextPage: boolean;
hasPreviousPage: boolean;
startCursor: string | null;
}

export interface Skill {
id: string;
title: string;
description: string;
id: string;
title: string;
description: string;
}

export interface User {
id: string;
firstname: string;
lastname: string;
email: string;
phone: string;
siteAdmin: boolean;
hasOrganizations: boolean;
isStudent: boolean;
id: string;
firstname: string;
lastname: string;
email: string;
phone: string;
siteAdmin: boolean;
hasOrganizations: boolean;
isStudent: boolean;
}

export interface StudentProfile {
id: string;
student: User;
studyProgram: string;
university: string;
id: string;
student: User;
studyProgram: string;
university: string;
}

export interface JobApplication {
id: string;
state: JobApplicationState;
user: any;
job: Job;
id: string;
state: JobApplicationState;
user: any;
job: Job;
}

export interface JobAutocompletion {
id: string;
title: string;
id: string;
title: string;
}

export type JobApplicationState = "PENDING" | "REJECTED" | "APPROVED";
5 changes: 0 additions & 5 deletions backend/dev/restart_db.sh

This file was deleted.