This repository has been archived on 2025-12-28. You can view files and clone it, but cannot push or open issues or pull requests.
inkletblot-com-v2/src/app/projects/projects.service.ts
2021-06-06 13:27:11 +09:30

111 lines
3.5 KiB
TypeScript

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { BehaviorSubject } from 'rxjs';
import { Project } from '../shared/models/project.model';
@Injectable({
providedIn: 'root'
})
export class ProjectsService {
private _allProjects = new BehaviorSubject<Array<Project>>([]);
readonly allProjects$ = this._allProjects.asObservable();
private set allProjects(projects: Array<Project>) {
this._allProjects.next(projects);
}
private get allProjects(): Array<Project> {
return this._allProjects.getValue();
}
private _currentProject = new BehaviorSubject<Project>(null);
readonly currentProject$ = this._currentProject.asObservable();
private set currentProject(project: Project) {
this._currentProject.next(project);
}
private get currentProject(): Project {
return this._currentProject.getValue();
}
private _apiErrored = new BehaviorSubject<boolean>(false);
readonly apiErrored$ = this._apiErrored.asObservable();
private set apiErrored(errored: boolean) {
this._apiErrored.next(errored);
}
private get apiErrored(): boolean {
return this._apiErrored.getValue();
}
/**
* I am actively avoiding any kind of environment management, this is a very basic site and currently this is the only api call.
*/
private PROJECT_API_URL = "https://cms.inkletblot.com"
constructor(private http: HttpClient, private router: Router) { }
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'text/plain'
})
};
getProjects(): void {
this.http
.get(`${this.PROJECT_API_URL}/posts`, this.httpOptions)
.subscribe(
(response: Project[]) => {
if (response) {
// using text/plain so as to not get the preflight options request
// as such : Project[] does not work as expected and objects must be parsed.
this.allProjects = response;
// filter out different categories here currently only one
}
},
(error) => {
this.apiErrored = true;
}
);
}
getSingleProject(id: string): void {
this.http
.get(`${this.PROJECT_API_URL}/post/${id}`, this.httpOptions)
.subscribe(
(response: Project) => {
if (response) {
// using text/plain so as to not get the preflight options request
// as such : Project[] does not work as expected and objects must be parsed.
this.currentProject = response;
// filter out different categories here currently only one
}
},
(error) => {
this.apiErrored = true;
this.router.navigate(['not-found'])
}
);
}
/**
* This is not very efficient code but I'm not planning on having that many projects and (if this turns into a blog) blog posts
* If this does become a general blog, then I will make this a bit more efficient.
* @param id slug of project to get
*/
getProject(id: string): void {
let found = false;
this.allProjects.forEach((project) => {
if (project.slug === id) {
found = true;
this.currentProject = project;
}
})
if (!found) {
this.getSingleProject(id)
}
}
}