mirror of
https://github.com/morten-olsen/morten-olsen.github.io.git
synced 2026-02-08 01:46:28 +01:00
83 lines
1.8 KiB
TypeScript
83 lines
1.8 KiB
TypeScript
|
|
import fs from 'fs-extra';
|
|
import path from 'path';
|
|
import { Service } from 'typedi';
|
|
import yaml from 'yaml';
|
|
import { AssetResolver } from '../assets';
|
|
|
|
export type Profile = {
|
|
name: string;
|
|
avatar?: string | null;
|
|
email?: string;
|
|
github?: string;
|
|
location?: string;
|
|
tagline?: string;
|
|
resume: string;
|
|
social: {
|
|
name: string;
|
|
value: string;
|
|
link: string;
|
|
logo: string;
|
|
}[];
|
|
resumeImage?: string;
|
|
platforms: {
|
|
name: string;
|
|
level: number;
|
|
}[];
|
|
skills: {
|
|
name: string;
|
|
level: number;
|
|
}[];
|
|
}
|
|
|
|
@Service()
|
|
export class ProfileDB {
|
|
#profile: Promise<Profile>;
|
|
#assets: AssetResolver;
|
|
|
|
constructor(
|
|
assets: AssetResolver,
|
|
) {
|
|
this.#assets = assets;
|
|
this.#profile = this.#load();
|
|
}
|
|
|
|
#load = async () => {
|
|
const rootLocation = path.join(process.cwd(), 'content', 'profile');
|
|
const structureLocation = path.join(rootLocation, 'index.yml');
|
|
const structureContent = await fs.readFile(structureLocation, 'utf-8');
|
|
const structure = yaml.parse(structureContent) as Profile;
|
|
if (structure.avatar) {
|
|
const image = this.#assets.getPath(
|
|
'profile',
|
|
structure.avatar,
|
|
);
|
|
structure.avatar = image || null;
|
|
}
|
|
if (structure.resumeImage) {
|
|
const image = this.#assets.getPath(
|
|
'profile',
|
|
structure.resumeImage,
|
|
)
|
|
structure.resumeImage = image || null;
|
|
}
|
|
structure.social = structure.social.map((social) => {
|
|
const image = this.#assets.getPath('profile', social.logo);
|
|
return {
|
|
...social,
|
|
logo: image || null,
|
|
};
|
|
})
|
|
structure.resume = this.#assets.getPath(
|
|
'profile',
|
|
'a4.gen.yml',
|
|
) || null;
|
|
return structure;
|
|
}
|
|
|
|
public get = async () => {
|
|
const profile = await this.#profile;
|
|
return profile;
|
|
};
|
|
}
|