import { Record } from 'immutable' import axios from 'axios' const ExperimentRecord = Record({ id: 0, projectId: 0, name: '', config: {}, isActive: false, createdAt: '', updatedAt: '', metrics: {} }) export class Experiment extends ExperimentRecord { static get (projectId, id) { return new Promise((resolve, reject) => { axios.get(`/api/projects/${projectId}/experiments/${id}`) .then((res) => { const experiment = Experiment.fromResponse(res.data) resolve(experiment) return experiment }) .catch((err) => reject(err)) }) } static getAll (projectId) { return new Promise((resolve, reject) => { axios.get(`/api/projects/${projectId}/experiments`) .then((res) => { const experiments = res.data.experiments.map(Experiment.fromResponse) resolve(experiments) return experiments }) .catch((err) => reject(err)) }) } static create (projectId, name, config, progressCallback = () => {}) { const axiosConfig = { onUploadProgress: progressCallback } const data = { project_id: projectId, name: name, config: config } return new Promise((resolve, reject) => { axios.post(`/api/projects/${projectId}/experiments`, data, axiosConfig) .then((res) => { const experiment = Experiment.fromResponse(res.data) resolve(experiment) return experiment }) .catch((err) => reject(err)) }) } delete () { const url = `/api/projects/${this.projectId}/experiments/${this.id}` return axios.delete(url) } update () { const url = `/api/projects/${this.projectId}/experiments/${this.id}` return axios.put(url, this.toRequest()) } cancel () { const url = `/api/projects/${this.projectId}/experiments/${this.id}/cancel` return axios.post(url, this.toRequest()) } downloadPolicy (epoch, format) { const { projectId, id } = this const url = `/api/projects/${projectId}/experiments/${id}/download` window.location.href = `${url}?epoch=${epoch}&format=${format}` } static fromResponse (data) { const experiment = new Experiment({ id: data.id, projectId: data.project_id, name: data.name, config: JSON.parse(data.config), isActive: data.is_active, createdAt: data.created_at, updatedAt: data.updated_at, metrics: data.metrics }) return experiment } toRequest () { return { id: this.id, project_id: this.projectId, name: this.name } } }