You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							130 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							130 lines
						
					
					
						
							2.8 KiB
						
					
					
				
								package api
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"github.com/gin-gonic/gin"
							 | 
						|
									"github.com/gisle/stufflog/database"
							 | 
						|
									"github.com/gisle/stufflog/models"
							 | 
						|
									"github.com/gisle/stufflog/services"
							 | 
						|
									"github.com/gisle/stufflog/slerrors"
							 | 
						|
									"sort"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func Items(g *gin.RouterGroup, db database.Database, auth *services.AuthService) {
							 | 
						|
									type resObj struct {
							 | 
						|
										Item  *models.Item   `json:"item,omitempty"`
							 | 
						|
										Items []*models.Item `json:"items,omitempty"`
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									g.Use(auth.GinSessionMiddleware(true))
							 | 
						|
								
							 | 
						|
									// GET / – List own items
							 | 
						|
									g.GET("/", func(c *gin.Context) {
							 | 
						|
										user := auth.UserFromContext(c)
							 | 
						|
								
							 | 
						|
										items, err := db.Items().ListUser(c.Request.Context(), *user)
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, err)
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
										if items == nil {
							 | 
						|
											items = []*models.Item{}
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										sort.Sort(models.ItemsByName(items))
							 | 
						|
								
							 | 
						|
										c.JSON(200, resObj{Items: items})
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									// GET /:id – Find an item
							 | 
						|
									g.GET("/:id", func(c *gin.Context) {
							 | 
						|
										user := auth.UserFromContext(c)
							 | 
						|
								
							 | 
						|
										item, err := db.Items().FindID(c.Request.Context(), c.Param("id"))
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, err)
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
										if item.UserID != user.ID {
							 | 
						|
											slerrors.GinRespond(c, slerrors.NotFound("Item"))
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										c.JSON(200, resObj{Item: item})
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									// POST / – Create an item
							 | 
						|
									g.POST("/", func(c *gin.Context) {
							 | 
						|
										user := auth.UserFromContext(c)
							 | 
						|
										item := models.Item{}
							 | 
						|
								
							 | 
						|
										err := c.BindJSON(&item)
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()})
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										item.GenerateID()
							 | 
						|
										item.UserID = user.ID
							 | 
						|
								
							 | 
						|
										err = db.Items().Insert(c.Request.Context(), item)
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, err)
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										c.JSON(200, resObj{Item: &item})
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									// PATCH /:id – Update an item
							 | 
						|
									g.PATCH("/:id", func(c *gin.Context) {
							 | 
						|
										user := auth.UserFromContext(c)
							 | 
						|
										updates := make([]*models.ItemUpdate, 0, 8)
							 | 
						|
								
							 | 
						|
										err := c.BindJSON(&updates)
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()})
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										item, err := db.Items().FindID(c.Request.Context(), c.Param("id"))
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, err)
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
										if item.UserID != user.ID {
							 | 
						|
											slerrors.GinRespond(c, slerrors.NotFound("Item"))
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										item, err = db.Items().Update(c.Request.Context(), *item, updates)
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, err)
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										c.JSON(200, resObj{Item: item})
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									// DELETE /:id – Delete an item
							 | 
						|
									g.DELETE("/:id", func(c *gin.Context) {
							 | 
						|
										user := auth.UserFromContext(c)
							 | 
						|
								
							 | 
						|
										item, err := db.Items().FindID(c.Request.Context(), c.Param("id"))
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, err)
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
										if item.UserID != user.ID {
							 | 
						|
											slerrors.GinRespond(c, slerrors.NotFound("Period"))
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										err = db.Items().Remove(c.Request.Context(), *item)
							 | 
						|
										if err != nil {
							 | 
						|
											slerrors.GinRespond(c, err)
							 | 
						|
											return
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										c.JSON(200, resObj{Item: item})
							 | 
						|
									})
							 | 
						|
								}
							 |