github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/web/manage/page/page.go (about) 1 package managepage 2 3 import ( 4 "net/http" 5 "time" 6 7 "github.com/gosimple/slug" 8 "github.com/ngocphuongnb/tetua/app/entities" 9 "github.com/ngocphuongnb/tetua/app/repositories" 10 "github.com/ngocphuongnb/tetua/app/server" 11 "github.com/ngocphuongnb/tetua/app/services" 12 "github.com/ngocphuongnb/tetua/app/utils" 13 "github.com/ngocphuongnb/tetua/views" 14 ) 15 16 func Index(c server.Context) error { 17 c.Meta().Title = "Manage pages" 18 page := c.QueryInt("page", 1) 19 search := c.Query("q") 20 publish := c.Query("publish", "all") 21 status := http.StatusOK 22 data, err := repositories.Page.Paginate(c.Context(), &entities.PageFilter{ 23 Publish: publish, 24 Filter: &entities.Filter{ 25 BaseUrl: utils.Url("/manage/pages"), 26 Page: page, 27 Search: search, 28 }}) 29 30 if err != nil { 31 status = http.StatusBadRequest 32 c.WithError("Error getting pages", err) 33 } 34 35 return c.Status(status).Render(views.ManagePageIndex( 36 data, 37 search, 38 publish, 39 )) 40 } 41 42 func Delete(c server.Context) error { 43 page, err := getProcessingPage(c) 44 45 if err != nil { 46 c.Logger().Error("Error deleting page", err) 47 return c.Status(http.StatusBadRequest).SendString("Error deleting page") 48 } 49 50 if err := repositories.Page.DeleteByID(c.Context(), page.ID); err != nil { 51 c.Logger().Error("Error deleting page", err) 52 return c.Status(http.StatusBadRequest).SendString("Error deleting page") 53 } 54 55 return c.Status(http.StatusOK).SendString("Page deleted") 56 } 57 58 func Compose(c server.Context) (err error) { 59 featuredImage := &entities.File{} 60 page := &entities.Page{} 61 c.Meta().Title = "Create Page" 62 63 if page, err = getProcessingPage(c); err != nil { 64 return err 65 } 66 67 if page.ID > 0 { 68 c.Meta().Title = "Edit Page: " + page.Name 69 featuredImage = page.FeaturedImage 70 } 71 72 return getComposeView(c, page, featuredImage) 73 } 74 75 func Save(c server.Context) (err error) { 76 var page *entities.Page 77 featuredImage := &entities.File{} 78 pageData := getPageSaveData(c) 79 contentHtml, err := utils.MarkdownToHtml(pageData.Content) 80 81 if err != nil { 82 c.WithError("Error convert markdown to html", err) 83 } 84 85 if page, err = getProcessingPage(c); err != nil { 86 return err 87 } 88 89 if pageData.FeaturedImageID > 0 { 90 if featuredImage, err = repositories.File.ByID(c.Context(), pageData.FeaturedImageID); err != nil { 91 c.WithError("Error getting featured image", err) 92 } 93 } 94 95 if !c.Messages().HasError() { 96 var savedPage *entities.Page 97 pageData.ContentHTML = contentHtml 98 99 if page.ID > 0 { 100 now := time.Now() 101 pageData.ID = page.ID 102 pageData.UpdatedAt = &now 103 savedPage, err = repositories.Page.Update(c.Context(), pageData) 104 } else { 105 savedPage, err = repositories.Page.Create(c.Context(), pageData) 106 } 107 108 if err != nil { 109 c.WithError("Error saving page", err) 110 return getComposeView(c, pageData, featuredImage) 111 } 112 113 return c.RedirectToRoute("manage.page.compose", entities.Map{"id": savedPage.ID}) 114 } 115 116 return getComposeView(c, pageData, featuredImage) 117 } 118 119 func getComposeView(c server.Context, data *entities.Page, featuredImage *entities.File) (err error) { 120 status := http.StatusOK 121 122 if err != nil { 123 c.Logger().Error("Error getting pages", err) 124 c.Messages().AppendError("Error getting pages") 125 } 126 127 if c.Messages().HasError() { 128 status = http.StatusBadRequest 129 } 130 131 return c.Status(status).Render(views.ManagePageCompose(data, featuredImage)) 132 } 133 134 func getPageSaveData(c server.Context) *entities.Page { 135 pageData := &entities.Page{} 136 137 if err := c.BodyParser(pageData); err != nil { 138 c.WithError("Bad request", err) 139 return pageData 140 } 141 142 pageData.Content = utils.SanitizeMarkdown(pageData.Content) 143 pageData.Name = utils.SanitizePlainText(pageData.Name) 144 145 if pageData.Slug == "" { 146 pageData.Slug = slug.Make(pageData.Name) 147 } else { 148 pageData.Slug = utils.SanitizePlainText(pageData.Slug) 149 } 150 151 if featuredImage, err := services.SaveFile(c, "featured_image"); err != nil { 152 c.WithError("Error saving featured image", err) 153 } else if featuredImage != nil { 154 pageData.FeaturedImageID = featuredImage.ID 155 } 156 157 if pageData.Name == "" || len(pageData.Name) > 250 { 158 c.Messages().AppendError("Name is required and can't be more than 250 characters") 159 } 160 161 if pageData.Content == "" { 162 c.Messages().AppendError("Content is required") 163 } 164 165 return pageData 166 } 167 168 func getProcessingPage(c server.Context) (page *entities.Page, err error) { 169 if c.Param("id") == "new" { 170 return &entities.Page{}, nil 171 } 172 return repositories.Page.ByID(c.Context(), c.ParamInt("id")) 173 }