DEV Community

Cover image for Recruitify - Where Talent Meets Opportunity
Amit Wani
Amit Wani

Posted on

Recruitify - Where Talent Meets Opportunity

This is a submission for the The AWS Amplify Fullstack TypeScript Challenge

What I Built

Recruitify is a platform designed to bridge the gap between job seekers and employers. It provides a seamless experience for both parties to find the perfect match for their needs.

Features

Employer

  • Create Job Postings: Employers can create detailed job listings specifying required skills, experience, location, and more.
  • Manage Applications: Employers can efficiently manage and validate applications received for their job postings.

Job Seeker

  • Browse Jobs: Job seekers can search and filter job listings based on their preferences.
  • Apply for Jobs: Easily apply for various job opportunities.
  • Receive Notifications: Get notified about new job listings that match your skills

Demo and Code

Recruitify is available here and the code is available on GitHub.

GitHub logo mtwn105 / recruitify

Recruitify - Where Talent Meets Opportunity

Introduction

Recruitify is a platform designed to bridge the gap between job seekers and employers. It provides a seamless experience for both parties to find the perfect match for their needs.

Features

Employer

  • Create Job Postings: Employers can create detailed job listings specifying required skills, experience, location, and more.
  • Manage Applications: Employers can efficiently manage and validate applications received for their job postings.

Job Seeker

  • Browse Jobs: Job seekers can search and filter job listings based on their preferences.
  • Apply for Jobs: Easily apply for various job opportunities.
  • Receive Notifications: Get notified about new job listings that match your skills

Recruitify is available here

Tech Stack

  • Backend: AWS Amplify
  • Frontend: Angular 17, Angular Material, Tailwind CSS
  • AWS Amplify Technologies: Data (DynamoDB), Authentication (Cognito), Serverless Functions (Lambda), File Storage (S3)
  • Hosting: AWS Amplify

Database Design

Recruityfy-DB




Screenshots

Browse Jobs Page
Browse Jobs Page

Edit Profile
Edit Profile

Create/Edit Job Posting
Create/Edit Job Posting
Create/Edit Job Posting2

Generate Job Description
Generate Job Description<br>

Job Details Page (Job Creator)
Job Details Page (Job Creator)

Job Details Page (Job Seeker)
Job Details Page (Job Seeker)

Job Applications Page (Job Seeker)
Job Seeker

Job Applications Page (Job Creator)
Job Applications Page (Job Creator)

New Job Notification
New Job Notification

Integrations

Tech Stack

  • Backend: AWS Amplify
  • Frontend: Angular 17, Angular Material, Tailwind CSS
  • AWS Technologies: Data (DynamoDB), Authentication (Cognito), Serverless Functions (Lambda), File Storage (S3), AI (Bedrock)
  • Hosting: AWS Amplify

Connected Components and Feature Full

This project uses Amplify connected components for Angular - Authenticator for users to sign up and log in.

This project also integrates all four integrations - Data, Authentication, Serverless Functions, File Storage

AWS Amplify

Architecture

recruitify-aws-architecture

Authentication

Utilizes AWS Amplify Authentication for user sign-up and login via email which uses AWS Cognito services.

Configured in amplify/auth/resource.ts

export const auth = defineAuth({
  loginWith: {
    email: true,
  }
});
Enter fullscreen mode Exit fullscreen mode

Implemented with the Amplify UI component <amplify-authenticator> for Angular.

Data

Utilizes AWS Amplify Data to store information about Users, Companies, and Jobs which uses AWS DynamoDB. Database Design is shown above.

Configured in amplify/data/resource.ts

Database Design
Recruityfy-DB

Storage

AWS Amplify S3 Storage is used for storing company logos and job seeker resumes.

Configured in amplify/storage/resource.ts

export const storage = defineStorage({
  name: 'recruitifyFiles',
  access: (allow) => ({
    'companyLogos/*': [
      allow.authenticated.to(['read', 'write']),
      allow.guest.to(['read', 'write'])
    ],
    'resumes/*': [
      allow.authenticated.to(['read', 'write']),
      allow.guest.to(['read', 'write'])
    ],
  })
});
Enter fullscreen mode Exit fullscreen mode

The files were uploaded using uploadData like below

 const result = await uploadData({
        data: this.previewUrl,
        path: `companyLogos/${this.authService?.userProfile?.id}`,
      }).result;
Enter fullscreen mode Exit fullscreen mode

And the files were downloaded when necessary using downloadData like below

 downloadData({ path: profile.data[0].resume })
Enter fullscreen mode Exit fullscreen mode

Functions

AWS Amplify Lambda Functions are used to send New Job Notifications to job seekers matching their skill set and Generate Job Description to generate job descriptions for job creators.

Used AWS Amplify AppSync GraphQL API inside the function to find relevant job seekers and create new job notifications.

Used AWS Bedrock with Mistral AI Model inside the function to generate job description.

Configured in amplify/functions/new-job/handler.ts

Triggered when a new job is created by an employer using a mutation in data like the below:

sendJobNotification: a.mutation()
    .arguments({ jobId: a.string(), companyId: a.string() })
    .returns(a.string())
    .authorization(allow => [allow.publicApiKey()])
    .handler(a.handler.function(newJob))
Enter fullscreen mode Exit fullscreen mode
client.mutations.sendJobNotification({
        jobId: job.data?.id,
        companyId: job.data?.companyId
      }).then((job) => {
        console.log(job)
      })
Enter fullscreen mode Exit fullscreen mode

Triggered generate job description like the below:

generateJobDescription: a.mutation()
    .arguments({ title: a.string(), minExperience: a.float(), skills: a.string(), domain: a.string() })
    .returns(a.string())
    .authorization(allow => [allow.publicApiKey()])
    .handler(a.handler.function(generateJobDescription))
Enter fullscreen mode Exit fullscreen mode
client.mutations.generateJobDescription({
      title: this.createJobForm.value.title,
      skills: this.skills.join(','),
      domain: this.createJobForm.value.domain,
      minExperience: this.createJobForm.value.minExperience,
    }).then((response) => {
      console.log(response);
      if (response?.data) {
        this.createJobForm.patchValue({
          description: response.data
        })
      }
    }).finally(() => {
      this.loadingService.hide();
    })
Enter fullscreen mode Exit fullscreen mode

Used Mistral 7B model with prompt like this:

 const text = `
          Job Title: ${title}
          Job Domain: ${domain}
          Job Min Experience: ${minExperience} years
          Job Required Skills: ${skills}
        `
    const prompt = `Your task is to generate a job description for below-given job details.

        Job Details: ${text}

        Job Description: `
Enter fullscreen mode Exit fullscreen mode

And invoke the model like below:

const input = {
      modelId: "mistral.mistral-7b-instruct-v0:2",
      contentType: "application/json",
      accept: "application/json",
      body: JSON.stringify({
        prompt: `<s>[INST] ${prompt} [/INST]`,
        max_tokens: 2000,
        temperature: 0.5,
      }),
    } as InvokeModelCommandInput;
Enter fullscreen mode Exit fullscreen mode

Hosting

Utilised AWS Hosting for seamless deployment of the application.

Future Scope

  • Application Notifications: Notifications for Job Application status changes for both job seekers and employers
  • Realtime chat messaging: Realtime chat messaging between job seeker and employer

Conclusion

Recruitify leverages the power of AWS Amplify to deliver a robust, full-stack application. A lot to learn while working with AWS and AWS Amplify toolkit along with Angular on this project.

Top comments (0)