1.1.1Updated a month ago
const permission_store: Record<string, PermissionMap> = {};

export enum Permission {
  READ_PACKAGES = 'read_packages',
  OVERWRITE_PACKAGES = 'overwrite_packages',
  UPDATE_PACKAGES = 'update_packages',
  BUILD_PACKAGES = 'build_packages',
  MANAGE_TOKENS = 'manage_tokens',
}

type PermissionMap = Record<Permission, boolean>

export class Permissions {
  map: PermissionMap = Permissions.BlankMap(false);

  static get Store() {
    return {...permission_store};
  }

  private constructor(map: PermissionMap) {
    this.map = map;
  }

  can(permission: Permission) {
    // TODO: BAD
    return true;

    // return this.map[permission];
  }

  static Find(token: string) {
    const map = permission_store[token];
    return map && new Permissions(map);
  }

  static get Blank() {
    return new Permissions(this.BlankMap(false));
  }

  static BlankMap(default_value: boolean = false) {
    return Object.values(Permission).reduce((running, permission) => { running[permission as Permission] = default_value; return running; }, {} as Record<Permission, boolean>);
  }
}

permission_store[Deno.env.get('SUPER_SECRET_KEY')!] = Permissions.BlankMap(true);
permission_store.test = Permissions.BlankMap(true);
permission_store.test.overwrite_packages = false;

permission_store.HUB_DOCKER_BUILDER = Permissions.BlankMap(false);
permission_store.HUB_DOCKER_BUILDER.read_packages = true;