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.
		
		
		
		
		
			
		
			
				
					
					
						
							98 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							98 lines
						
					
					
						
							2.4 KiB
						
					
					
				
								package api
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"git.aiterp.net/stufflog3/stufflog3-api/internal/database"
							 | 
						|
									"git.aiterp.net/stufflog3/stufflog3-api/internal/models"
							 | 
						|
									"git.aiterp.net/stufflog3/stufflog3-api/internal/slerrors"
							 | 
						|
									"github.com/gin-gonic/gin"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func Stats(g *gin.RouterGroup, db database.Database) {
							 | 
						|
									g.Use(scopeIDMiddleware(db))
							 | 
						|
								
							 | 
						|
									g.GET("", handler("stats", func(c *gin.Context) (interface{}, error) {
							 | 
						|
										return getScope(c).Stats, nil
							 | 
						|
									}))
							 | 
						|
								
							 | 
						|
									g.GET("/:id", handler("stat", func(c *gin.Context) (interface{}, error) {
							 | 
						|
										id, err := reqInt(c, "id")
							 | 
						|
										if err != nil {
							 | 
						|
											return nil, err
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										stat := getScope(c).Stat(id)
							 | 
						|
										if stat == nil {
							 | 
						|
											return nil, slerrors.NotFound("Stat")
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										return stat, nil
							 | 
						|
									}))
							 | 
						|
								
							 | 
						|
									g.POST("", handler("stat", func(c *gin.Context) (interface{}, error) {
							 | 
						|
										stat := &models.Stat{}
							 | 
						|
										err := c.BindJSON(stat)
							 | 
						|
										if err != nil {
							 | 
						|
											return nil, slerrors.BadRequest("Invalid JSON input: " + err.Error())
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										if stat.Name == "" {
							 | 
						|
											return nil, slerrors.BadRequest("Project name cannot be blank")
							 | 
						|
										}
							 | 
						|
										if stat.Weight < 0 {
							 | 
						|
											return nil, slerrors.BadRequest("Negative weight not allowed")
							 | 
						|
										}
							 | 
						|
										for key, value := range stat.AllowedAmounts {
							 | 
						|
											if value <= 0 {
							 | 
						|
												return nil, slerrors.BadRequest("Invalid allowed amount: " + key + "  (0/-1 only allowed when updating to delete them)")
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										return db.Stats(getScope(c).ID).Create(c.Request.Context(), *stat)
							 | 
						|
									}))
							 | 
						|
								
							 | 
						|
									g.PUT("/:id", handler("stat", func(c *gin.Context) (interface{}, error) {
							 | 
						|
										id, err := reqInt(c, "id")
							 | 
						|
										if err != nil {
							 | 
						|
											return nil, err
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										update := &models.StatUpdate{}
							 | 
						|
										err = c.BindJSON(update)
							 | 
						|
										if err != nil {
							 | 
						|
											return nil, slerrors.BadRequest("Invalid JSON input: " + err.Error())
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										stat := getScope(c).Stat(id)
							 | 
						|
										if stat == nil {
							 | 
						|
											return nil, slerrors.NotFound("Stat")
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										if update.Name != nil && *update.Name == "" {
							 | 
						|
											return nil, slerrors.BadRequest("Project name cannot be blank")
							 | 
						|
										}
							 | 
						|
										if update.Weight != nil && *update.Weight < 0 {
							 | 
						|
											return nil, slerrors.BadRequest("Negative weight not allowed")
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										return db.Stats(getScope(c).ID).Update(c.Request.Context(), *stat, *update)
							 | 
						|
									}))
							 | 
						|
								
							 | 
						|
									g.DELETE("/:id", handler("stat", func(c *gin.Context) (interface{}, error) {
							 | 
						|
										id, err := reqInt(c, "id")
							 | 
						|
										if err != nil {
							 | 
						|
											return nil, err
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										stat := getScope(c).Stat(id)
							 | 
						|
										if stat == nil {
							 | 
						|
											return nil, slerrors.NotFound("Stat")
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										err = db.Stats(getScope(c).ID).Delete(c.Request.Context(), *stat)
							 | 
						|
										if err != nil {
							 | 
						|
											return nil, err
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										return stat, nil
							 | 
						|
									}))
							 | 
						|
								}
							 |