Skip to content

Commit 418bc1d

Browse files
authored
Job posting api support (#39)
1 parent 65db77e commit 418bc1d

7 files changed

Lines changed: 405 additions & 4 deletions

File tree

README.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,59 @@ let params = IPParams {
280280
let results = client.ip.get(params);
281281
```
282282

283+
### Job Posting Search
284+
285+
#### Search (Elasticsearch)
286+
287+
```rust
288+
let query = serde_json::json!({
289+
"query": {
290+
"bool": {
291+
"must": [
292+
{ "term": { "title_role": "engineering" } },
293+
{ "term": { "remote_work_policy": "remote" } },
294+
]
295+
}
296+
}
297+
});
298+
299+
let mut base_params = BaseParams::default();
300+
base_params.size = Some(10);
301+
302+
let search_base_params = JobPostingSearchBaseParams {
303+
query: Some(query),
304+
..JobPostingSearchBaseParams::default()
305+
};
306+
307+
let params = JobPostingSearchParams {
308+
base_params: Some(base_params),
309+
search_base_params,
310+
};
311+
312+
let results = client.job_posting.search(params);
313+
```
314+
315+
#### Search (Field Parameters)
316+
317+
```rust
318+
let mut base_params = BaseParams::default();
319+
base_params.size = Some(10);
320+
321+
let search_base_params = JobPostingSearchBaseParams {
322+
title_role: Some("engineering".to_string()),
323+
remote_work_policy: Some(RemoteWorkPolicy::Remote),
324+
is_active: Some(true),
325+
..JobPostingSearchBaseParams::default()
326+
};
327+
328+
let params = JobPostingSearchParams {
329+
base_params: Some(base_params),
330+
search_base_params,
331+
};
332+
333+
let results = client.job_posting.search(params);
334+
```
335+
283336
## 🏝 Sandbox Usage <a name="sandbox"></a>
284337
```rust
285338
// To enable sandbox usage, pass in the following options to the PDLClient before building
@@ -309,6 +362,12 @@ let client = PDLClient::new(&api_key).options(client_options).build();
309362
| [Company Enrichment API](https://docs.peopledatalabs.com/docs/company-enrichment-api) | `client.company.enrich(params)` |
310363
| [Company Search API](https://docs.peopledatalabs.com/docs/company-search-api) | `client.company.search(params)` |
311364

365+
**Job Posting Endpoints**
366+
367+
| API Endpoint | SDK Function |
368+
| ------------------------------------------------------------------------------------- |---------------------------------------|
369+
| [Job Posting Search API](https://docs.peopledatalabs.com/docs/job-posting-search-api) | `client.job_posting.search(params)` |
370+
312371
**Supporting Endpoints**
313372

314373
| API Endpoint | SDK Function |

examples/job_posting/main.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use peopledatalabs::{
2+
BaseParams, JobPostingSearchBaseParams, JobPostingSearchParams, RemoteWorkPolicy, PDL,
3+
};
4+
5+
fn main() {
6+
let client = PDL::new();
7+
8+
let mut base_params = BaseParams::default();
9+
base_params.size = Some(10);
10+
11+
// By Search (Field Parameters)
12+
let search_base_params = JobPostingSearchBaseParams {
13+
title_role: Some("engineering".to_string()),
14+
remote_work_policy: Some(RemoteWorkPolicy::Remote),
15+
is_active: Some(true),
16+
..JobPostingSearchBaseParams::default()
17+
};
18+
19+
let params = JobPostingSearchParams {
20+
base_params: Some(base_params),
21+
search_base_params,
22+
};
23+
24+
let results = client.job_posting.search(params);
25+
26+
println!("{:#?}", results);
27+
}

src/api/jobposting.rs

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
use crate::{
2+
models::jobposting::{JobPostingSearchParams, SearchJobPostingResponse},
3+
PDLClient, PDLError,
4+
};
5+
6+
pub(crate) static JOB_POSTING_SEARCH_PATH: &str = "/job_posting/search";
7+
8+
pub struct JobPosting {
9+
pub client: PDLClient,
10+
}
11+
12+
impl JobPosting {
13+
/// Searches PDL's job_posting dataset.
14+
/// docs: https://docs.peopledatalabs.com/docs/job-posting-search-api
15+
pub fn search(
16+
&self,
17+
params: JobPostingSearchParams,
18+
) -> Result<SearchJobPostingResponse, PDLError> {
19+
params.validate()?;
20+
self.client
21+
.post::<SearchJobPostingResponse, JobPostingSearchParams>(
22+
JOB_POSTING_SEARCH_PATH,
23+
params,
24+
)
25+
}
26+
}
27+
28+
#[cfg(test)]
29+
mod tests {
30+
use crate::{
31+
client::PDLClient,
32+
models::jobposting::{
33+
JobPostingSearchBaseParams, JobPostingSearchParams, RemoteWorkPolicy,
34+
},
35+
BaseParams,
36+
};
37+
38+
use super::JobPosting;
39+
40+
#[test]
41+
fn test_job_posting_search_query() {
42+
let api_key = std::env::var("PDL_API_KEY").unwrap();
43+
let client = PDLClient::new(&api_key).build();
44+
45+
let job_posting = JobPosting { client };
46+
47+
let mut base_params = BaseParams::default();
48+
base_params.size = Some(3);
49+
50+
let query = serde_json::json!({
51+
"query": {
52+
"bool": {
53+
"must": [
54+
{ "term": { "title_role": "engineering" } },
55+
]
56+
}
57+
}
58+
});
59+
60+
let search_base_params = JobPostingSearchBaseParams {
61+
query: Some(query),
62+
..JobPostingSearchBaseParams::default()
63+
};
64+
65+
let params = JobPostingSearchParams {
66+
base_params: Some(base_params),
67+
search_base_params,
68+
};
69+
70+
let resp = job_posting.search(params).expect("ERROR");
71+
72+
assert_eq!(resp.status, 200);
73+
assert!(resp.data.is_some());
74+
}
75+
76+
#[test]
77+
fn test_job_posting_search_params() {
78+
let api_key = std::env::var("PDL_API_KEY").unwrap();
79+
let client = PDLClient::new(&api_key).build();
80+
81+
let job_posting = JobPosting { client };
82+
83+
let mut base_params = BaseParams::default();
84+
base_params.size = Some(3);
85+
86+
let search_base_params = JobPostingSearchBaseParams {
87+
title_role: Some("engineering".to_string()),
88+
remote_work_policy: Some(RemoteWorkPolicy::Remote),
89+
..JobPostingSearchBaseParams::default()
90+
};
91+
92+
let params = JobPostingSearchParams {
93+
base_params: Some(base_params),
94+
search_base_params,
95+
};
96+
97+
let resp = job_posting.search(params).expect("ERROR");
98+
99+
assert_eq!(resp.status, 200);
100+
assert!(resp.data.is_some());
101+
}
102+
103+
#[test]
104+
fn test_job_posting_search_size_out_of_range() {
105+
let api_key = std::env::var("PDL_API_KEY").unwrap();
106+
let client = PDLClient::new(&api_key).build();
107+
108+
let job_posting = JobPosting { client };
109+
110+
let mut base_params = BaseParams::default();
111+
base_params.size = Some(101);
112+
113+
let search_base_params = JobPostingSearchBaseParams {
114+
title: Some("engineer".to_string()),
115+
..JobPostingSearchBaseParams::default()
116+
};
117+
118+
let params = JobPostingSearchParams {
119+
base_params: Some(base_params),
120+
search_base_params,
121+
};
122+
123+
let resp = job_posting.search(params);
124+
assert!(resp.is_err());
125+
}
126+
127+
#[test]
128+
fn test_job_posting_is_active_serialization_opt_in() {
129+
// None must be omitted entirely; Some(false) must round-trip.
130+
let mut params = JobPostingSearchBaseParams::default();
131+
params.title = Some("engineer".to_string());
132+
let body = serde_json::to_string(&params).unwrap();
133+
assert!(!body.contains("is_active"));
134+
135+
params.is_active = Some(false);
136+
let body = serde_json::to_string(&params).unwrap();
137+
assert!(body.contains("\"is_active\":false"));
138+
}
139+
140+
#[test]
141+
fn test_job_posting_scroll_token_round_trips_verbatim() {
142+
let token = "eyJhIjogMX0=".to_string();
143+
let mut params = JobPostingSearchBaseParams::default();
144+
params.scroll_token = Some(token.clone());
145+
let body = serde_json::to_string(&params).unwrap();
146+
assert!(body.contains(&format!("\"scroll_token\":\"{}\"", token)));
147+
}
148+
}

src/api/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pub mod autocomplete;
22
pub mod changelog;
33
pub mod company;
44
pub mod ip;
5+
pub mod jobposting;
56
pub mod jobtitle;
67
pub mod location;
78
pub mod person;
@@ -11,6 +12,7 @@ pub(crate) use autocomplete::Autocomplete;
1112
pub(crate) use changelog::Changelog;
1213
pub(crate) use company::Company;
1314
pub(crate) use ip::IP;
15+
pub(crate) use jobposting::JobPosting;
1416
pub(crate) use jobtitle::JobTitle;
1517
pub(crate) use location::Location;
1618
pub(crate) use person::Person;

src/lib.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ mod api;
22
mod client;
33
mod models;
44

5-
use api::{Autocomplete, Changelog, Company, JobTitle, Location, Person, School, IP};
5+
use api::{Autocomplete, Changelog, Company, JobPosting, JobTitle, Location, Person, School, IP};
66
use client::{PDLClient, PDLError};
77

88
pub use models::{
99
AutocompleteBaseParams, AutocompleteParams, BaseParams, BulkEnrichPersonParams,
1010
BulkEnrichSinglePersonParams, BulkRetrievePersonParams, BulkRetrieveSinglePersonParams,
1111
CleanCompanyParams, CleanLocationParams, CleanSchoolParams, CompanyParams, EnrichCompanyParams,
12-
EnrichPersonParams, IPBaseParams, IPParams, IdentifyPersonParams, JobTitleBaseParams,
13-
JobTitleParams, LocationParams, PersonMetadata, PersonParams, RetrievePersonParams,
14-
SchoolParams, SearchBaseParams, SearchParams,
12+
EnrichPersonParams, IPBaseParams, IPParams, IdentifyPersonParams, JobPostingSearchBaseParams,
13+
JobPostingSearchParams, JobTitleBaseParams, JobTitleParams, LocationParams, PersonMetadata,
14+
PersonParams, RemoteWorkPolicy, RetrievePersonParams, SalaryPeriod, SchoolParams,
15+
SearchBaseParams, SearchParams,
1516
};
1617
pub use models::changelog::ChangelogPersonParams;
1718

@@ -20,6 +21,7 @@ pub struct PDL {
2021
pub changelog: Changelog,
2122
pub company: Company,
2223
pub ip: IP,
24+
pub job_posting: JobPosting,
2325
pub job_title: JobTitle,
2426
pub location: Location,
2527
pub person: Person,
@@ -50,6 +52,9 @@ impl PDL {
5052
ip: IP {
5153
client: client.clone(),
5254
},
55+
job_posting: JobPosting {
56+
client: client.clone(),
57+
},
5358
job_title: JobTitle {
5459
client: client.clone(),
5560
},

0 commit comments

Comments
 (0)