From bb8c6763c2c9bfccd210d998e17eaa66aa20e593 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期二, 08 八月 2023 10:49:29 +0800
Subject: [PATCH] 增加文件下载和预览接口,并统计下载和预览次数

---
 service/file.go       |    9 
 api/v1/file.go        |  102 +++++++-
 model/request/file.go |    7 
 docs/swagger.yaml     |  129 ++++-------
 model/file.go         |    4 
 docs/docs.go          |  186 ++++++----------
 router/file.go        |    4 
 docs/swagger.json     |  186 ++++++----------
 8 files changed, 293 insertions(+), 334 deletions(-)

diff --git a/api/v1/file.go b/api/v1/file.go
index 9fbdc78..348a72c 100644
--- a/api/v1/file.go
+++ b/api/v1/file.go
@@ -3,7 +3,6 @@
 import (
 	"aps_crm/model"
 	"aps_crm/model/request"
-	"aps_crm/model/response"
 	"aps_crm/pkg/contextx"
 	"aps_crm/pkg/ecode"
 	"aps_crm/pkg/httpx"
@@ -11,6 +10,7 @@
 	"aps_crm/utils/upload"
 	"github.com/gin-gonic/gin"
 	"github.com/spf13/cast"
+	"io"
 	"os"
 	"path/filepath"
 )
@@ -131,28 +131,100 @@
 //	ctx.Ok()
 //}
 
-// List
-// @Tags		闄勪欢绠$悊
-// @Summary	鑾峰彇闄勪欢鍒楄〃
+//// List
+//// @Tags		闄勪欢绠$悊
+//// @Summary	鑾峰彇闄勪欢鍒楄〃
+//// @Produce	application/json
+//// @Param		object	query		request.GetFileList	true	"鍙傛暟"
+//// @Success	200	{object}	response.ListResponse{data=[]model.File}
+//// @Router		/api/file/list [get]
+//func (s *FileApi) List(c *gin.Context) {
+//	var params request.GetFileList
+//	ctx, ok := contextx.NewContext(c, &params)
+//	if !ok {
+//		return
+//	}
+//
+//	file, total, errCode := service.NewFileService().GetFileList()
+//	if errCode != ecode.OK {
+//		ctx.Fail(errCode)
+//		return
+//	}
+//
+//	ctx.OkWithDetailed(response.ListResponse{
+//		Data:  file,
+//		Count: total,
+//	})
+//}
+
+// Download
+// @Tags	闄勪欢绠$悊
+// @Summary	闄勪欢涓嬭浇
 // @Produce	application/json
-// @Param		object	query		request.GetFileList	true	"鍙傛暟"
-// @Success	200	{object}	response.ListResponse{data=[]model.File}
-// @Router		/api/file/list [get]
-func (s *FileApi) List(c *gin.Context) {
-	var params request.GetFileList
+// @Param		object	body		request.DownloadFile	true	"鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/file/download [post]
+func (s *FileApi) Download(c *gin.Context) {
+	var params request.DownloadFile
 	ctx, ok := contextx.NewContext(c, &params)
 	if !ok {
 		return
 	}
-
-	file, total, errCode := service.NewFileService().GetFileList()
+	file, errCode := service.NewFileService().GetFile(params.Id)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
 	}
+	if file.SourceType != params.SourceType || file.SourceId != params.SourceId || file.Key != params.Key {
+		ctx.FailWithMsg(ecode.ParamsErr, "鏂囦欢涓嶅瓨鍦�")
+		return
+	}
+	f, err := os.Open(file.FilePath)
+	if err != nil {
+		ctx.FailWithMsg(ecode.ParamsErr, "鏂囦欢涓嶅瓨鍦�")
+		return
+	}
+	file.DownloadCount++
+	service.NewFileService().UpdateFile(file)
 
-	ctx.OkWithDetailed(response.ListResponse{
-		Data:  file,
-		Count: total,
-	})
+	data, err := io.ReadAll(f)
+	c.Writer.Header().Set("Content-Type", "application/octect-stream")
+	c.Writer.Header().Set("Content-Disposition", "attachment;filename="+file.Name)
+	c.Writer.Write(data)
+}
+
+// Preview
+// @Tags	闄勪欢绠$悊
+// @Summary	闄勪欢棰勮
+// @Produce	application/json
+// @Param		object	body		request.DownloadFile	true	"鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/file/preview [post]
+func (s *FileApi) Preview(c *gin.Context) {
+	var params request.DownloadFile
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+	file, errCode := service.NewFileService().GetFile(params.Id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+	if file.SourceType != params.SourceType || file.SourceId != params.SourceId || file.Key != params.Key {
+		ctx.FailWithMsg(ecode.ParamsErr, "鏂囦欢涓嶅瓨鍦�")
+		return
+	}
+	f, err := os.Open(file.FilePath)
+	if err != nil {
+		ctx.FailWithMsg(ecode.ParamsErr, "鏂囦欢涓嶅瓨鍦�")
+		return
+	}
+	file.PreviewCount++
+	service.NewFileService().UpdateFile(file)
+
+	data, err := io.ReadAll(f)
+	c.Writer.Header().Set("Content-Type", "application/octect-stream")
+	c.Writer.Header().Set("Content-Disposition", "attachment;filename="+file.Name)
+	c.Writer.Write(data)
 }
diff --git a/docs/docs.go b/docs/docs.go
index 54c4026..7b8fec7 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -2727,76 +2727,61 @@
                 }
             }
         },
-        "/api/file/list": {
-            "get": {
+        "/api/file/download": {
+            "post": {
                 "produces": [
                     "application/json"
                 ],
                 "tags": [
                     "闄勪欢绠$悊"
                 ],
-                "summary": "鑾峰彇闄勪欢鍒楄〃",
+                "summary": "闄勪欢涓嬭浇",
                 "parameters": [
                     {
-                        "type": "string",
-                        "name": "keyword",
-                        "in": "query"
-                    },
-                    {
-                        "enum": [
-                            ""
-                        ],
-                        "type": "string",
-                        "x-enum-varnames": [
-                            "FileKeywordCustomerName"
-                        ],
-                        "name": "keywordType",
-                        "in": "query"
-                    },
-                    {
-                        "type": "integer",
-                        "description": "椤电爜",
-                        "name": "page",
-                        "in": "query"
-                    },
-                    {
-                        "type": "integer",
-                        "description": "姣忛〉澶у皬",
-                        "name": "pageSize",
-                        "in": "query"
-                    },
-                    {
-                        "enum": [
-                            ""
-                        ],
-                        "type": "string",
-                        "x-enum-varnames": [
-                            "FileQueryClassExpireLessThen60Days"
-                        ],
-                        "name": "queryClass",
-                        "in": "query"
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.DownloadFile"
+                        }
                     }
                 ],
                 "responses": {
                     "200": {
                         "description": "OK",
                         "schema": {
-                            "allOf": [
-                                {
-                                    "$ref": "#/definitions/response.ListResponse"
-                                },
-                                {
-                                    "type": "object",
-                                    "properties": {
-                                        "data": {
-                                            "type": "array",
-                                            "items": {
-                                                "$ref": "#/definitions/model.File"
-                                            }
-                                        }
-                                    }
-                                }
-                            ]
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/file/preview": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "闄勪欢绠$悊"
+                ],
+                "summary": "闄勪欢棰勮",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.DownloadFile"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
                         }
                     }
                 }
@@ -9440,24 +9425,6 @@
                 "FaqQueryClassExpireLessThen60Days"
             ]
         },
-        "constvar.FileKeywordType": {
-            "type": "string",
-            "enum": [
-                ""
-            ],
-            "x-enum-varnames": [
-                "FileKeywordCustomerName"
-            ]
-        },
-        "constvar.FileQueryClass": {
-            "type": "string",
-            "enum": [
-                ""
-            ],
-            "x-enum-varnames": [
-                "FileQueryClassExpireLessThen60Days"
-            ]
-        },
         "constvar.InvoiceKeywordType": {
             "type": "string",
             "enum": [
@@ -10236,50 +10203,6 @@
                     "type": "integer"
                 },
                 "name": {
-                    "type": "string"
-                }
-            }
-        },
-        "model.File": {
-            "type": "object",
-            "properties": {
-                "bucket": {
-                    "description": "瀵硅薄瀛樺偍bucket",
-                    "type": "string"
-                },
-                "downloadCount": {
-                    "description": "涓嬫娆℃暟",
-                    "type": "integer"
-                },
-                "filePath": {
-                    "description": "鏂囦欢璺緞",
-                    "type": "string"
-                },
-                "fileType": {
-                    "description": "鏂囦欢绫诲瀷",
-                    "type": "string"
-                },
-                "key": {
-                    "description": "瀵硅薄瀛樺偍key",
-                    "type": "string"
-                },
-                "name": {
-                    "type": "string"
-                },
-                "previewCount": {
-                    "description": "棰勮娆℃暟",
-                    "type": "integer"
-                },
-                "size": {
-                    "description": "鏂囦欢澶у皬",
-                    "type": "integer"
-                },
-                "sourceId": {
-                    "description": "鏉ユ簮id",
-                    "type": "integer"
-                },
-                "sourceType": {
-                    "description": "闄勪欢鏉ユ簮",
                     "type": "string"
                 }
             }
@@ -13480,6 +13403,33 @@
                 }
             }
         },
+        "request.DownloadFile": {
+            "type": "object",
+            "required": [
+                "id",
+                "key",
+                "sourceId",
+                "sourceType"
+            ],
+            "properties": {
+                "id": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "key": {
+                    "description": "闄勪欢瀛樺偍key",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "鏉ユ簮id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "闄勪欢鏉ユ簮",
+                    "type": "string"
+                }
+            }
+        },
         "request.FollowRecord": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 3957900..04b602a 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -2715,76 +2715,61 @@
                 }
             }
         },
-        "/api/file/list": {
-            "get": {
+        "/api/file/download": {
+            "post": {
                 "produces": [
                     "application/json"
                 ],
                 "tags": [
                     "闄勪欢绠$悊"
                 ],
-                "summary": "鑾峰彇闄勪欢鍒楄〃",
+                "summary": "闄勪欢涓嬭浇",
                 "parameters": [
                     {
-                        "type": "string",
-                        "name": "keyword",
-                        "in": "query"
-                    },
-                    {
-                        "enum": [
-                            ""
-                        ],
-                        "type": "string",
-                        "x-enum-varnames": [
-                            "FileKeywordCustomerName"
-                        ],
-                        "name": "keywordType",
-                        "in": "query"
-                    },
-                    {
-                        "type": "integer",
-                        "description": "椤电爜",
-                        "name": "page",
-                        "in": "query"
-                    },
-                    {
-                        "type": "integer",
-                        "description": "姣忛〉澶у皬",
-                        "name": "pageSize",
-                        "in": "query"
-                    },
-                    {
-                        "enum": [
-                            ""
-                        ],
-                        "type": "string",
-                        "x-enum-varnames": [
-                            "FileQueryClassExpireLessThen60Days"
-                        ],
-                        "name": "queryClass",
-                        "in": "query"
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.DownloadFile"
+                        }
                     }
                 ],
                 "responses": {
                     "200": {
                         "description": "OK",
                         "schema": {
-                            "allOf": [
-                                {
-                                    "$ref": "#/definitions/response.ListResponse"
-                                },
-                                {
-                                    "type": "object",
-                                    "properties": {
-                                        "data": {
-                                            "type": "array",
-                                            "items": {
-                                                "$ref": "#/definitions/model.File"
-                                            }
-                                        }
-                                    }
-                                }
-                            ]
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/file/preview": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "闄勪欢绠$悊"
+                ],
+                "summary": "闄勪欢棰勮",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.DownloadFile"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
                         }
                     }
                 }
@@ -9428,24 +9413,6 @@
                 "FaqQueryClassExpireLessThen60Days"
             ]
         },
-        "constvar.FileKeywordType": {
-            "type": "string",
-            "enum": [
-                ""
-            ],
-            "x-enum-varnames": [
-                "FileKeywordCustomerName"
-            ]
-        },
-        "constvar.FileQueryClass": {
-            "type": "string",
-            "enum": [
-                ""
-            ],
-            "x-enum-varnames": [
-                "FileQueryClassExpireLessThen60Days"
-            ]
-        },
         "constvar.InvoiceKeywordType": {
             "type": "string",
             "enum": [
@@ -10224,50 +10191,6 @@
                     "type": "integer"
                 },
                 "name": {
-                    "type": "string"
-                }
-            }
-        },
-        "model.File": {
-            "type": "object",
-            "properties": {
-                "bucket": {
-                    "description": "瀵硅薄瀛樺偍bucket",
-                    "type": "string"
-                },
-                "downloadCount": {
-                    "description": "涓嬫娆℃暟",
-                    "type": "integer"
-                },
-                "filePath": {
-                    "description": "鏂囦欢璺緞",
-                    "type": "string"
-                },
-                "fileType": {
-                    "description": "鏂囦欢绫诲瀷",
-                    "type": "string"
-                },
-                "key": {
-                    "description": "瀵硅薄瀛樺偍key",
-                    "type": "string"
-                },
-                "name": {
-                    "type": "string"
-                },
-                "previewCount": {
-                    "description": "棰勮娆℃暟",
-                    "type": "integer"
-                },
-                "size": {
-                    "description": "鏂囦欢澶у皬",
-                    "type": "integer"
-                },
-                "sourceId": {
-                    "description": "鏉ユ簮id",
-                    "type": "integer"
-                },
-                "sourceType": {
-                    "description": "闄勪欢鏉ユ簮",
                     "type": "string"
                 }
             }
@@ -13468,6 +13391,33 @@
                 }
             }
         },
+        "request.DownloadFile": {
+            "type": "object",
+            "required": [
+                "id",
+                "key",
+                "sourceId",
+                "sourceType"
+            ],
+            "properties": {
+                "id": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "key": {
+                    "description": "闄勪欢瀛樺偍key",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "鏉ユ簮id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "闄勪欢鏉ユ簮",
+                    "type": "string"
+                }
+            }
+        },
         "request.FollowRecord": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index f8a7c7f..0a744e3 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -46,18 +46,6 @@
     type: string
     x-enum-varnames:
     - FaqQueryClassExpireLessThen60Days
-  constvar.FileKeywordType:
-    enum:
-    - ""
-    type: string
-    x-enum-varnames:
-    - FileKeywordCustomerName
-  constvar.FileQueryClass:
-    enum:
-    - ""
-    type: string
-    x-enum-varnames:
-    - FileQueryClassExpireLessThen60Days
   constvar.InvoiceKeywordType:
     enum:
     - ""
@@ -599,38 +587,6 @@
       id:
         type: integer
       name:
-        type: string
-    type: object
-  model.File:
-    properties:
-      bucket:
-        description: 瀵硅薄瀛樺偍bucket
-        type: string
-      downloadCount:
-        description: 涓嬫娆℃暟
-        type: integer
-      filePath:
-        description: 鏂囦欢璺緞
-        type: string
-      fileType:
-        description: 鏂囦欢绫诲瀷
-        type: string
-      key:
-        description: 瀵硅薄瀛樺偍key
-        type: string
-      name:
-        type: string
-      previewCount:
-        description: 棰勮娆℃暟
-        type: integer
-      size:
-        description: 鏂囦欢澶у皬
-        type: integer
-      sourceId:
-        description: 鏉ユ簮id
-        type: integer
-      sourceType:
-        description: 闄勪欢鏉ユ簮
         type: string
     type: object
   model.FollowRecord:
@@ -2784,6 +2740,26 @@
         items:
           type: integer
         type: array
+    type: object
+  request.DownloadFile:
+    properties:
+      id:
+        description: 闄勪欢id
+        type: integer
+      key:
+        description: 闄勪欢瀛樺偍key
+        type: string
+      sourceId:
+        description: 鏉ユ簮id
+        type: integer
+      sourceType:
+        description: 闄勪欢鏉ユ簮
+        type: string
+    required:
+    - id
+    - key
+    - sourceId
+    - sourceType
     type: object
   request.FollowRecord:
     properties:
@@ -6938,49 +6914,42 @@
       summary: 鍒犻櫎闄勪欢
       tags:
       - 闄勪欢绠$悊
-  /api/file/list:
-    get:
+  /api/file/download:
+    post:
       parameters:
-      - in: query
-        name: keyword
-        type: string
-      - enum:
-        - ""
-        in: query
-        name: keywordType
-        type: string
-        x-enum-varnames:
-        - FileKeywordCustomerName
-      - description: 椤电爜
-        in: query
-        name: page
-        type: integer
-      - description: 姣忛〉澶у皬
-        in: query
-        name: pageSize
-        type: integer
-      - enum:
-        - ""
-        in: query
-        name: queryClass
-        type: string
-        x-enum-varnames:
-        - FileQueryClassExpireLessThen60Days
+      - description: 鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.DownloadFile'
       produces:
       - application/json
       responses:
         "200":
           description: OK
           schema:
-            allOf:
-            - $ref: '#/definitions/response.ListResponse'
-            - properties:
-                data:
-                  items:
-                    $ref: '#/definitions/model.File'
-                  type: array
-              type: object
-      summary: 鑾峰彇闄勪欢鍒楄〃
+            $ref: '#/definitions/contextx.Response'
+      summary: 闄勪欢涓嬭浇
+      tags:
+      - 闄勪欢绠$悊
+  /api/file/preview:
+    post:
+      parameters:
+      - description: 鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.DownloadFile'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 闄勪欢棰勮
       tags:
       - 闄勪欢绠$悊
   /api/followRecord/add:
diff --git a/model/file.go b/model/file.go
index bd1c46a..11225f1 100644
--- a/model/file.go
+++ b/model/file.go
@@ -13,9 +13,9 @@
 	File struct {
 		Name          string `gorm:"name" json:"name"`
 		Size          int64  `gorm:"size" json:"size"`                    // 鏂囦欢澶у皬
-		FilePath      string `gorm:"file_path" json:"filePath"`           // 鏂囦欢璺緞
+		FilePath      string `gorm:"file_path" json:"-"`                  // 鏂囦欢璺緞
 		Key           string `gorm:"key" json:"key"`                      // 瀵硅薄瀛樺偍key
-		Bucket        string `gorm:"bucket" json:"bucket"`                // 瀵硅薄瀛樺偍bucket
+		Bucket        string `gorm:"bucket" json:"-"`                     // 瀵硅薄瀛樺偍bucket
 		DownloadCount int    `gorm:"download_count" json:"downloadCount"` // 涓嬫娆℃暟
 		PreviewCount  int    `gorm:"preview_count" json:"previewCount"`   // 棰勮娆℃暟
 		FileType      string `gorm:"file_type" json:"fileType"`           // 鏂囦欢绫诲瀷
diff --git a/model/request/file.go b/model/request/file.go
index 096675b..749b82f 100644
--- a/model/request/file.go
+++ b/model/request/file.go
@@ -21,3 +21,10 @@
 	KeywordType constvar.FileKeywordType `json:"keywordType"  form:"keywordType"`
 	Keyword     string                   `json:"keyword" form:"keyword"`
 }
+
+type DownloadFile struct {
+	SourceType string `json:"sourceType" form:"sourceType" binding:"required"` // 闄勪欢鏉ユ簮
+	SourceId   int    `json:"sourceId" form:"sourceId"  binding:"required"`    // 鏉ユ簮id
+	Id         uint   `json:"id" form:"id"  binding:"required"`                // 闄勪欢id
+	Key        string `json:"key" form:"key"  binding:"required"`              // 闄勪欢瀛樺偍key
+}
diff --git a/router/file.go b/router/file.go
index 3946e5d..a44ff23 100644
--- a/router/file.go
+++ b/router/file.go
@@ -11,6 +11,8 @@
 	{
 		FileRouter.POST("add", FileApi.Add)             // 娣诲姞闄勪欢
 		FileRouter.DELETE("delete/:id", FileApi.Delete) // 鍒犻櫎闄勪欢
-		FileRouter.GET("list", FileApi.List)            // 闄勪欢鍒楄〃
+		//FileRouter.GET("list", FileApi.List)            // 闄勪欢鍒楄〃
+		FileRouter.POST("download", FileApi.Download) // 闄勪欢涓嬭浇
+		FileRouter.POST("preview", FileApi.Preview)   // 闄勪欢棰勮
 	}
 }
diff --git a/service/file.go b/service/file.go
index 584aa11..4ed8750 100644
--- a/service/file.go
+++ b/service/file.go
@@ -12,6 +12,15 @@
 	return FileService{}
 }
 
+func (FileService) GetFile(id uint) (*model.File, int) {
+	file, err := model.NewFileSearch().SetId(id).First()
+	if err != nil {
+		return nil, ecode.DBErr
+	}
+
+	return file, ecode.OK
+}
+
 func (FileService) AddFile(fileRecord *model.File) int {
 
 	err := model.NewFileSearch().Create(fileRecord)

--
Gitblit v1.8.0