"use strict";
/*
API endpoint to copy from a URL on the internet to a project.

This requires the user to be signed in with appropriate access to the project.

If project doesn't have network access, we stop the project, start it with
network access, get the content, then restart the project without network access.
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var get_account_1 = __importDefault(require("lib/account/get-account"));
var misc_1 = require("@cocalc/util/misc");
var is_collaborator_1 = __importDefault(require("@cocalc/server/projects/is-collaborator"));
var get_params_1 = __importDefault(require("lib/api/get-params"));
var call_1 = __importDefault(require("@cocalc/server/projects/connection/call"));
var get_proxied_public_path_info_1 = __importDefault(require("lib/share/proxy/get-proxied-public-path-info"));
function handle(req, res) {
    var _a;
    return __awaiter(this, void 0, void 0, function () {
        var params, error, project_id, url, path, account_id, info, i, filename, mesg, response, err_1;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    params = (0, get_params_1.default)(req, ["project_id", "url", "path", "timeout"]);
                    error = checkParams(params);
                    if (error) {
                        res.json({ error: error });
                        return [2 /*return*/];
                    }
                    project_id = params.project_id, url = params.url, path = params.path;
                    _b.label = 1;
                case 1:
                    _b.trys.push([1, 5, , 6]);
                    return [4 /*yield*/, (0, get_account_1.default)(req)];
                case 2:
                    account_id = _b.sent();
                    if (!account_id) {
                        throw Error("must be signed in");
                    }
                    if (!(0, is_collaborator_1.default)({ account_id: account_id, project_id: project_id })) {
                        throw Error("must be a collaborator on target project");
                    }
                    return [4 /*yield*/, (0, get_proxied_public_path_info_1.default)(url)];
                case 3:
                    info = _b.sent();
                    if (((_a = info.contents) === null || _a === void 0 ? void 0 : _a.content) == null) {
                        throw Error("copying of directories (e.g., GitHub repos) is not implemented");
                    }
                    i = url.lastIndexOf("/");
                    filename = url.slice(i + 1);
                    mesg = {
                        event: "write_text_file_to_project",
                        path: path ? path : filename,
                        content: info.contents.content,
                    };
                    return [4 /*yield*/, (0, call_1.default)({ project_id: project_id, mesg: mesg })];
                case 4:
                    response = _b.sent();
                    res.json({ response: response });
                    return [3 /*break*/, 6];
                case 5:
                    err_1 = _b.sent();
                    res.json({ error: "".concat(err_1.message) });
                    return [3 /*break*/, 6];
                case 6: return [2 /*return*/];
            }
        });
    });
}
exports.default = handle;
function checkParams(obj) {
    if (!obj.url)
        return "url must be specified";
    if (!(0, misc_1.isValidUUID)(obj.project_id))
        return "project_id must be a valid uuid";
}
//# sourceMappingURL=copy-url.js.map