package back import ( "bufio" "html/template" "image" "image/jpeg" "mime/multipart" "os" "strconv" "strings" "github.com/gin-gonic/gin" "github.com/nfnt/resize" ) func prepareRouterMaterial() { router.POST("/material-insert/:category", handlerInsertMaterial) router.POST("/material-update/:category", handlerUpdateMaterial) router.POST("/material-delete/:link", handlerDeleteMaterial) router.POST("/material-restore/:link", handlerRestoreMaterial) router.POST("/material-select-limit/:category", handlerSelectLimitMaterial) router.POST("/material-search", handlerMaterialSearch) router.POST("/material-get-source/:link", handlerMaterialGetSource) router.POST("/material-get", handlerMaterialGet) } func handlerMaterial(c *gin.Context) { m := material{} h := gin.H{} m.Link = c.Param("link") isAvailableMaterial := true e := m.SelectOne() if e != nil { if strings.Contains(e.Error(), "no rows") { h["OtherPage"] = "404" isAvailableMaterial = false } } h["Page"] = m if m.Active == false { h["OtherPage"] = "404" isAvailableMaterial = false } else { if isAvailableMaterial { if m.Category != c.Param("category") { c.Redirect(302, Setting.ServerDomain+"/данные/"+m.Category+"/"+m.Link) return } } } isAdmin := false isLogin := false isSecreter := false role := getRoleFromContext(c) if len(role) != 0 { if role == "__admin" { isAdmin = true isAvailableMaterial = true } else if role == "_secretary" { isSecreter = true } isLogin = true } h["IsMain"] = false h["IsLogin"] = isLogin h["IsAdmin"] = isAdmin h["isSecreter"] = isSecreter if isAdmin { h["Menu"] = templateMenuAll h["MenuTop"] = templateMenuAllTop } else { h["Menu"] = templateMenu h["MenuTop"] = templateMenuTop } h["AvailableMaterial"] = isAvailableMaterial h["ServerVersion"] = Setting.ServerVersion c.HTML(200, "index.html", h) } func handlerMaterialSearch(c *gin.Context) { s := search{} e := c.BindJSON(&s) if e != nil { logger.Println("ERROR", e) c.JSON(200, gin.H{ "Error": nil, "Data": nil, }) return } m := material{} e = m.Search(s.Phrase) if e != nil { logger.Println("ERROR", e) c.JSON(200, gin.H{ "Error": nil, "Data": nil, }) return } c.JSON(200, gin.H{ "Error": nil, "Data": m.Rows, }) } func handlerInsertMaterial(c *gin.Context) { man := getManagerFromContext(c) if man.Role != "__admin" { c.JSON(200, gin.H{ "Error": errorAccessRestricted, }) return } form, e := c.MultipartForm() if e != nil { logger.Println("ERROR", e) c.JSON(200, gin.H{ "Error": errorBadRequestData, }) return } m := material{} m.Category = c.Param("category") m.Author = man.ID m.Caption = form.Value["Caption"][0] m.Source = form.Value["Source"][0] m.SourceImages = form.Value["SourceImages"][0] m.Link = form.Value["Link"][0] m.Content = template.HTML(form.Value["Content"][0]) m.Preview.Valid, _ = strconv.ParseBool(form.Value["PreviewValid"][0]) if m.Preview.Valid { m.Preview.String = form.Value["PreviewString"][0] } m.Image.Valid, _ = strconv.ParseBool(form.Value["ImageValid"][0]) if m.Image.Valid { m.Image.String = form.Value["ImageString"][0] } imagePath := Setting.Data + form.Value["ImagePath"][0] thumbPath := Setting.Data + form.Value["ThumbPath"][0] _, err := os.Stat(imagePath) if os.IsNotExist(err) { err = os.MkdirAll(imagePath, 0777) if err != nil { logger.Println("ERROR: ", err.Error()) c.JSON(200, gin.H{ "Error": err.Error(), }) return } } _, err = os.Stat(thumbPath) if os.IsNotExist(err) { err = os.MkdirAll(thumbPath, 0777) if err != nil { logger.Println("ERROR: ", err.Error()) c.JSON(200, gin.H{ "Error": err.Error(), }) return } } e = uploadImageFiles(imagePath, thumbPath, form.File["Files"], c) if e != nil { logger.Println(e) c.JSON(200, gin.H{ "Error": e.Error(), }) return } e = m.Insert() if e != nil { logger.Println(e) c.JSON(200, gin.H{ "Error": e.Error(), }) return } if m.Category == "новость" { prepareNews() prepareNewsPagination() } if m.Category == "объявление" { prepareNotice() } c.JSON(200, gin.H{ "Error": nil, }) } func handlerUpdateMaterial(c *gin.Context) { man := getManagerFromContext(c) if man.Role != "__admin" { c.JSON(200, gin.H{ "Error": errorAccessRestricted, }) return } form, e := c.MultipartForm() if e != nil { logger.Println("ERROR", e) c.JSON(200, gin.H{ "Error": errorBadRequestData, }) return } m := material{} m.Category = c.Param("category") m.Author = man.ID m.Caption = form.Value["Caption"][0] m.Source = form.Value["Source"][0] // m.SourceImages = form.Value["SourceImages"][0] m.Link = form.Value["Link"][0] m.Content = template.HTML(form.Value["Content"][0]) m.Preview.Valid, _ = strconv.ParseBool(form.Value["PreviewValid"][0]) if m.Preview.Valid { m.Preview.String = form.Value["PreviewString"][0] } // m.Image.Valid, _ = strconv.ParseBool(form.Value["ImageValid"][0]) // if m.Image.Valid { // m.Image.String = form.Value["ImageString"][0] // } imagePath := Setting.Data + form.Value["ImagePath"][0] thumbPath := Setting.Data + form.Value["ThumbPath"][0] _, err := os.Stat(imagePath) if os.IsNotExist(err) { err = os.MkdirAll(imagePath, 0777) if err != nil { logger.Println("ERROR: ", err.Error()) c.JSON(200, gin.H{ "Error": err.Error(), }) return } } _, err = os.Stat(thumbPath) if os.IsNotExist(err) { err = os.MkdirAll(thumbPath, 0777) if err != nil { logger.Println("ERROR: ", err.Error()) c.JSON(200, gin.H{ "Error": err.Error(), }) return } } e = uploadImageFiles(imagePath, thumbPath, form.File["Files"], c) if e != nil { logger.Println(e) c.JSON(200, gin.H{ "Error": e.Error(), }) return } e = m.Update() if e != nil { logger.Println(e) c.JSON(200, gin.H{ "Error": e.Error(), }) return } c.JSON(200, gin.H{ "Error": nil, }) } func handlerDeleteMaterial(c *gin.Context) { man := getManagerFromContext(c) if man.Role != "__admin" { c.JSON(200, gin.H{ "Error": errorAccessRestricted, }) return } m := material{} m.Link = c.Param("link") m.Active = false e := m.Delete() if e != nil { logger.Println(e) c.JSON(200, gin.H{ "Error": e.Error(), }) return } c.JSON(200, gin.H{ "Error": nil, }) } func handlerRestoreMaterial(c *gin.Context) { man := getManagerFromContext(c) if man.Role != "__admin" { c.JSON(200, gin.H{ "Error": errorAccessRestricted, }) return } m := material{} m.Link = c.Param("link") m.Active = true e := m.Delete() if e != nil { logger.Println(e) c.JSON(200, gin.H{ "Error": e.Error(), }) return } c.JSON(200, gin.H{ "Error": nil, }) } func handlerSelectLimitMaterial(c *gin.Context) { l := limit{} e := c.BindJSON(&l) if e != nil { logger.Println(e.Error()) c.JSON(200, gin.H{ "Error": e.Error(), }) return } news := material{} news.Category = c.Param("category") e = news.Select(l.Offset, l.Limit) if e != nil { logger.Println(e.Error()) c.JSON(200, gin.H{ "Error": e.Error(), }) return } c.JSON(200, gin.H{ "Error": nil, "Data": news.Rows, }) } func uploadImageFiles(imagePath, thumbPath string, files []*multipart.FileHeader, c *gin.Context) error { for _, file := range files { if e := c.SaveUploadedFile(file, imagePath+file.Filename); e != nil { logger.Println("ERROR: ", e.Error()) return e } src, e := file.Open() if e != nil { logger.Println("ERROR: ", e.Error()) return e } img0, _, e := image.Decode(src) if e != nil { logger.Println("ERROR: ", e.Error()) return e } img := resize.Resize(450, 0, img0, resize.Bicubic) var fileThumb *os.File fileThumb, e = os.Create(thumbPath + file.Filename) if e != nil { logger.Println("ERROR: ", e.Error()) return e } defer fileThumb.Close() fileWrite := bufio.NewWriter(fileThumb) e = jpeg.Encode(fileWrite, img, nil) if e != nil { logger.Println("ERROR: ", e.Error()) return e } } return nil } func handlerMaterialGetSource(c *gin.Context) { m := material{} m.Link = c.Param("link") e := m.SelectSource() if e != nil { logger.Println(e) c.JSON(200, gin.H{ "Error": e.Error(), }) return } c.JSON(200, gin.H{ "Error": nil, "Data": m, }) } func handlerMaterialGet(c *gin.Context) { m := material{} e := m.SelectAll() if e != nil { logger.Println("ERROR", e) c.JSON(200, gin.H{ "Error": nil, "Data": nil, }) return } c.JSON(200, gin.H{ "Error": nil, "Data": m.Rows, }) }