UNPKG

@jobgoal/sdk-angular-gcloud

Version:

JobGoal Angular SDK for interacting with GCloud Firebase Functions APIs (recruitment and account)

359 lines (297 loc) 8.2 kB
# @jobgoal/sdk-angular-gcloud Angular SDK for JobGoal GCloud Firebase Functions APIs ## Installation ```bash npm install @jobgoal/sdk-angular-gcloud ``` ## Features - **recruitment Module**: Manage vacancies, candidates, and applications - **Account Module**: Manage organizations - Full TypeScript support with type definitions - RxJS observables for reactive programming - Angular dependency injection integration ## Usage ### Setup Configure the API base URLs in your Angular module: ```typescript import { ApplicationConfig } from '@angular/core'; import { provideHttpClient } from '@angular/common/http'; import { RECRUITMENT_API_BASE_URL, IDENTITY_API_BASE_URL } from '@jobgoal/sdk-angular-gcloud'; export const appConfig: ApplicationConfig = { providers: [ provideHttpClient(), { provide: RECRUITMENT_API_BASE_URL, useValue: 'https://your-recruitment-api.com' }, { provide: IDENTITY_API_BASE_URL, useValue: 'https://your-identity-api.com' } ] }; ``` Or in a standalone component: ```typescript import { Component } from '@angular/core'; import { provideHttpClient } from '@angular/common/http'; import { recruitment_API_BASE_URL } from '@jobgoal/sdk-angular-gcloud/recruitment'; @Component({ // ... providers: [ provideHttpClient(), { provide: recruitment_API_BASE_URL, useValue: 'https://your-recruitment-api.com' } ] }) export class MyComponent {} ``` **Note:** `provideHttpClient()` is required for the SDK to make HTTP requests. Make sure to include it in your application configuration or component providers. ### Using the recruitment Module #### Vacancy Management ```typescript import { Component, inject, OnInit } from '@angular/core'; import { VacancyApi } from '@jobgoal/sdk-angular-gcloud/recruitment'; @Component({ selector: 'app-vacancy-manager', template: `...` }) export class VacancyManagerComponent implements OnInit { private vacancyApi = inject(VacancyApi); ngOnInit() { // List vacancies for an organization this.vacancyApi.list({ owner_id: 'org-123', statuses: ['OPEN', 'DRAFT'] }).subscribe(response => { // response.vacancies contains the list }); // Read a specific vacancy this.vacancyApi.read({ vacancy_id: 'vac-456' }) .subscribe(vacancy => { // Use vacancy data }); } createVacancy() { this.vacancyApi.create({ owner_id: 'org-123', title: 'Delivery Driver', description: 'Looking for reliable delivery driver', employer_name: 'ACME Corp', employment_address: { street: '123 Main St', city: 'Amsterdam', postal_code: '1012AB', country: 'NL' }, employment_type: 'PART_TIME', minimum_age: 18, contact_person: { name: 'John Doe', email: 'john@acme.com', phone: '+31612345678' } }).subscribe(response => { // response.id contains the new vacancy ID }); } updateVacancy(vacancyId: string) { this.vacancyApi.patch({ id: vacancyId, title: 'Senior Delivery Driver', status: 'OPEN' }).subscribe(() => { // Vacancy updated }); } deleteVacancy(vacancyId: string) { this.vacancyApi.delete({ vacancy_id: vacancyId }) .subscribe(() => { // Vacancy deleted }); } } ``` #### Candidate Management ```typescript import { Component, inject } from '@angular/core'; import { CandidateApi } from '@jobgoal/sdk-angular-gcloud/recruitment'; @Component({ selector: 'app-candidate-manager', template: `...` }) export class CandidateManagerComponent { private candidateApi = inject(CandidateApi); loadCandidate(candidateId: string) { this.candidateApi.read(candidateId) .subscribe(candidate => { // Use candidate data }); } createCandidate() { this.candidateApi.create({ full_name: 'Jane Smith', birth_date: '1995-06-15', personal_email_address: 'jane.smith@example.com', mobile_phone_number: '+31612345678', residential_address: { street: '456 Oak St', city: 'Rotterdam', postal_code: '3011AB', country: 'NL' }, language_levels: { 'nl': 'C2', 'en': 'B2' } }).subscribe(response => { // response.id contains the new candidate ID }); } updateCandidate(candidateId: string) { this.candidateApi.patch({ id: candidateId, mobile_phone_number: '+31698765432' }).subscribe(() => { // Candidate updated }); } } ``` #### Application Management ```typescript import { Component, inject } from '@angular/core'; import { ApplicationApi } from '@jobgoal/sdk-angular-gcloud/recruitment'; @Component({ selector: 'app-application-manager', template: `...` }) export class ApplicationManagerComponent { private applicationApi = inject(ApplicationApi); listApplicationsForCandidate(candidateId: string) { this.applicationApi.list({ candidate_id: candidateId }) .subscribe(response => { // response.applications contains the list }); } listApplicationsForVacancy(vacancyId: string) { this.applicationApi.list({ vacancy_id: vacancyId }) .subscribe(response => { // response.applications contains the list }); } applyToVacancy(candidateId: string, vacancyId: string) { this.applicationApi.apply({ candidate_id: candidateId, vacancy_id: vacancyId }).subscribe(response => { // response.id contains the application ID }); } updateApplicationStatus(applicationId: string) { this.applicationApi.updateStatus({ id: applicationId, status: 'HIRED' }).subscribe(() => { // Application status updated }); } } ``` ### Using the Account Module ```typescript import { Component, inject } from '@angular/core'; import { OrganizationApiService } from '@jobgoal/sdk-angular-gcloud/account'; @Component({ selector: 'app-organization-manager', template: `...` }) export class OrganizationManagerComponent { private orgApi = inject(OrganizationApiService); readOrganization(orgId: string) { this.orgApi.read(orgId) .subscribe(org => { // Use organization data }); } createOrganization() { this.orgApi.create({ organization_name: 'ACME Corp', organization_kvk: '12345678', entity_legal_form: 'BV', address: { street: '123 Business Ave', city: 'Amsterdam', postal_code: '1012AB', country: 'NL' }, correspondence_email: 'info@acme.com' }).subscribe(response => { // response.id contains the new organization ID }); } updateOrganization(orgId: string) { this.orgApi.patch({ id: orgId, organization_name: 'ACME Corporation', correspondence_email: 'contact@acme.com' }).subscribe(() => { // Organization updated }); } deleteOrganization(orgId: string) { this.orgApi.delete(orgId) .subscribe(() => { // Organization deleted }); } } ``` ## Module Exports ### recruitment Module ```typescript import { VacancyApi, CandidateApi, ApplicationApi, recruitment_API_BASE_URL, // ... types } from '@jobgoal/sdk-angular-gcloud/recruitment'; ``` ### Account Module ```typescript import { OrganizationApiService, IDENTITY_API_BASE_URL, // ... types } from '@jobgoal/sdk-angular-gcloud/account'; ``` ## API Response Structure All API responses follow this structure: ```typescript interface ApiResponse<T> { data: T; problems: Problem[]; status_code: number; } interface Problem { severity: string; message: string; details: Problem[]; } ``` The SDK services automatically extract the `data` field from responses. ## Requirements - Angular 17.0.0 or 18.0.0+ - RxJS 7.5.0+ ## Development Build the library: ```bash npm install npm run build ``` Pack for local testing: ```bash npm run pack ``` ## Contributing See [VERSIONING.md](./VERSIONING.md) for information about: - Version management and semantic versioning - Automated deployment workflows - Change detection and publishing triggers - Manual version bumps and releases ## License MIT