136 lines
3.2 KiB
Go
Executable File
136 lines
3.2 KiB
Go
Executable File
package controllers
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"github.com/jmoiron/sqlx"
|
|
"go_project/internal/models"
|
|
"log"
|
|
)
|
|
|
|
type (
|
|
ListTableParams struct {
|
|
Limit int `db:"limit" json:"limit"`
|
|
Offset int `db:"offset" json:"offset"`
|
|
}
|
|
|
|
CreateTableParams struct {
|
|
Name int `db:"name" json:"name"`
|
|
MaxPeople int `db:"max_people" json:"max_people"`
|
|
Room string `db:"room" json:"room"`
|
|
}
|
|
|
|
UpdateTableParams struct {
|
|
Id int `db:"id" json:"id"`
|
|
Name int `db:"name" json:"name"`
|
|
MaxPeople int `db:"max_people" json:"max_people"`
|
|
Room string `db:"room" json:"room"`
|
|
}
|
|
)
|
|
|
|
func TableById(db *sqlx.DB, id int) (*models.Table, error) {
|
|
rows, err := db.Query("SELECT * FROM Tables WHERE id = ?", id)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
if isEmpty := !rows.Next(); isEmpty {
|
|
return nil, nil
|
|
}
|
|
|
|
result := new(models.Table)
|
|
err = rows.Scan(&result.Id, &result.Name, &result.MaxPeople, &result.Room)
|
|
|
|
return result, err
|
|
}
|
|
|
|
func AllTables(db *sqlx.DB, params ListTableParams) ([]models.Table, error) {
|
|
query := `SELECT * FROM Tables ORDER BY id LIMIT $1 OFFSET $2`
|
|
|
|
rows, err := db.Query(query, params.Limit, params.Offset)
|
|
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var result []models.Table
|
|
for rows.Next() {
|
|
var currentTable models.Table
|
|
|
|
err = rows.Scan(¤tTable.Id, ¤tTable.Name, ¤tTable.MaxPeople, ¤tTable.Room)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result = append(result, currentTable)
|
|
}
|
|
return result, err
|
|
}
|
|
|
|
func CreateTable(db *sqlx.DB, params CreateTableParams) (*models.Table, error) {
|
|
query := `
|
|
INSERT INTO Tables (name, max_people, room)
|
|
VALUES (?, ?, ?)
|
|
RETURNING id, name, max_people, room
|
|
`
|
|
|
|
var table models.Table
|
|
|
|
err := db.QueryRow(query, params.Name, params.MaxPeople, params.Room).Scan(
|
|
&table.Id,
|
|
&table.Name,
|
|
&table.MaxPeople,
|
|
&table.Room,
|
|
)
|
|
if err != nil {
|
|
log.Printf("CreateTable: Insertion operation of the Tables object is failed: %v\n", err)
|
|
return nil, err
|
|
}
|
|
|
|
log.Println("CreateTable: Insertion operation of the Tables object is successful")
|
|
return &table, nil
|
|
}
|
|
|
|
func DeleteTableById(db *sqlx.DB, id int) (sql.Result, error) {
|
|
sqlResult, err := db.Exec("DELETE FROM Tables WHERE id = ?", id)
|
|
|
|
if err == nil {
|
|
log.Println("DeleteTableById: Deletion operation of the Tables object is successful")
|
|
}
|
|
|
|
return sqlResult, err
|
|
}
|
|
|
|
func UpdateTable(db *sqlx.DB, params UpdateTableParams) (*models.Table, error) {
|
|
query := `
|
|
UPDATE Tables
|
|
SET name = $1, max_people = $2, room = $3
|
|
WHERE id = $4
|
|
RETURNING id, name, max_people, room
|
|
`
|
|
|
|
result := &models.Table{}
|
|
err := db.QueryRow(query, params.Name, params.MaxPeople, params.Room, params.Id).
|
|
Scan(&result.Id, &result.Name, &result.MaxPeople, &result.Room)
|
|
if err != nil {
|
|
switch {
|
|
case errors.Is(err, sql.ErrNoRows):
|
|
log.Printf("No rows affected for Table ID %d", params.Id)
|
|
return nil, errors.New("no rows affected: update failed")
|
|
default:
|
|
log.Printf("Query execution error for Table ID %d: %v", params.Id, err)
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
log.Printf("Table ID %d updated successfully", result.Id)
|
|
return result, nil
|
|
}
|