Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | 16x 16x 16x 16x 16x 16x 16x 16x 16x 16x 16x 16x | import Crowi from 'server/crowi' import { Types, Document, Model, Schema, model } from 'mongoose' import Debug from 'debug' import crypto from 'crypto' import FileUploader from '../util/fileUploader' export interface AttachmentDocument extends Document { _id: Types.ObjectId page: Types.ObjectId creator: Types.ObjectId filePath: string fileName: string originalName: string fileFormat: string fileSize: number createdAt: Date // virtual fileUrl: string // dynamic field url: string } export interface AttachmentModel extends Model<AttachmentDocument> { getListByPageId(id: Types.ObjectId): Promise<AttachmentDocument[]> guessExtByFileType(fileType: string): string createAttachmentFilePath(pageId: Types.ObjectId, fileName: string, fileType: string): string removeAttachmentsByPageId(pageId: Types.ObjectId): any findDeliveryFile(attachment: AttachmentDocument, forceUpdate?: boolean): any removeAttachment(attachment: AttachmentDocument): any } export default (crowi: Crowi) => { const debug = Debug('crowi:models:attachment') const fileUploader = FileUploader(crowi) function generateFileHash(fileName) { var hasher = crypto.createHash('md5') hasher.update(fileName) return hasher.digest('hex') } const attachmentSchema = new Schema<AttachmentDocument, AttachmentModel>( { page: { type: Schema.Types.ObjectId, ref: 'Page', index: true }, creator: { type: Schema.Types.ObjectId, ref: 'User', index: true }, filePath: { type: String, required: true }, fileName: { type: String, required: true }, originalName: { type: String }, fileFormat: { type: String, required: true }, fileSize: { type: Number, default: 0 }, createdAt: { type: Date, default: Date.now }, }, { toJSON: { virtuals: true, }, }, ) attachmentSchema.virtual('fileUrl').get(function(this: AttachmentDocument) { return `/files/${this._id}` }) attachmentSchema.statics.getListByPageId = function(id) { return Attachment.find({ page: id }) .sort({ updatedAt: 1 }) .populate('creator') .exec() } attachmentSchema.statics.guessExtByFileType = function(fileType) { let ext = '' const isImage = fileType.match(/^image\/(.+)/i) if (isImage) { ext = isImage[1].toLowerCase() } return ext } attachmentSchema.statics.createAttachmentFilePath = function(pageId, fileName, fileType) { let ext = '' const fnExt = fileName.match(/(.*)(?:\.([^.]+$))/) if (fnExt) { ext = '.' + fnExt[2] } else { ext = Attachment.guessExtByFileType(fileType) if (ext !== '') { ext = '.' + ext } } return 'attachment/' + pageId + '/' + generateFileHash(fileName) + ext } attachmentSchema.statics.removeAttachmentsByPageId = async function(pageId) { const attachments = await Attachment.getListByPageId(pageId) await Promise.all(attachments.map(attachment => Attachment.removeAttachment(attachment))) return attachments } attachmentSchema.statics.findDeliveryFile = function(attachment, forceUpdate) { // TODO forceUpdate = forceUpdate || false return fileUploader.findDeliveryFile(attachment._id, attachment.filePath) } attachmentSchema.statics.removeAttachment = async function(attachment) { const filePath = attachment.filePath await Attachment.deleteOne({ _id: attachment._id }) const data = await fileUploader.deleteFile(attachment._id, filePath) return data } const Attachment = model<AttachmentDocument, AttachmentModel>('Attachment', attachmentSchema) return Attachment } |