implement dbhandler package and new test file

This commit is contained in:
Adrian Zürcher
2025-10-31 08:11:07 +01:00
parent 1568ee2482
commit 80675ed328
17 changed files with 674 additions and 572 deletions

View File

@@ -16,16 +16,17 @@ import (
)
func (a *APIHandler) AddNewMember(c *gin.Context) {
if !a.databaseOpened(c) {
if !a.DBHandlerIsInitialized() {
a.logger.Error("AddNewMember", "database handler is not initialized")
c.JSON(http.StatusInternalServerError, nil)
return
}
var member models.Member
err := c.BindJSON(&member)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
a.logger.Error("AddNewMember", err)
c.JSON(http.StatusInternalServerError, nil)
return
}
@@ -40,6 +41,7 @@ func (a *APIHandler) AddNewMember(c *gin.Context) {
text += "birthday "
}
if text != "" {
a.logger.Error("AddNewMember", text+"can not be empty")
c.JSON(http.StatusBadRequest, gin.H{
"message": text + "can not be empty",
})
@@ -48,6 +50,7 @@ func (a *APIHandler) AddNewMember(c *gin.Context) {
err = a.DbHandler.AddNewMember(member)
if err != nil {
a.logger.Error("AddNewMember", err)
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
@@ -59,8 +62,10 @@ func (a *APIHandler) AddNewMember(c *gin.Context) {
})
}
func (a *APIHandler) GetMemberById(c *gin.Context) {
if !a.databaseOpened(c) {
func (a *APIHandler) GetMember(c *gin.Context) {
if !a.DBHandlerIsInitialized() {
a.logger.Error("GetMember", "database handler is not initialized")
c.JSON(http.StatusInternalServerError, nil)
return
}
@@ -71,15 +76,15 @@ func (a *APIHandler) GetMemberById(c *gin.Context) {
if id != "" {
i, err = strconv.Atoi(id)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
a.logger.Error("GetMember", err)
c.JSON(http.StatusInternalServerError, nil)
return
}
}
members, err := a.DbHandler.GetMember(i)
members, err := a.DbHandler.GetMember(uint(i))
if err != nil {
a.logger.Error("GetMember", err)
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
@@ -89,7 +94,9 @@ func (a *APIHandler) GetMemberById(c *gin.Context) {
}
func (a *APIHandler) EditMember(c *gin.Context) {
if !a.databaseOpened(c) {
if !a.DBHandlerIsInitialized() {
a.logger.Error("EditMember", "database handler is not initialized")
c.JSON(http.StatusInternalServerError, nil)
return
}
@@ -100,12 +107,12 @@ func (a *APIHandler) EditMember(c *gin.Context) {
if id != "" {
i, err = strconv.Atoi(id)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
a.logger.Error("EditMember", err)
c.JSON(http.StatusInternalServerError, nil)
return
}
} else {
a.logger.Error("EditMember", err)
c.JSON(http.StatusBadRequest, gin.H{
"message": "query parameter 'id' missing",
})
@@ -115,14 +122,14 @@ func (a *APIHandler) EditMember(c *gin.Context) {
var member models.Member
err = c.BindJSON(&member)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
a.logger.Error("EditMember", err)
c.JSON(http.StatusInternalServerError, nil)
return
}
err = a.DbHandler.UpdateMember(i, member)
if err != nil {
a.logger.Error("EditMember", err)
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
@@ -134,42 +141,49 @@ func (a *APIHandler) EditMember(c *gin.Context) {
}
func (a *APIHandler) DeleteMember(c *gin.Context) {
if !a.databaseOpened(c) {
if !a.DBHandlerIsInitialized() {
a.logger.Error("DeleteMember", "database handler is not initialized")
c.JSON(http.StatusInternalServerError, nil)
return
}
var err error
var request struct {
Ids []int `json:"ids"`
Ids []uint `json:"ids"`
}
err = c.BindJSON(&request)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
a.logger.Error("DeleteMember", err)
c.JSON(http.StatusInternalServerError, nil)
return
}
err = a.DbHandler.DeleteMember(request.Ids...)
if err != nil {
a.logger.Error("DeleteMember", err)
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "member deleted",
"message": "member(s) deleted",
})
}
func (a *APIHandler) ImportCSV(c *gin.Context) {
if !a.databaseOpened(c) {
if !a.DBHandlerIsInitialized() {
a.logger.Error("ImportCSV", "database handler is not initialized")
c.JSON(http.StatusInternalServerError, nil)
return
}
var err error
fileHeader, err := c.FormFile("file")
if err != nil {
a.logger.Error("ImportCSV", err)
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
@@ -188,7 +202,8 @@ func (a *APIHandler) ImportCSV(c *gin.Context) {
rowIndexI, err := strconv.Atoi(rowIndex)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
a.logger.Error("ImportCSV", err)
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
})
return
@@ -196,6 +211,7 @@ func (a *APIHandler) ImportCSV(c *gin.Context) {
file, err := fileHeader.Open()
if err != nil {
a.logger.Error("ImportCSV", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to open uploaded file"})
return
}
@@ -206,6 +222,7 @@ func (a *APIHandler) ImportCSV(c *gin.Context) {
buf := make([]byte, sniffSize)
n, err := file.Read(buf)
if err != nil && err != io.EOF {
a.logger.Error("ImportCSV", err)
c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
return
}
@@ -214,12 +231,14 @@ func (a *APIHandler) ImportCSV(c *gin.Context) {
detector := chardet.NewTextDetector()
result, err := detector.DetectBest(buf[:n])
if err != nil {
a.logger.Error("ImportCSV", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to detect encoding"})
return
}
_, err = file.Seek(0, io.SeekStart)
if err != nil {
a.logger.Error("ImportCSV", err)
c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to rewind file"})
return
}
@@ -234,6 +253,7 @@ func (a *APIHandler) ImportCSV(c *gin.Context) {
case "ISO-8859-1":
reader = transform.NewReader(file, charmap.ISO8859_1.NewDecoder())
default:
a.logger.Error("ImportCSV", "Unsupported encoding: "+result.Charset)
c.JSON(http.StatusBadRequest, gin.H{"message": "Unsupported encoding: " + result.Charset})
return
}
@@ -243,6 +263,7 @@ func (a *APIHandler) ImportCSV(c *gin.Context) {
records, err := csvReader.ReadAll()
if err != nil {
a.logger.Error("ImportCSV", err)
c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to parse CSV"})
return
}
@@ -298,6 +319,7 @@ func (a *APIHandler) ImportCSV(c *gin.Context) {
}
if message != "" {
a.logger.Error("ImportCSV", message)
c.JSON(http.StatusBadRequest, gin.H{
"message": message,
})