TiddlyWiki5/core/modules/savers/gitea.js

137 wiersze
3.3 KiB
JavaScript

/*\
title: $:/core/modules/savers/gitea.js
type: application/javascript
module-type: saver
Saves wiki by pushing a commit to the gitea
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Select the appropriate saver module and set it up
*/
var GiteaSaver = function(wiki) {
this.wiki = wiki;
};
GiteaSaver.prototype.save = function(text,method,callback) {
var self = this,
username = this.wiki.getTiddlerText("$:/Gitea/Username"),
password = $tw.utils.getPassword("Gitea"),
repo = this.wiki.getTiddlerText("$:/Gitea/Repo"),
path = this.wiki.getTiddlerText("$:/Gitea/Path",""),
filename = this.wiki.getTiddlerText("$:/Gitea/Filename"),
branch = this.wiki.getTiddlerText("$:/Gitea/Branch") || "master",
endpoint = this.wiki.getTiddlerText("$:/Gitea/ServerURL") || "https://gitea",
headers = {
"Accept": "application/json",
"Content-Type": "application/json;charset=UTF-8",
"Authorization": "Basic " + window.btoa(username + ":" + password)
};
// Bail if we don't have everything we need
if(!username || !password || !repo || !path || !filename) {
return false;
}
// Make sure the path start and ends with a slash
if(path.substring(0,1) !== "/") {
path = "/" + path;
}
if(path.substring(path.length - 1) !== "/") {
path = path + "/";
}
// Compose the base URI
var uri = endpoint + "/repos/" + repo + "/contents" + path;
// Perform a get request to get the details (inc shas) of files in the same path as our file
$tw.utils.httpRequest({
url: uri,
type: "GET",
headers: headers,
data: {
ref: branch
},
callback: function(err,getResponseDataJson,xhr) {
var getResponseData,sha = "";
if(err && xhr.status !== 404) {
return callback(err);
}
var use_put = true;
if(xhr.status !== 404) {
getResponseData = JSON.parse(getResponseDataJson);
$tw.utils.each(getResponseData,function(details) {
if(details.name === filename) {
sha = details.sha;
}
});
if(sha === ""){
use_put = false;
}
}
var data = {
message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"),
content: $tw.utils.base64Encode(text),
sha: sha
};
$tw.utils.httpRequest({
url: endpoint + "/repos/" + repo + "/branches/" + branch,
type: "GET",
headers: headers,
callback: function(err,getResponseDataJson,xhr) {
if(xhr.status === 404) {
callback("Please ensure the branch in the Gitea repo exists");
}else{
data["branch"] = branch;
self.upload(uri + filename, use_put?"PUT":"POST", headers, data, callback);
}
}
});
}
});
return true;
};
GiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {
$tw.utils.httpRequest({
url: uri,
type: method,
headers: headers,
data: JSON.stringify(data),
callback: function(err,putResponseDataJson,xhr) {
if(err) {
return callback(err);
}
var putResponseData = JSON.parse(putResponseDataJson);
callback(null);
}
});
};
/*
Information about this saver
*/
GiteaSaver.prototype.info = {
name: "Gitea",
priority: 2000,
capabilities: ["save", "autosave"]
};
/*
Static method that returns true if this saver is capable of working
*/
exports.canSave = function(wiki) {
return true;
};
/*
Create an instance of this saver
*/
exports.create = function(wiki) {
return new GiteaSaver(wiki);
};
})();