From a9d2bb4ab9cb7d3e604c59f6e9a556b20c887b3a Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Thu, 19 Jan 2017 11:50:31 +0000 Subject: [PATCH] Add Mod, database, and other initial improvements --- .gitignore | 1 + common/mod.js | 68 +++++++++++++++++++++++ package.json | 4 +- webapp/controllers/index.js | 14 +++-- webapp/index.js | 22 +++++--- webapp/models/database.js | 107 ++++++++++++++++++++++++++++++++++++ webapp/views/index.liquid | 11 +++- 7 files changed, 210 insertions(+), 17 deletions(-) create mode 100644 common/mod.js create mode 100644 webapp/models/database.js diff --git a/.gitignore b/.gitignore index cd44dde..6b025ce 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ downloads.txt reports.json downloads.json /data +*.sqlite # Created by https://www.gitignore.io/api/node,linux diff --git a/common/mod.js b/common/mod.js new file mode 100644 index 0000000..b9c91d6 --- /dev/null +++ b/common/mod.js @@ -0,0 +1,68 @@ +"use strict" + +var ModType = { + mod: "mod", + modpack: "modpack", + game: "game" +} + +class Mod { + constructor(author) { + this.author = author || null + this.type = "1" + this.basename = null + this.title = null + this.description = "" + this.forum_id = null + this.forum_url = null + + this.download = null + this.repo = null + this.approved = false + } + + getForumURL() { + return "https://forum.minetest.net/viewtopic.php?t=" + this.forum_id + } + + getIssues() { + var problems = [] + + if (!this.author) { + problems.append("needs forum author name") + } + + if (!this.basename) { + problems.append("needs basename") + } + + if (!this.title) { + problems.append("needs title (this should never happen)") + } + + if (!this.download_link) { + problems.append("needs download link") + } + + return { + problems: problems, + suggestions: [] + } + } + + toPlainDictionary() { + function isFunction(obj) { + return !!(obj && obj.constructor && obj.call && obj.apply) + } + + var res = {} + for (var key in this) { + if (this.hasOwnProperty(key) && !isFunction(this[key])) { + res[key] = this[key] + } + } + return res + } +} + +module.exports = Mod diff --git a/package.json b/package.json index 61dc39c..8f84af9 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "apicache": "^0.7.4", "body-parser": "^1.15.2", "express": "^4.14.0", - "express-liquid": "^0.2.6" + "express-liquid": "^0.2.6", + "sequelize": "^3.28.0", + "sqlite3": "^3.1.8" } } diff --git a/webapp/controllers/index.js b/webapp/controllers/index.js index b4d47dd..083e0a5 100644 --- a/webapp/controllers/index.js +++ b/webapp/controllers/index.js @@ -1,13 +1,19 @@ // Index controller - puts all the controllers together -"use strict"; +"use strict" const express = require("express") const router = express.Router() router.get("/", function(req, res) { - res.render("index", { - title: "Mod Developer Panel", - mods: [] + var db = req.app.get("db") + db.Mod.findAll({ + limit: 10, + include: [ db.User ] + }).then(function(mods) { + res.render("index", { + title: "Minetest Mod Database", + mods: mods.map(db.convertRowToMod) + }) }) }) diff --git a/webapp/index.js b/webapp/index.js index 87a5c35..6d62546 100644 --- a/webapp/index.js +++ b/webapp/index.js @@ -1,4 +1,4 @@ -"use strict"; +"use strict" require("process").chdir(__dirname) @@ -19,8 +19,8 @@ var expressLiquid = require("express-liquid") var options = { // read file handler, optional includeFile: function (filename, callback) { - var fs = require("fs"); - fs.readFile(filename, "utf8", callback); + var fs = require("fs") + fs.readFile(filename, "utf8", callback) }, // the base context, optional context: expressLiquid.newContext(), @@ -28,15 +28,19 @@ var options = { customTags: {}, // if an error occurred while rendering, show detail or not, default to false traceError: false -}; -app.set("view engine", "liquid"); -app.engine("liquid", expressLiquid(options)); -app.use(expressLiquid.middleware); +} +app.set("view engine", "liquid") +app.engine("liquid", expressLiquid(options)) +app.use(expressLiquid.middleware) + +// Database +const db = require("./models/database") +app.set("db", db) // Controllers app.use(require("./controllers")) // Start server app.listen(8080, "127.0.0.1", function () { - console.log("Minetest Mod Database listening on port 8080!"); -}); + console.log("Minetest Mod Database listening on port 8080!") +}) diff --git a/webapp/models/database.js b/webapp/models/database.js new file mode 100644 index 0000000..6e71341 --- /dev/null +++ b/webapp/models/database.js @@ -0,0 +1,107 @@ +var Sequelize = require("sequelize") +var async = require("async") + +var sequelize = new Sequelize("database", "", "", { + dialect: "sqlite", + pool: { + max: 5, + min: 0, + idle: 10000 + }, + + // SQLite only + storage: "../db.sqlite" +}) + +var User = sequelize.define("user", { + username: { type: Sequelize.STRING(100), unique: true } +}) + +var Mod = sequelize.define("mod", { + basename: Sequelize.STRING(100), + + title: Sequelize.STRING(100), + description: Sequelize.STRING(900), + forum_id: Sequelize.STRING(40), + + download_url: Sequelize.STRING(250), + download_hash: Sequelize.STRING(256), + download_size: Sequelize.INTEGER, + + repo_url: Sequelize.STRING(250), + repo_hash: Sequelize.STRING(250), + + approved: Sequelize.BOOLEAN +}) + +User.hasMany(Mod) +Mod.belongsTo(User) + +const CMod = require("./../../common/mod") +function convertRowToMod(row) { + var mod = new CMod(row.user.username) + mod.basename = row.basename + mod.title = row.title + mod.description = row.description + mod.forum_id = row.forum_id + mod.forum_url = mod.getForumURL() + mod.download = { + url: row.download_url, + hash: row.download_hash || "", + size: row.download_size || -1 + } + mod.repo = { + url: row.repo, + hash: row.repo_hash + } + mod.approved = row.approved + + return mod +} + +async.parallel([ + function(callback) { User.sync().then(callback) }, + function(callback) { Mod.sync().then(callback) }, + function() { + User.findOrCreate({ + where: { + username: "rubenwardy" + }, + defaults: {} + }).then(function(user) { + user = user[0] + + var assert = require("assert") + assert(user.id) + Mod.findOrCreate({ + where: { + basename: "awards", + userId: user.id + }, + defaults: { + user: user, + + title: "Awards", + description: "Adds awards to minetest", + forum_id: "4870", + + download_url: "https://github.com/minetest-mods/awards/zipball/master", + download_hash: "", + download_size: -1, + + repo_url: "https://github.com/minetest-mods/awards/", + repo_hash: "c994978683355417783586262914d4be128cbdf0", + + approved: true + } + }).then(function(mod) { + + }) + }) + }]) + +module.exports = { + User: User, + Mod: Mod, + convertRowToMod: convertRowToMod +} diff --git a/webapp/views/index.liquid b/webapp/views/index.liquid index 83fd9ed..34219dc 100644 --- a/webapp/views/index.liquid +++ b/webapp/views/index.liquid @@ -15,13 +15,18 @@ {% for mod in mods %}
  • {{ forloop.index }}) - {{ mod.title }} by {{ mod.author }}
    + + {{ mod.title }} + by + {{ mod.author }} +
    +

    {{ mod.description | truncate: 100, '…' }}

    - Download [{{ mod.downloads }}] | + Download | Forum Topic | - {{ mod.author }}'s mods + {{ mod.author }}'s mods
  • {% endfor %}