package dbhandle import ( "encoding/json" "fmt" "io" "log" "net/http" "strconv" "strings" "time" randomdata "github.com/Unbewohnte/crud-api/randomData" _ "github.com/mattn/go-sqlite3" ) // Check if a row with given id exists func (db *DB) Exists(id uint) (bool, error) { row, err := db.Query(fmt.Sprintf("SELECT * FROM %s WHERE id=%d", tableName, id)) if err != nil { return false, err } // there should be only one row, because we search with id for row.Next() { var realID uint var title string var text string var dateCreated int64 var lastUpdated int64 row.Scan(&realID, &title, &text, &dateCreated, &lastUpdated) fmt.Printf("real %d --- given %d\n", realID, id) if realID == id { return true, nil } } return false, nil } // Collect and return all rows in db func (db *DB) GetEverything() ([]*randomdata.RandomData, error) { rows, err := db.Query(fmt.Sprintf("SELECT * FROM %s", tableName)) if err != nil { return nil, err } var contents []*randomdata.RandomData for rows.Next() { var id uint var title string var text string var dateCreated int64 var lastUpdated int64 rows.Scan(&id, &title, &text, &dateCreated, &lastUpdated) var randomData = randomdata.RandomData{ ID: id, Title: title, Text: text, DateCreated: dateCreated, LastUpdated: lastUpdated, } contents = append(contents, &randomData) } return contents, nil } // Get `RandomData` from db with given id func (db *DB) GetSpecific(id uint) (*randomdata.RandomData, error) { row, err := db.Query(fmt.Sprintf("SELECT * FROM %s WHERE id=%d", tableName, id)) if err != nil { return nil, err } // there should be only one row, because we looked for a specific ID, which is a primary key for row.Next() { var id uint var title string var text string var dateCreated int64 var lastUpdated int64 row.Scan(&id, &title, &text, &dateCreated, &lastUpdated) var randomData = randomdata.RandomData{ ID: id, Title: title, Text: text, DateCreated: dateCreated, LastUpdated: lastUpdated, } return &randomData, nil } return nil, nil } // Delete `RandomData` from db with given id func (db *DB) DeleteSpecific(id uint) error { _, err := db.Exec(fmt.Sprintf("DELETE FROM %s WHERE id=%d", tableName, id)) if err != nil { return err } return nil } // Replace `Randomdata` in db with given id with a new one. // Does not affect `DateCreated` func (db *DB) UpdateSpecific(id uint, newRD randomdata.RandomData) error { // `DateCreated` won`t be changed because we`re patching an already existing thing _, err := db.Exec(fmt.Sprintf("UPDATE %s SET title='%s', text='%s', last_updated=%d WHERE id=%d", tableName, newRD.Title, newRD.Text, newRD.LastUpdated, id)) if err != nil { return err } return nil } // Create a new `RandomData` row in db func (db *DB) Create(rd randomdata.RandomData) error { _, err := db.Exec(fmt.Sprintf("INSERT INTO %s (title, text, date_created, last_updated) VALUES (?, ?, ?, ?)", tableName), rd.Title, rd.Text, rd.DateCreated, rd.LastUpdated) if err != nil { return err } return nil } // Handler function for all `RandomData`s in database func (db *DB) HandleGlobalWeb(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodPost: if r.Header.Get("content-type") != "application/json" { w.WriteHeader(http.StatusUnsupportedMediaType) return } defer r.Body.Close() body, err := io.ReadAll(r.Body) if err != nil { w.WriteHeader(http.StatusBadRequest) return } var randomData randomdata.RandomData err = json.Unmarshal(body, &randomData) if err != nil { w.WriteHeader(http.StatusBadRequest) return } // create date created, last updated randomData.DateCreated = time.Now().UTC().Unix() randomData.LastUpdated = time.Now().UTC().Unix() err = db.Create(randomData) if err != nil { log.Printf("Could not create a row: %s", err) } w.WriteHeader(http.StatusAccepted) case http.MethodGet: randomDatas, err := db.GetEverything() if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Could not retrieve db contents: %s\n", err) return } randomDatasJsonBytes, err := randomdata.ToJsonAll(randomDatas, true) if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Could not convert to json: %s\n", err) return } w.Write(randomDatasJsonBytes) default: w.WriteHeader(http.StatusMethodNotAllowed) } } // Handler function for a specific `RandomData` in database func (db *DB) HandleSpecificWeb(w http.ResponseWriter, r *http.Request) { providedIDstr := strings.Split(r.RequestURI, "/")[2] providedID, err := strconv.ParseUint(providedIDstr, 10, 32) if err != nil { // most likely a bad id w.WriteHeader(http.StatusBadRequest) return } switch r.Method { case http.MethodGet: randomData, err := db.GetSpecific(uint(providedID)) if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Could not retrieve a specific RandomData: %s\n", err) return } rdJsonBytes, err := randomData.ToJson() if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Could not convert RandomData to Json: %s\n", err) return } w.Write(rdJsonBytes) case http.MethodDelete: err := db.DeleteSpecific(uint(providedID)) if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Could not delete from db: %s\n", err) return } case http.MethodPatch: if r.Header.Get("content-type") != "application/json" { w.WriteHeader(http.StatusUnsupportedMediaType) return } defer r.Body.Close() body, err := io.ReadAll(r.Body) if err != nil { w.WriteHeader(http.StatusBadRequest) return } var randomData randomdata.RandomData err = json.Unmarshal(body, &randomData) if err != nil { w.WriteHeader(http.StatusBadRequest) return } // create date created, last updated randomData.LastUpdated = time.Now().UTC().Unix() err = db.UpdateSpecific(uint(providedID), randomData) if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Could not update a RandomData: %s\n", err) return } w.WriteHeader(http.StatusAccepted) default: w.WriteHeader(http.StatusMethodNotAllowed) } }