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  }