diff --git a/models-built/contest_player.js b/models-built/contest_player.js index e28c5b1..a30f2a7 100644 --- a/models-built/contest_player.js +++ b/models-built/contest_player.js @@ -138,7 +138,7 @@ var ContestPlayer = /** @class */ (function (_super) { if (this.score_details[judge_state.problem_id] && this.score_details[judge_state.problem_id].judge_id > judge_state.id) return [2 /*return*/]; this.score_details[judge_state.problem_id] = { - score: this.score_details[judge_state.problem_id] ? Math.max(judge_state.score, this.score_details[judge_state.problem_id].score) : judge_state.score, + score: Math.max(judge_state.score, this.score_details[judge_state.problem_id].score), judge_id: judge_state.id }; this.score = 0; @@ -230,4 +230,4 @@ var ContestPlayer = /** @class */ (function (_super) { return ContestPlayer; }(common_1["default"])); exports["default"] = ContestPlayer; -//# sourceMappingURL=contest_player.js.map \ No newline at end of file +//# sourceMappingURL=contest_player.js.map diff --git a/models-built/contest_player.js.map b/models-built/contest_player.js.map deleted file mode 100644 index 873e336..0000000 --- a/models-built/contest_player.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"contest_player.js","sourceRoot":"","sources":["../models/contest_player.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAmC;AACnC,mCAA6B;AAE7B,+BAA0B;AAC1B,qCAAgC;AAGhC;IAA2C,iCAAK;IAAhD;;IAoIA,CAAC;sBApIoB,aAAa;IA0BnB,2BAAa,GAA1B,UAA2B,KAAK;;;gBAC9B,sBAAO,eAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAC;;;KAChD;IAEK,yCAAiB,GAAvB;;;;;;wBACE,KAAA,IAAI,CAAA;wBAAQ,qBAAM,iBAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAA;;wBAA7C,GAAK,IAAI,GAAG,SAAiC,CAAC;wBAC9C,KAAA,IAAI,CAAA;wBAAW,qBAAM,oBAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAA;;wBAAtD,GAAK,OAAO,GAAG,SAAuC,CAAC;;;;;KACxD;IAEK,mCAAW,GAAjB,UAAkB,WAAW;;;;;4BAC3B,qBAAM,IAAI,CAAC,iBAAiB,EAAE,EAAA;;wBAA9B,SAA8B,CAAC;wBAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE;4BAC/B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;gCACxB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;oCAC/C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG;wCAC3C,KAAK,EAAE,WAAW,CAAC,KAAK;wCACxB,QAAQ,EAAE,WAAW,CAAC,EAAE;wCACxB,WAAW,EAAE,EAAE;qCAChB,CAAC;iCACH;gCAED,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG;oCACvE,QAAQ,EAAE,WAAW,CAAC,EAAE;oCACxB,KAAK,EAAE,WAAW,CAAC,KAAK;oCACxB,IAAI,EAAE,WAAW,CAAC,WAAW;iCAC9B,CAAC;gCAEE,GAAG,GAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;gCACrF,GAAG,CAAC,IAAI,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAf,CAAe,CAAC,CAAC;gCAEhC,kBAAkB,GAAG,IAAI,CAAC;gCAC9B,WAAiB,EAAH,WAAG,EAAH,iBAAG,EAAH,IAAG,EAAE;oCAAV,CAAC;oCACR,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,GAAG,GAAG,EAAE;wCAChG,kBAAkB,GAAG,CAAC,CAAC;qCACxB;iCACF;gCAED,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC;gCAClF,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC;gCAC5E,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;gCAE1E,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gCACf,KAAS,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;oCAChC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;wCACpB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;iCAC7C;6BACF;yBACF;6BAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE;4BACtC,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE;gCAAE,sBAAO;4BAC/H,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG;gCAC3C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK;gCACrJ,QAAQ,EAAE,WAAW,CAAC,EAAE;6BACzB,CAAC;4BAEF,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;4BACf,KAAS,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;gCAChC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;oCACpB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;6BAC7C;yBACF;6BAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE;4BACtC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;gCACxB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;oCAC/C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG;wCAC3C,QAAQ,EAAE,KAAK;wCACf,eAAe,EAAE,CAAC;wCAClB,YAAY,EAAE,CAAC;wCACf,QAAQ,EAAE,CAAC;wCACX,WAAW,EAAE,EAAE;qCAChB,CAAC;iCACH;gCAED,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG;oCACvE,QAAQ,EAAE,WAAW,CAAC,EAAE;oCACxB,QAAQ,EAAE,WAAW,CAAC,MAAM,KAAK,UAAU;oCAC3C,QAAQ,EAAE,WAAW,CAAC,KAAK,IAAI,IAAI;oCACnC,IAAI,EAAE,WAAW,CAAC,WAAW;iCAC9B,CAAC;gCAEE,GAAG,GAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;gCACrF,GAAG,CAAC,IAAI,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAf,CAAe,CAAC,CAAC;gCAEpC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC;gCAC/D,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;gCACxD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;gCACxD,WAAiB,EAAH,WAAG,EAAH,iBAAG,EAAH,IAAG,EAAE;oCAAV,CAAC;oCACR,IAAI,CAAC,CAAC,QAAQ,EAAE;wCACd,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;wCAC3D,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;wCACjE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;wCACjE,MAAM;qCACP;yCAAM,IAAI,CAAC,CAAC,QAAQ,EAAE;wCACrB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;qCAC9D;iCACF;gCAED,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;oCACxD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;iCACpF;gCAED,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gCACf,KAAS,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;oCAChC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ;wCAAE,IAAI,CAAC,KAAK,EAAE,CAAC;iCAClD;6BACF;yBACF;;;;;KACF;;IAlIM,mBAAK,GAAG,IAAI,CAAC;IAGpB;QADC,OAAO,CAAC,sBAAsB,EAAE;;qCACtB;IAIX;QAFC,OAAO,CAAC,KAAK,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;6CACjC;IAInB;QAFC,OAAO,CAAC,KAAK,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0CACpC;IAGhB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCACtC;IAGd;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDACxC;IAGtB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;6CACjC;IArBA,aAAa;QADjC,OAAO,CAAC,MAAM,EAAE;OACI,aAAa,CAoIjC;IAAD,oBAAC;CAAA,AApID,CAA2C,mBAAK,GAoI/C;qBApIoB,aAAa"} \ No newline at end of file diff --git a/models-built/new_reply.js b/models-built/new_reply.js new file mode 100644 index 0000000..1197029 --- /dev/null +++ b/models-built/new_reply.js @@ -0,0 +1,144 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + 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) : new P(function (resolve) { resolve(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 }; + } +}; +exports.__esModule = true; +var TypeORM = require("typeorm"); +var common_1 = require("./common"); +var user_1 = require("./user"); +var article_1 = require("./article"); +var NewReply = /** @class */ (function (_super) { + __extends(NewReply, _super); + function NewReply() { + return _super !== null && _super.apply(this, arguments) || this; + } + NewReply.prototype.loadRelationships = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _a = this; + return [4 /*yield*/, user_1["default"].findById(this.from_user_id)]; + case 1: + _a.user = _c.sent(); + _b = this; + return [4 /*yield*/, article_1["default"].findById(this.article_id)]; + case 2: + _b.article = _c.sent(); + return [2 /*return*/]; + } + }); + }); + }; + NewReply.prototype.isAllowedEditBy = function (user) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.loadRelationships()]; + case 1: + _a.sent(); + return [2 /*return*/, user && (user.is_admin || this.from_user_id === user.id || user.id === this.article.user_id)]; + } + }); + }); + }; + NewReply.cache = false; + __decorate([ + TypeORM.PrimaryGeneratedColumn(), + __metadata("design:type", Number) + ], NewReply.prototype, "id"); + __decorate([ + TypeORM.Column({ nullable: true, type: "mediumtext" }), + __metadata("design:type", String) + ], NewReply.prototype, "content"); + __decorate([ + TypeORM.Column({ nullable: true, type: "integer" }), + __metadata("design:type", Number) + ], NewReply.prototype, "article_id"); + __decorate([ + TypeORM.Column({ nullable: true, type: "integer" }), + __metadata("design:type", Number) + ], NewReply.prototype, "from_user_id"); + __decorate([ + TypeORM.Column({ nullable: true, type: "integer" }), + __metadata("design:type", Number) + ], NewReply.prototype, "to_user_id"); + __decorate([ + TypeORM.Column({ nullable: true, type: "integer" }), + __metadata("design:type", Number) + ], NewReply.prototype, "parent_id"); + __decorate([ + TypeORM.Column({ nullable: true, type: "boolean", "default": true }), + __metadata("design:type", Boolean) + ], NewReply.prototype, "is_show"); + __decorate([ + TypeORM.Column({ nullable: true, type: "integer" }), + __metadata("design:type", Number) + ], NewReply.prototype, "public_time"); + __decorate([ + TypeORM.Column({ nullable: true, type: "integer" }), + __metadata("design:type", Number) + ], NewReply.prototype, "update_time"); + NewReply = __decorate([ + TypeORM.Entity() + ], NewReply); + return NewReply; +}(common_1["default"])); +exports["default"] = NewReply; +; +//# sourceMappingURL=new_reply.js.map \ No newline at end of file diff --git a/models-built/new_reply.js.map b/models-built/new_reply.js.map new file mode 100644 index 0000000..3d0a326 --- /dev/null +++ b/models-built/new_reply.js.map @@ -0,0 +1 @@ +{"version":3,"file":"new_reply.js","sourceRoot":"","sources":["../models/new_reply.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAmC;AACnC,mCAA6B;AAC7B,+BAA0B;AAC1B,qCAAgC;AAIhC;IAAsC,4BAAK;IAA3C;;IA2CA,CAAC;IAVS,oCAAiB,GAAvB;;;;;;wBACI,KAAA,IAAI,CAAA;wBAAQ,qBAAM,iBAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAA;;wBAAlD,GAAK,IAAI,GAAG,SAAsC,CAAC;wBACnD,KAAA,IAAI,CAAA;wBAAW,qBAAM,oBAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAA;;wBAAtD,GAAK,OAAO,GAAG,SAAuC,CAAC;;;;;KAC1D;IAEK,kCAAe,GAArB,UAAsB,IAAI;;;;4BACtB,qBAAM,IAAI,CAAC,iBAAiB,EAAE,EAAA;;wBAA9B,SAA8B,CAAC;wBAC/B,sBAAO,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAC;;;;KACvG;IAxCM,cAAK,GAAG,KAAK,CAAC;IAGrB;QADC,OAAO,CAAC,sBAAsB,EAAE;;gCACtB;IAGX;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;qCACvC;IAGhB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCACjC;IAGnB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0CAC/B;IAGrB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCACjC;IAGnB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;uCAClC;IAGlB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAO,EAAE,IAAI,EAAE,CAAC;;qCAClD;IAGjB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;yCAChC;IAGpB;QADC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;yCAChC;IA5BH,QAAQ;QAD5B,OAAO,CAAC,MAAM,EAAE;OACI,QAAQ,CA2C5B;IAAD,eAAC;CAAA,AA3CD,CAAsC,mBAAK,GA2C1C;qBA3CoB,QAAQ;AA2C5B,CAAC"} \ No newline at end of file diff --git a/models/new_reply.ts b/models/new_reply.ts new file mode 100644 index 0000000..6daf746 --- /dev/null +++ b/models/new_reply.ts @@ -0,0 +1,51 @@ +import * as TypeORM from "typeorm"; +import Model from "./common"; +import User from "./user"; +import Article from "./article"; +declare var syzoj: any; + +@TypeORM.Entity() +export default class NewReply extends Model { + static cache = false; + + @TypeORM.PrimaryGeneratedColumn() + id: number; + + @TypeORM.Column({ nullable: true, type: "mediumtext" }) + content: string; + + @TypeORM.Column({ nullable: true, type: "integer" }) + article_id: number; + + @TypeORM.Column({ nullable: true, type: "integer" }) + from_user_id: number; + + @TypeORM.Column({ nullable: true, type: "integer" }) + to_user_id: number; + + @TypeORM.Column({ nullable: true, type: "integer" }) + parent_id: number; + + @TypeORM.Column({ nullable: true, type: "boolean", default: true }) + is_show: boolean; + + @TypeORM.Column({ nullable: true, type: "integer" }) + public_time: number; + + @TypeORM.Column({ nullable: true, type: "integer" }) + update_time: number; + + user?: User; + article?: Article; + + async loadRelationships() { + this.user = await User.findById(this.from_user_id); + this.article = await Article.findById(this.article_id); + } + + async isAllowedEditBy(user) { + await this.loadRelationships(); + return user && (user.is_admin || this.from_user_id === user.id || user.id === this.article.user_id); + } + +}; diff --git a/modules/discussion.js b/modules/discussion.js index 028d25d..5a04656 100644 --- a/modules/discussion.js +++ b/modules/discussion.js @@ -3,6 +3,7 @@ let Article = syzoj.model('article'); let ArticleComment = syzoj.model('article-comment'); let User = syzoj.model('user'); let Reply = syzoj.model('reply'); +let NewReply = syzoj.model('new_reply'); app.get('/discussion/:type?', async (req, res) => { try { @@ -21,7 +22,7 @@ app.get('/discussion/:type?', async (req, res) => { let articles = await Article.queryPage(paginate, where, { sort_time: 'DESC' }); - + let newReplyQuery = await NewReply.createQueryBuilder(); for (let article of articles) { await article.loadRelationships(); if (in_problems) { @@ -77,40 +78,65 @@ app.get('/discussion/problem/:pid', async (req, res) => { app.get('/article/:id', async (req, res) => { try { let id = parseInt(req.params.id); - let replyQuery = await Reply.createQueryBuilder(); let article = await Article.findById(id); if (!article) throw new ErrorMessage('无此帖子。'); - + await article.loadRelationships(); article.allowedEdit = await article.isAllowedEditBy(res.locals.user); article.allowedComment = await article.isAllowedCommentBy(res.locals.user); article.content = await syzoj.utils.markdown(article.content); - + + let newReplyQuery = await NewReply.createQueryBuilder(); + let where = { article_id: id }; - let commentsCount = await ArticleComment.countForPagination(where); + let commentsCount = await NewReply.countForPagination(where); let paginate = syzoj.utils.paginate(commentsCount, req.query.page, syzoj.config.page.article_comment); - - let comments = await ArticleComment.queryPage(paginate, where, { - public_time: 'DESC' - }); - - for (let comment of comments) { - const commentId = comment.id; - const reply = await replyQuery.where("comment_id = :commentId", { commentId }).getMany(); - if (reply.length === 0) { - comment.reply = []; - } else { - comment.reply = await reply.mapAsync(async (item) => { - const replyUserId = item.user_id; - item.reply_user = await User.findById(replyUserId); - return item - }); + + let comments = await newReplyQuery.where('article_id=:id', {id}).getMany(); + + function arrayToTree(data){ + for(let i=0;iitem.id===data[i].parent_id); + if (info) { + if (!info.children) { + info.children=[data[i]]; + } else { + info.children.push(data[i]); + } + } + } } - comment.content = await syzoj.utils.markdown(comment.content); - comment.allowedEdit = await comment.isAllowedEditBy(res.locals.user); - await comment.loadRelationships(); + return data.filter(item=>!item.parent_id && item.is_show) } - + const originData = comments.filter(item => item.is_show); + const datas = arrayToTree(comments.filter(item => item.is_show)); + const rootIdArray = datas.map(item=>item.id); + const authorId = article.user_id; + let count = 0; + async function operate(data){ + for(let i=0;i { + return b.public_time - a.public_time; + }) + let problem = null; if (article.problem_id) { problem = await Problem.findById(article.problem_id); @@ -121,10 +147,11 @@ app.get('/article/:id', async (req, res) => { res.render('article', { user: res.locals.user, article: article, - comments: comments, + comments: datas, paginate: paginate, problem: problem, - commentsCount: commentsCount + commentsCount: count, + authorId }); } catch (e) { syzoj.log(e); @@ -213,15 +240,10 @@ app.post('/article/:id/delete', async (req, res) => { } else { if (!await article.isAllowedEditBy(res.locals.user)) throw new ErrorMessage('您没有权限进行此操作。'); } - - await Promise.all((await ArticleComment.find({ - article_id: article.id - })).map(comment => comment.destroy())); + let newReplyQuery = await NewReply.createQueryBuilder(); - await Promise.all((await Reply.find({ - article_id: article.id - })).map(reply => reply.destroy())); - + await newReplyQuery.delete().from(NewReply).where("article_id = :id", { id }).execute(); + await article.destroy(); res.redirect(syzoj.utils.makeUrl(['discussion', 'global'])); @@ -239,18 +261,21 @@ app.post('/article/:id/comment', async (req, res) => { let id = parseInt(req.params.id); let article = await Article.findById(id); - + let to_id = article.user_id; if (!article) { throw new ErrorMessage('无此帖子。'); } else { if (!await article.isAllowedCommentBy(res.locals.user)) throw new ErrorMessage('您没有权限进行此操作。'); } - let comment = await ArticleComment.create({ + let comment = await NewReply.create({ content: req.body.comment, article_id: id, - user_id: res.locals.user.id, - public_time: syzoj.utils.getCurrentDate() + from_user_id: res.locals.user.id, + to_user_id: to_id, + public_time: syzoj.utils.getCurrentDate(), + update_time: syzoj.utils.getCurrentDate(), + is_show: true }); await comment.save(); @@ -274,31 +299,29 @@ app.post('/article/:id/comment/:commentId', async (req, res) => { let commentId = parseInt(req.params.commentId); let userId = parseInt(res.locals.user.id); let article = await Article.findById(id); - let articleComment = await ArticleComment.findById(commentId); - - if (!articleComment) { - throw new ErrorMessage('无此回复。'); - } - if (!article) { throw new ErrorMessage('无此帖子。'); } else { if (!await article.isAllowedCommentBy(res.locals.user)) throw new ErrorMessage('您没有权限进行此操作。'); } + // let articleQuery = await Article.createQueryBuilder(); + // await articleQuery.update(Article).set({comments_num: article.comments_num + 1}).where("id = :id", { id }).execute(); + const toInfo = await NewReply.findById(commentId); - let newReply = await Reply.create({ + let newReply = await NewReply.create({ content: req.body.comment, article_id: id, - user_id: userId, - comment_id: commentId, + from_user_id: res.locals.user.id, + to_user_id: toInfo.from_user_id, + parent_id: commentId, public_time: syzoj.utils.getCurrentDate(), - update_time: syzoj.utils.getCurrentDate() + update_time: syzoj.utils.getCurrentDate(), + is_show: true }); - const reply = await newReply.save(); + await newReply.save(); await article.resetReplyCountAndTime(); - // res.redirect(syzoj.utils.makeUrl(['article', article.id])); } catch (e) { syzoj.log(e); @@ -308,27 +331,17 @@ app.post('/article/:id/comment/:commentId', async (req, res) => { } }); -app.post('/article/:article_id/comment/:id/delete', async (req, res) => { +app.post('/article/:articleId/comment/:id/delete', async (req, res) => { try { if (!res.locals.user) throw new ErrorMessage('请登录后继续。', { '登录': syzoj.utils.makeUrl(['login'], { 'url': req.originalUrl }) }); let id = parseInt(req.params.id); - let comment = await ArticleComment.findById(id); - let replyQuery = await Reply.createQueryBuilder(); - if (!comment) { - throw new ErrorMessage('无此评论。'); - } else { - if (!await comment.isAllowedEditBy(res.locals.user)) throw new ErrorMessage('您没有权限进行此操作。'); - } - - const article = await Article.findById(comment.article_id); - - await comment.destroy(); - await replyQuery.delete().from(Reply).where("comment_id = :id", { id }).execute(); - - await article.resetReplyCountAndTime(); + let articleId = parseInt(req.params.articleId); + let replyQuery = await NewReply.createQueryBuilder(); + await replyQuery.update(NewReply).set({is_show: 0}).where("id = :id", { id }).execute(); + - res.redirect(syzoj.utils.makeUrl(['article', comment.article_id])); + res.redirect(syzoj.utils.makeUrl(['article', articleId])); } catch (e) { syzoj.log(e); res.render('error', { diff --git a/views/article.ejs b/views/article.ejs index 2b2a7a3..d895d6b 100644 --- a/views/article.ejs +++ b/views/article.ejs @@ -16,8 +16,16 @@ .article-comment:hover{ color: rgba(0,0,0,.8); } +.border{ + padding-bottom: 10px !important; + border-bottom: 1px solid #DEDEDF !important; +} +.border:last-child{ + border-bottom: none !important; +} -
+ +
+ + <% } %>
+ + + <% include footer %>