var { apis } = global.mira; var log = require("../../lib/log"); var { getType } = require("../../lib/utils"); module.exports = async function ThreadDataBase(Client) { var ThreadShema = new Client.Schema({ threadID: { type: Client.Schema.Types.Decimal128, unique: true, required: true }, name: { type: String, required: true, validate: { validator: v => v && v.trim().length > 0, message: "Name must not be empty" } }, info: { type: Client.Schema.Types.Mixed, validate: { validator: function (v) { try { JSON.stringify(v); return true; } catch (e) { return false; } }, message: "Info must be a valid JSON object" } }, data: { type: Client.Schema.Types.Mixed, validate: { validator: function (v) { try { JSON.stringify(v); return true; } catch (e) { return false; } }, message: "Data must be a valid JSON object" } }, banAt: { type: Number, default: 0, validate: { validator: v => Number.isInteger(v) && v >= 0, message: "banAt must be a non-negative integer" } }, reason: { type: String, required: false, validate: { validator: v => (!v || v.trim().length > 0), message: "Reason must not be empty if providedy" } } }, { timestamps: true }); ThreadShema.pre("save", function (next) { this.updatedAt = Date.now(); next(); }); var Thread = Client.model("Thread", ThreadShema); function getAll() { return Thread.find(); } function find(conditions = {}) { if (getType(conditions) !== "Object") throw new Error("conditions must be an JSON Object."); return Thread.find(conditions); } async function getInfo(threadID) { if (isNaN(parseInt(threadID))) throw new Error("threadID must be a string number."); var infoObj = await apis.getThreadInfo(threadID); return infoObj; } async function findOne(threadID) { if (isNaN(parseInt(threadID))) throw new Error("threadID must be a string number."); var thread = await Thread.findOne({ threadID }); if (!thread) { await createData(threadID); thread = await findOne(threadID); } return thread; } async function createData(threadID) { var info = await getInfo(threadID); var infoObj = { threadID, name: info.name, money: 0, info, data: {}, banAt: 0, reason: null } delete infoObj.info.name; await Thread.findOneAndUpdate({ threadID }, infoObj, { upsert: true, new: true }); log.info("database.create.success", threadID); return; } async function setData(threadID, data) { if (isNaN(parseInt(threadID))) throw new Error("threadID must be a string number."); if (getType(data) !== "Object") throw new Error("data must be an JSON Object."); await Thread.updateOne({ threadID }, { $set: data }); return; } async function setDataAll(data, conditions = {}) { if (getType(conditions) !== "Object") throw new Error("conditions must be an JSON Object."); if (getType(data) !== "Object") throw new Error("data must be an JSON Object."); await Thread.updateMany(conditions, { $set: data }); return; } async function deleteThread(threadID) { if (isNaN(parseInt(threadID))) throw new Error("threadID must be a string number."); await Thread.deleteOne({ threadID }); return; } log.info("database.model", "Thread.mongodb"); return global.database.model.Thread = { getAll, find, findOne, setData, setDataAll, deleteThread } }