project.ts 3.28 KB
import { AttributeData, QueryForParams, ServiceResponse } from '@/types/global';

import axios, { AxiosRequestConfig } from 'axios';
import FileSaver from 'file-saver';
import { Project, User, UserDynamics } from '@/utils/model';

type ProjectList = Project & {
  activity_count: number;
  activity_up_count: number;
  activity_match_count: number;
  activity_down_count: number;
  activity_send_count: number;
  manage_count: number;
};

export default class useProjectApi {
  static promoteStatusOption = [
    { label: '否', value: 0 },
    { label: '是', value: 1 },
  ];

  static publicStatusOption = [
    { label: '否', value: 1 },
    { label: '是', value: 0 },
  ];

  static applyStatusOption = [
    { label: '否', value: 0 },
    { label: '是', value: 1 },
  ];

  static manageStatusOption = [
    { label: '否', value: 0 },
    { label: '是', value: 1 },
  ];

  static statusOption = [
    { label: '启用', value: 1 },
    { label: '禁用', value: 0 },
  ];

  static get(params?: QueryForParams): Promise<ServiceResponse<ProjectList[]>> {
    return axios.get('audition/projects', { params });
  }

  static async getExport(fileName: string, params?: QueryForParams) {
    const config = { params: { ...params, fetchType: 'excel' }, timeout: 60000, responseType: 'blob' } as AxiosRequestConfig;
    return axios.get('audition/projects', config).then(({ data }) => FileSaver.saveAs(data, `${fileName}.xlsx`));
  }

  static async create(data: Omit<Project, 'id'>): Promise<Project> {
    return axios.post('audition/projects', data).then((res) => Promise.resolve(res.data));
  }

  static async show(id: number): Promise<Project> {
    return axios.get(`/audition/projects/${id}`).then((res) => Promise.resolve(res.data));
  }

  static async update(id: number, data: AttributeData): Promise<Project> {
    return axios.put(`audition/projects/${id}`, data).then((res) => Promise.resolve(res.data));
  }

  static async changeStatus(id: number, status: 1 | 0) {
    return axios.put(`audition/projects/${id}/change-status`, { status });
  }

  static destroy(id: number) {
    return axios.delete(`audition/projects/${id}`);
  }

  static manageUsers(projectId: number, params?: QueryForParams): Promise<ServiceResponse<User[]>> {
    return axios.get(`/audition/projects/${projectId}/managers`, { params });
  }

  static memberUsers(projectId: number, params?: QueryForParams): Promise<ServiceResponse<User[]>> {
    return axios.get(`/audition/projects/${projectId}/members`, { params });
  }

  static outManageUsers(projectId: number, params?: QueryForParams): Promise<ServiceResponse<User[]>> {
    return axios.get(`/audition/projects/${projectId}/out-managers`, { params });
  }

  static destroyOutManageUsers(projectId: number, data = {}) {
    return axios.post(`/audition/projects/${projectId}/out-managers`, data);
  }

  static dynamics(id: number, params?: QueryForParams): Promise<ServiceResponse<UserDynamics[]>> {
    return axios.get(`/audition/projects/${id}/dynamics`, { params });
  }
}

export class useManagerApi {
  static async create(data: { user_id: number; project_id: number }): Promise<Project> {
    return axios.post('audition/project-managers', data).then((res) => Promise.resolve(res.data));
  }

  static destroy(id: number) {
    return axios.delete(`audition/project-managers/${id}`);
  }
}