Skip to content

Commit

Permalink
Refine org job overview
Browse files Browse the repository at this point in the history
* Added Navigation button on org jobs

* Overview displays application count

* Redesigned org joboverview

* Added checkbox toggling

* Modeled OrganizationJob from model to graphql

* Added Navigation button on org jobs

* Overview displays application count

* Redesigned org joboverview

* Added checkbox toggling

* Modeled OrganizationJob from model to graphql

* Fix compilation and finish implementation
  • Loading branch information
DonGiovanni83 committed Dec 10, 2018
1 parent cbc3842 commit 50fd5c2
Show file tree
Hide file tree
Showing 23 changed files with 497 additions and 341 deletions.
19 changes: 19 additions & 0 deletions backend/applications/server/schema.graphql
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]!

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

# search completions
Expand Down
10 changes: 6 additions & 4 deletions backend/applications/server/src/graphql/index.ts
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
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;
@@ -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;
@@ -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;
Expand Up @@ -5,7 +5,7 @@ const approveJobApplication: MutationResolvers.ApproveJobApplicationResolver = (
args,
ctx
) =>
ctx.applicationRepository.approveJobApplication(
ctx.jobApplicationRepository.approveJobApplication(
args.applicationId,
ctx.session
);
Expand Down
Expand Up @@ -5,7 +5,7 @@ const rejectJobApplication: MutationResolvers.RejectJobApplicationResolver = (
args,
ctx
) =>
ctx.applicationRepository.rejectJobApplication(
ctx.jobApplicationRepository.rejectJobApplication(
args.applicationId,
ctx.session
);
Expand Down
@@ -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;
@@ -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;
@@ -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
@@ -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;
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
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
@@ -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.

0 comments on commit 50fd5c2

Please sign in to comment.