import Model from "swaf/db/Model"; import Controller from "swaf/Controller"; import config from "config"; import User from "swaf/auth/models/User"; import {Request} from "express"; import URLRedirect from "./URLRedirect"; export default class FileModel extends Model { public static get table(): string { return 'files'; } public static async getBySlug(slug: string): Promise { return await this.select().where('slug', slug).first(); } public static async paginateForUser(req: Request, perPage: number, user_id: number): Promise { req.params.sortBy = 'created_at'; req.params.sortDirection = 'DESC'; return await this.paginate(req, perPage, this.select().where('user_id', user_id)); } public id?: number = undefined; public readonly user_id?: number = undefined; public readonly slug?: string = undefined; public readonly real_name?: string = undefined; public readonly storage_type?: FileStorage = undefined; public readonly storage_path?: string = undefined; public readonly size?: number = undefined; public created_at?: Date = undefined; public expires_at?: Date | null = undefined; /** * @deprecated */ public ttl?: number = undefined; protected init(): void { this.setValidation('user_id').defined().exists(User, 'id'); this.setValidation('slug').defined().minLength(1).maxLength(259) .unique(this, 'slug') .unique(URLRedirect, 'slug'); this.setValidation('real_name').defined().minLength(1).maxLength(259); this.setValidation('storage_type').defined().maxLength(64); this.setValidation('storage_path').defined().maxLength(1745); this.setValidation('size').defined().min(0); } public getURL(domain: string = config.get('public_url')): string { return (/^https?:\/\//.test(domain) ? '' : 'https://') + domain + Controller.route('get-file', { slug: this.getOrFail('slug'), }); } public shouldBeDeleted(): boolean { const expirationDate = this.expires_at; if (!expirationDate) return false; return new Date().getTime() >= expirationDate.getTime(); } public canDelete(user_id: number): boolean { return this.user_id === user_id; } } export type FileStorage = 'local';