Skip to content

Commit e9d8f22

Browse files
authored
Merge pull request #8 from devidnyk/users/devi/jobs-backend
Scrapper Added using Search API and AI Filtering
2 parents 62f5996 + 111af8a commit e9d8f22

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2191
-47
lines changed

src/.dockerignore

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
**/.classpath
2+
**/.dockerignore
3+
**/.env
4+
**/.git
5+
**/.gitignore
6+
**/.project
7+
**/.settings
8+
**/.toolstarget
9+
**/.vs
10+
**/.vscode
11+
**/*.*proj.user
12+
**/*.dbmdl
13+
**/*.jfm
14+
**/azds.yaml
15+
**/bin
16+
**/charts
17+
**/docker-compose*
18+
**/Dockerfile*
19+
**/node_modules
20+
**/npm-debug.log
21+
**/obj
22+
**/secrets.dev.yaml
23+
**/values.dev.yaml
24+
LICENSE
25+
README.md
26+
!**/.gitignore
27+
!.git/HEAD
28+
!.git/config
29+
!.git/packed-refs
30+
!.git/refs/heads/**

src/Backend/Backend.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="Azure.AI.Agents.Persistent" Version="1.1.0" />
11+
<PackageReference Include="Azure.AI.Inference" Version="1.0.0-beta.5" />
12+
<PackageReference Include="Azure.AI.Projects" Version="1.0.0" />
13+
<PackageReference Include="Azure.Core" Version="1.49.0" />
14+
<PackageReference Include="Azure.Identity" Version="1.17.0" />
1015
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.23.0" />
1116
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.54.0" />
1217
<PackageReference Include="Microsoft.Extensions.Logging.ApplicationInsights" Version="2.23.0" />
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
namespace Backend.Controllers
3+
{
4+
using Backend.Operations;
5+
using Common.Managers;
6+
using Microsoft.AspNetCore.Mvc;
7+
8+
[ApiController]
9+
[Route("api/admin")]
10+
public class AdminController : ControllerBase
11+
{
12+
private readonly ILogger<AdminController> logger;
13+
private readonly ScrapperRunner scrapperRunner;
14+
15+
public AdminController(ILogger<AdminController> logger, ScrapperRunner scrapperRunner)
16+
{
17+
this.logger = logger;
18+
this.scrapperRunner = scrapperRunner;
19+
}
20+
21+
[HttpGet]
22+
[Route("scrappers/trigger/{scrapperId}")]
23+
public ActionResult<string> TriggerScrapperRun(string scrapperId)
24+
{
25+
// _ = Task.Run(async () => await scrapperRunner.RunScrapperAsync(scrapperId));
26+
return Ok($"[Dummy]: Scrapper run triggered for id: {scrapperId}");
27+
}
28+
29+
[HttpPut]
30+
[Route("scrappers/trigger/{scrapperId}")]
31+
public ActionResult<string> EnableScrapper(string scrapperId)
32+
{
33+
this.scrapperRunner.EnableScrapper(scrapperId);
34+
return Ok($"Scrapper enabled for id: {scrapperId}");
35+
}
36+
37+
[HttpDelete]
38+
[Route("scrappers/trigger/{scrapperId}")]
39+
public ActionResult<string> DisableScrapper(string scrapperId)
40+
{
41+
this.scrapperRunner.DisableScrapper(scrapperId);
42+
return Ok($"Scrapper disabled for id: {scrapperId}");
43+
}
44+
45+
[HttpGet]
46+
[Route("scrappers/background/start")]
47+
public ActionResult<string> StartScrappersInBackground()
48+
{
49+
this.scrapperRunner.StartBackgroundRunner();
50+
return Ok($"Background scrapper runs started. Current State: {this.scrapperRunner.CurrentState}");
51+
}
52+
53+
[HttpGet]
54+
[Route("scrappers/background/stop")]
55+
public ActionResult<string> StopScrappersInBackground()
56+
{
57+
this.scrapperRunner.StopBackgroundRunner();
58+
return Ok($"Background scrapper runs stopped. Current State: {this.scrapperRunner.CurrentState}");
59+
}
60+
61+
[HttpGet]
62+
[Route("scrappers/background/status")]
63+
public ActionResult<string> GetScrappersInBackgroundStatus()
64+
{
65+
this.scrapperRunner.StopBackgroundRunner();
66+
return Ok($"{this.scrapperRunner.GetStatus()}");
67+
}
68+
}
69+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
namespace Backend.Controllers
2+
{
3+
using Backend.Operations;
4+
using Microsoft.AspNetCore.Mvc;
5+
using Common.Models.Public;
6+
using Common.Repositories;
7+
using System.Threading.Tasks;
8+
using Common.Managers;
9+
using Common.Engines;
10+
using Common.Queries;
11+
using Common.DatabaseModels;
12+
13+
[ApiController]
14+
[Route("api/jobs")]
15+
public class JobSearchController : ControllerBase
16+
{
17+
private readonly JobsRepository jobsRepository;
18+
private readonly ILogger<JobSearchController> logger;
19+
public JobSearchController(JobsRepository jobsRepository, ILogger<JobSearchController> logger)
20+
{
21+
this.logger = logger;
22+
this.jobsRepository = jobsRepository;
23+
}
24+
25+
[HttpPost]
26+
[Route("search")]
27+
public async Task<ActionResult<List<ScrappedJob>>> SearchJobs([FromBody] JobQuery jobquery)
28+
{
29+
return Ok(await jobsRepository.GetJobsFromQuery(jobquery));
30+
}
31+
32+
[HttpGet]
33+
[Route("latest")]
34+
public async Task<ActionResult<string>> GetLatestJobsFromDb(
35+
[FromQuery] string location = "India",
36+
[FromQuery] string level = "Mid")
37+
{
38+
return Content(JobListView.RenderScrappedJobsHtml(await this.jobsRepository.GetJobsEasyQueryAsync(location, level)), "text/html");
39+
}
40+
41+
[HttpGet]
42+
[Route("lastOneDay")]
43+
public async Task<ActionResult<string>> GetLastOneDayJobsFromDb()
44+
{
45+
return Ok(await this.jobsRepository.GetAllJobsInLastOneDay());
46+
}
47+
48+
[HttpGet]
49+
[Route("profile/{id}")]
50+
public async Task<ActionResult<string>> GetJobById(string id)
51+
{
52+
var job = await this.jobsRepository.GetJobByIdAsync(id);
53+
if (job != null)
54+
{
55+
return Ok(job);
56+
}
57+
return Ok("Not found.");
58+
}
59+
}
60+
}

src/Backend/Controllers/ProblemsController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
namespace Backend.Controllers
22
{
33
using Backend.Filters;
4-
using Backend.Models.Public;
4+
using Common.Models.Public;
55
using Backend.Operations;
66
using Common.Models;
77
using Microsoft.AspNetCore.Mvc;
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using Common.DatabaseModels;
2+
using Common.Engines;
3+
using Common.Managers;
4+
using Common.Models;
5+
using Common.Models.Public;
6+
using Common.Repositories;
7+
using Microsoft.AspNetCore.Mvc;
8+
9+
namespace Backend.Controllers
10+
{
11+
[ApiController]
12+
[Route("api/jobs/scrappers")]
13+
public class ScrapperSettingsController : ControllerBase
14+
{
15+
private readonly JobScrapperSettingsManager _settingsManager;
16+
17+
private readonly ILogger<JobSearchController> _logger;
18+
19+
public ScrapperSettingsController(JobScrapperSettingsManager jobScrapperSettingsManager,
20+
ILogger<JobSearchController> logger)
21+
{
22+
_settingsManager = jobScrapperSettingsManager;
23+
_logger = logger;
24+
}
25+
26+
[HttpGet]
27+
[Route("")]
28+
public async Task<ActionResult<List<JobScrapperSettings>>> GetAllJobScrappers()
29+
{
30+
// Placeholder implementation for getting all scrappers
31+
return Ok(await _settingsManager.GetAllSettings());
32+
}
33+
34+
[HttpPut]
35+
[Route("{id}")]
36+
public async Task<ActionResult<JobScrapperSettings>> UpdateJobScrapperSettings(string id, [FromBody] ScrapperSettings settings)
37+
{
38+
try
39+
{
40+
return Ok(await _settingsManager.CreateOrUpdateSettings(id, settings));
41+
}
42+
catch (InvalidOperationException ex)
43+
{
44+
return BadRequest(ex.Message);
45+
}
46+
}
47+
48+
[HttpPost]
49+
[Route("add")]
50+
public async Task<ActionResult<JobScrapperSettings>> CreateNewJobScrapperSettings([FromBody] ScrapperSettings settings)
51+
{
52+
return BadRequest("Use PUT api/jobs/scrappers/{id} to create or update scrapper settings.");
53+
// return Ok(await _settingsManager.CreateOrUpdateSettings(string.Empty, settings));
54+
}
55+
56+
[HttpGet]
57+
[Route("{id}")]
58+
public async Task<ActionResult<JobScrapperSettings>> GetJobScrapperSettings(string id)
59+
{
60+
// Placeholder implementation for getting scrapper settings
61+
return Ok(await _settingsManager.GetSettingsById(id));
62+
}
63+
}
64+
}

src/Backend/Filters/IFilter.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/Backend/Filters/ProblemFilter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
using Common;
12
using Common.Models;
23

34
namespace Backend.Filters
45
{
5-
public class ProblemFilter : IFilter
6+
public class ProblemFilter : IFilter<Problem>
67
{
78
private int skip = 0;
89
private int limit = 50;

src/Backend/Operations/DataProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace Backend.Operations
22
{
33
using Backend.Filters;
4+
using Common;
45
using Common.Cache;
56
using Common.Constants;
67
using Common.Models;
@@ -15,7 +16,7 @@ public DataProvider([FromKeyedServices(CacheConstants.ProblemCacheKey)] ICache p
1516
_logger = logger;
1617
}
1718

18-
public async Task<List<Problem>> GetProblemsAsync(IFilter? filter = null)
19+
public async Task<List<Problem>> GetProblemsAsync(IFilter<Problem>? filter = null)
1920
{
2021
var allProblems = await GetAllProblemsAsync();
2122
if (filter != null)

0 commit comments

Comments
 (0)