admin_handlers.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package controller
  2. import (
  3. "net/http"
  4. "git.aetherial.dev/aeth/keiji/pkg/auth"
  5. "git.aetherial.dev/aeth/keiji/pkg/storage"
  6. "github.com/gin-gonic/gin"
  7. )
  8. const AUTH_COOKIE_NAME = "X-Server-Auth"
  9. // @Name ServeLogin
  10. // @Summary serves the HTML login page
  11. // @Tags admin
  12. // @Router /login [get]
  13. func (c *Controller) ServeLogin(ctx *gin.Context) {
  14. cookie, _ := ctx.Cookie(AUTH_COOKIE_NAME)
  15. if c.Cache.Read(cookie) {
  16. ctx.Redirect(302, "/home")
  17. }
  18. ctx.HTML(http.StatusOK, "login", gin.H{
  19. "heading": "aetherial.dev login",
  20. })
  21. }
  22. // @Name Auth
  23. // @Summary serves recieves admin user and pass, sets a cookie
  24. // @Tags admin
  25. // @Param cred body storage.Credentials true "Admin Credentials"
  26. // @Router /login [post]
  27. func (c *Controller) Auth(ctx *gin.Context) {
  28. var cred auth.Credentials
  29. err := ctx.ShouldBind(&cred)
  30. if err != nil {
  31. ctx.JSON(400, map[string]string{
  32. "Error": err.Error(),
  33. })
  34. return
  35. }
  36. cookie, err := auth.Authorize(&cred, c.Cache, c.AuthSource)
  37. if err != nil {
  38. ctx.JSON(400, map[string]string{
  39. "Error": err.Error(),
  40. })
  41. return
  42. }
  43. ctx.SetCookie(AUTH_COOKIE_NAME, cookie, 3600, "/", c.Domain, false, false)
  44. ctx.HTML(http.StatusOK, "admin", gin.H{
  45. "navigation": gin.H{
  46. "headers": c.database.GetNavBarLinks(),
  47. "menu": c.database.GetDropdownElements(),
  48. },
  49. "Tables": c.database.GetAdminTables().Tables,
  50. })
  51. }
  52. /*
  53. @Name AddAdminTableEntry
  54. @Summary add an entry to the admin table
  55. @Tags admin
  56. @Router /admin/panel
  57. */
  58. func (c *Controller) AddAdminTableEntry(ctx *gin.Context) {
  59. tables := make(map[string][]storage.TableData)
  60. adminPage := storage.AdminPage{Tables: tables}
  61. err := ctx.ShouldBind(&adminPage)
  62. if err != nil {
  63. ctx.JSON(400, map[string]string{
  64. "Error": err.Error(),
  65. })
  66. return
  67. }
  68. for category := range adminPage.Tables {
  69. for entry := range adminPage.Tables[category] {
  70. err := c.database.AddAdminTableEntry(adminPage.Tables[category][entry], category)
  71. if err != nil {
  72. ctx.JSON(400, map[string]string{
  73. "Error": err.Error(),
  74. })
  75. return
  76. }
  77. }
  78. }
  79. ctx.Data(200, "text", []byte("Categories populated."))
  80. }
  81. /*
  82. @Name AddMenuItem
  83. @Summary add an entry to the sidebar menu
  84. @Tags admin
  85. @Router /admin/menu
  86. */
  87. func (c *Controller) AddMenuItem(ctx *gin.Context) {
  88. var item storage.LinkPair
  89. err := ctx.ShouldBind(&item)
  90. if err != nil {
  91. ctx.JSON(400, map[string]string{
  92. "Error": err.Error(),
  93. })
  94. return
  95. }
  96. err = c.database.AddMenuItem(item)
  97. if err != nil {
  98. ctx.JSON(400, map[string]string{
  99. "Error": err.Error(),
  100. })
  101. return
  102. }
  103. ctx.Data(200, "text", []byte("menu item added."))
  104. }
  105. /*
  106. @Name AddNavbarItem
  107. @Summary add an entry to the navbar
  108. @Tags admin
  109. @Router /admin/navbar
  110. */
  111. func (c *Controller) AddNavbarItem(ctx *gin.Context) {
  112. var item storage.NavBarItem
  113. err := ctx.ShouldBind(&item)
  114. if err != nil {
  115. ctx.JSON(400, map[string]string{
  116. "Error": err.Error(),
  117. })
  118. return
  119. }
  120. err = c.database.AddNavbarItem(item)
  121. if err != nil {
  122. ctx.JSON(400, map[string]string{
  123. "Error": err.Error(),
  124. })
  125. return
  126. }
  127. err = c.database.AddAsset(item.Link, item.Png)
  128. if err != nil {
  129. ctx.JSON(400, map[string]string{
  130. "Error": err.Error(),
  131. })
  132. return
  133. }
  134. ctx.Data(200, "text", []byte("navbar item added."))
  135. }
  136. /*
  137. @Name AddAsset
  138. @Summary add an asset to the db
  139. @Tags admin
  140. @Router /admin/assets
  141. */
  142. func (c *Controller) AddAsset(ctx *gin.Context) {
  143. var item storage.Asset
  144. err := ctx.ShouldBind(&item)
  145. if err != nil {
  146. ctx.JSON(400, map[string]string{
  147. "Error": err.Error(),
  148. })
  149. return
  150. }
  151. err = c.database.AddAsset(item.Name, item.Data)
  152. if err != nil {
  153. ctx.JSON(400, map[string]string{
  154. "Error": err.Error(),
  155. })
  156. return
  157. }
  158. }
  159. // @Name AdminPanel
  160. // @Summary serve the admin panel page
  161. // @Tags admin
  162. // @Router /admin/panel [get]
  163. func (c *Controller) AdminPanel(ctx *gin.Context) {
  164. ctx.HTML(http.StatusOK, "admin", gin.H{
  165. "navigation": gin.H{
  166. "headers": c.database.GetNavBarLinks(),
  167. "menu": c.database.GetDropdownElements(),
  168. },
  169. "Tables": c.database.GetAdminTables().Tables,
  170. })
  171. }