"use strict";
/*
Supported proxy schema should be mostly consistent with (and an extension of) nbviewer.org:

`url/example.com/thingy...` or `gist/user/id` or `github/owner/repo...`, etc.

Three options handled right now; anything else is an error.  The path must uniquely determine
what is publicly shared (at some unit), and it's nice if it is useful (e.g., for url's and gists).

- github/cocalc/sagemathinc/... --> 'github/cocalc/sagemathinc'; i.e., the github repo maps 1:1 to cocalc public path.
- gist/darribas/4121857 --> 'gist/4121857/guardian_gaza.ipynb'; here guardian_gaza.ipynb is the first filename hosted
  in the gist, and requires api call to github to get it. This uniquely determines the gist *and* tells us what type of file
  it contains so we can render it.
- url/wstein.org/Tables/modjac/curves.txt --> 'url/wstein.org/Tables/modjac/curves.txt'; path equals the url, since this is
  completely generic and there is nothing further we could do.

*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.shouldUseProxy = void 0;
const project_1 = __importDefault(require("lib/share/proxy/project"));
const pool_1 = __importDefault(require("@cocalc/database/pool"));
const sha1 = __importStar(require("sha1"));
const api_1 = require("./api");
function shouldUseProxy(owner) {
    return owner == "github" || owner == "gist";
}
exports.shouldUseProxy = shouldUseProxy;
const QUERY = `SELECT id, project_id, path, url, description, counter::INT, last_edited,
    (SELECT COUNT(*)::INT FROM public_path_stars WHERE public_path_id=id) AS stars
    FROM public_paths WHERE `;
async function getProxyPublicPath({ id, project_id, path, url, description, }) {
    const pool = (0, pool_1.default)("short");
    if (id != null) {
        // id is given, so return public_path with that id, if there is one.
        const { rows } = await pool.query(QUERY + " id = $1", [id]);
        if (rows.length > 0) {
            return rows[0];
        }
    }
    if (url != null) {
        // url is given, so return public_path with that url, if already known.
        const { rows } = await pool.query(QUERY + " url = $1", [url]);
        if (rows.length > 0) {
            return rows[0];
        }
    }
    if (project_id == null) {
        // this is the unique project used for all url proxying functionality; if not given,
        // we just look it up for convenience.
        project_id = await (0, project_1.default)();
    }
    if (id == null && path != null) {
        // if id not given but path is, then we can compute the id from project_id and path, since it's derived from them.
        id = sha1(project_id + path);
        // try based on the id, which we now know:
        const { rows } = await pool.query(QUERY + " id = $1", [id]);
        if (rows.length > 0) {
            return rows[0];
        }
    }
    // We need to create this public_path and return that.
    if (!url) {
        // There is no possible way to create a public_path associated to
        // proxying a URL without knowing the URL.
        throw Error("url must be specified in order to create public_path");
    }
    // We can assume url is known.
    if (path == null) {
        path = await getPath(url);
    }
    if (id == null) {
        id = sha1(project_id + path);
    }
    if (id == null)
        throw Error("bug"); // not possible.
    // It could still be that the path with this id is in the database.
    // Example is gist/4121857 and gist/darribas/4121857 resolve to same record,
    // but initial search for 'gist/4121857' does not find anything.
    // id is given, so return public_path with that id, if there is one.
    const { rows } = await pool.query(QUERY + " id = $1", [id]);
    if (rows.length > 0) {
        return rows[0];
    }
    let publicPathUrl;
    if (url.startsWith("github/")) {
        // URL to the repository, not the exact path being requested.
        publicPathUrl = url.split("/").slice(0, 3).join("/");
    }
    else {
        publicPathUrl = url;
    }
    const now = new Date();
    await pool.query("INSERT INTO public_paths (id, url, project_id, path, description, last_edited, last_saved, created) VALUES($1, $2, $3, $4, $5, $6, $7, $8)", [id, publicPathUrl, project_id, path, description, now, now, now]);
    return {
        id,
        url,
        project_id,
        path,
        description,
        last_edited: now,
        counter: 0,
        stars: 0,
    };
}
exports.default = getProxyPublicPath;
async function getPath(url) {
    if (url.startsWith("github/")) {
        const v = url.split("/");
        if (v.length < 3) {
            throw Error(`invalid url - ${url} - must at least specify repo`);
        }
        return v.slice(0, 3).join("/");
    }
    if (url.startsWith("url/")) {
        return url;
    }
    if (url.startsWith("gist/")) {
        const v = url.split("/");
        return await (0, api_1.fileInGist)(v.length >= 3 ? v[2] : v[1]);
    }
    throw Error(`unknown proxy url schema -- ${url}`);
}
//# sourceMappingURL=get-public-path.js.map