undergroundwires/privacy.sexy

View on GitHub
src/domain/Project/GitHubProjectDetails.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { assertInRange } from '@/application/Common/Enum';
import { OperatingSystem } from '../OperatingSystem';
import { Version } from '../Version';
import type { ProjectDetails } from './ProjectDetails';

export class GitHubProjectDetails implements ProjectDetails {
  public readonly repositoryWebUrl: string;

  constructor(
    public readonly name: string,
    public readonly version: Version,
    public readonly slogan: string,
    public readonly repositoryUrl: string,
    public readonly homepage: string,
  ) {
    if (!name) {
      throw new Error('name is undefined');
    }
    if (!slogan) {
      throw new Error('undefined slogan');
    }
    if (!repositoryUrl) {
      throw new Error('repositoryUrl is undefined');
    }
    if (!homepage) {
      throw new Error('homepage is undefined');
    }
    this.repositoryWebUrl = getWebUrl(this.repositoryUrl);
  }

  public getDownloadUrl(os: OperatingSystem): string {
    const fileName = getFileName(os, this.version.toString());
    return `${this.repositoryWebUrl}/releases/download/${this.version}/${fileName}`;
  }

  public get feedbackUrl(): string {
    return `${this.repositoryWebUrl}/issues`;
  }

  public get releaseUrl(): string {
    return `${this.repositoryWebUrl}/releases/tag/${this.version}`;
  }
}

function getWebUrl(gitUrl: string) {
  if (gitUrl.endsWith('.git')) {
    return gitUrl.substring(0, gitUrl.length - 4);
  }
  return gitUrl;
}

function getFileName(os: OperatingSystem, version: string): string {
  assertInRange(os, OperatingSystem);
  switch (os) {
    case OperatingSystem.Linux:
      return `privacy.sexy-${version}.AppImage`;
    case OperatingSystem.macOS:
      return `privacy.sexy-${version}.dmg`;
    case OperatingSystem.Windows:
      return `privacy.sexy-Setup-${version}.exe`;
    default:
      throw new RangeError(`Unsupported os: ${OperatingSystem[os]}`);
  }
}