backend.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package backend
  2. import (
  3. "database/sql"
  4. _ "github.com/go-sql-driver/mysql"
  5. "html/template"
  6. "golang-fave/constants"
  7. "golang-fave/engine/wrapper"
  8. templates "golang-fave/engine/wrapper/resources/templates"
  9. utils "golang-fave/engine/wrapper/utils"
  10. )
  11. type Backend struct {
  12. wrapper *wrapper.Wrapper
  13. db *sql.DB
  14. user *utils.MySql_user
  15. }
  16. type TmplData struct {
  17. Title string
  18. UserEmail string
  19. SidebarLeft template.HTML
  20. Content template.HTML
  21. SidebarRight template.HTML
  22. }
  23. func New(wrapper *wrapper.Wrapper, db *sql.DB) *Backend {
  24. return &Backend{wrapper, db, nil}
  25. }
  26. func (this *Backend) Run() bool {
  27. // Show add user form if no any user in db
  28. var count int
  29. err := this.db.QueryRow("SELECT COUNT(*) FROM `users`;").Scan(&count)
  30. if this.wrapper.EngineErrMsgOnError(err) {
  31. return true
  32. }
  33. if count <= 0 {
  34. return this.wrapper.TmplBackEnd(templates.CpFirstUser, nil)
  35. }
  36. // Login page
  37. if this.wrapper.Session.GetIntDef("UserId", 0) <= 0 {
  38. return this.wrapper.TmplBackEnd(templates.CpLogin, nil)
  39. }
  40. // Load current user, if not, show login page
  41. this.user = &utils.MySql_user{}
  42. err = this.db.QueryRow("SELECT `id`, `first_name`, `last_name`, `email`, `password` FROM `users` WHERE `id` = ? LIMIT 1;", this.wrapper.Session.GetIntDef("UserId", 0)).Scan(
  43. &this.user.A_id, &this.user.A_first_name, &this.user.A_last_name, &this.user.A_email, &this.user.A_password)
  44. if this.wrapper.EngineErrMsgOnError(err) {
  45. return true
  46. }
  47. if this.user.A_id != this.wrapper.Session.GetIntDef("UserId", 0) {
  48. return this.wrapper.TmplBackEnd(templates.CpLogin, nil)
  49. }
  50. // Display cp page
  51. /*
  52. (*this.wrapper.W).Write([]byte(`Admin panel here...`))
  53. return true
  54. */
  55. // return this.wrapper.TmplBackEnd(templates.CpBase, nil)
  56. /*
  57. tmpl, err := template.New("template").Parse(string(templates.CpBase))
  58. if err == nil {
  59. (*this.wrapper.W).Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
  60. tmpl.Execute(*this.wrapper.W, wrapper.TmplDataAll{
  61. System: this.wrapper.TmplGetSystemData(),
  62. Data: TmplData{
  63. Title: "Fave " + constants.ServerVersion,
  64. UserEmail: this.user.A_email,
  65. SidebarLeft: "Sidebar left",
  66. Content: "Content",
  67. SidebarRight: "Sidebar right",
  68. },
  69. })
  70. return true
  71. }
  72. */
  73. // Get parsed template as string
  74. // https://coderwall.com/p/ns60fq/simply-output-go-html-template-execution-to-strings
  75. // http://localhost:8080/admin/
  76. sidebar_left := string(`<ul class="nav flex-column">
  77. <li class="nav-item active">
  78. <a class="nav-link" href="#">Pages</a>
  79. <ul class="nav flex-column">
  80. <li class="nav-item active">
  81. <a class="nav-link" href="#">List of pages</a>
  82. </li>
  83. <li class="nav-item">
  84. <a class="nav-link" href="#">Add new page</a>
  85. </li>
  86. </ul>
  87. </li>
  88. <li class="nav-item">
  89. <a class="nav-link" href="#">Link 2</a>
  90. </li>
  91. <li class="nav-item">
  92. <a class="nav-link" href="#">Link 3</a>
  93. </li>
  94. <li class="nav-item">
  95. <a class="nav-link" href="#">Link 4</a>
  96. </li>
  97. </ul>`)
  98. page := this.wrapper.TmplParseToString(templates.CpBase, wrapper.TmplDataAll{
  99. System: this.wrapper.TmplGetSystemData(),
  100. Data: TmplData{
  101. Title: "Fave " + constants.ServerVersion,
  102. UserEmail: this.user.A_email,
  103. SidebarLeft: template.HTML(sidebar_left),
  104. Content: template.HTML("Content"),
  105. SidebarRight: template.HTML("Sidebar right"),
  106. },
  107. })
  108. (*this.wrapper.W).Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
  109. (*this.wrapper.W).Write([]byte(page))
  110. return true
  111. return false
  112. }