From 79c7d39759d7d84dd82dbe08f5bccabf50431cb8 Mon Sep 17 00:00:00 2001 From: "Stanislav N. aka pztrn" Date: Mon, 30 Apr 2018 23:07:07 +0500 Subject: [PATCH] Moved SQL queries from model to separate queries file. --- pastes/api_http.go | 8 ++--- pastes/model.go | 44 ---------------------------- pastes/queries.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 49 deletions(-) create mode 100644 pastes/queries.go diff --git a/pastes/api_http.go b/pastes/api_http.go index ae00571..e0b7ee8 100644 --- a/pastes/api_http.go +++ b/pastes/api_http.go @@ -57,8 +57,7 @@ func pasteGET(ec echo.Context) error { c.Logger.Debug().Msgf("Requesting paste #%+v", pasteID) // Get paste. - paste := &Paste{ID: pasteID} - err1 := paste.GetByID(c.Database.GetDatabaseConnection()) + paste, err1 := GetByID(pasteID) if err1 != nil { c.Logger.Error().Msgf("Failed to get paste #%d from database: %s", pasteID, err1.Error()) return ec.HTML(http.StatusBadRequest, string(errhtml)) @@ -120,7 +119,7 @@ func pastePOST(ec echo.Context) error { keepForUnit := PASTE_KEEPS_CORELLATION[keepForUnitRaw] paste.KeepForUnitType = keepForUnit - id, err2 := paste.Save(c.Database.GetDatabaseConnection()) + id, err2 := Save(paste) if err2 != nil { c.Logger.Debug().Msgf("Failed to save paste: %s", err2.Error()) return ec.HTML(http.StatusBadRequest, string(errhtml)) @@ -152,9 +151,8 @@ func pastesGET(ec echo.Context) error { c.Logger.Debug().Msgf("Requested page #%d", page) - p := &Paste{} // Get pastes IDs. - pastes, err3 := p.GetPagedPastes(c.Database.GetDatabaseConnection(), page) + pastes, err3 := GetPagedPastes(page) c.Logger.Debug().Msgf("Got %d pastes", len(pastes)) var pastesString = "No pastes to show." diff --git a/pastes/model.go b/pastes/model.go index 0722e23..513f21f 100644 --- a/pastes/model.go +++ b/pastes/model.go @@ -27,9 +27,6 @@ package pastes import ( // stdlib "time" - - // other - "github.com/jmoiron/sqlx" ) const ( @@ -57,44 +54,3 @@ type Paste struct { KeepFor int `db:"keep_for"` KeepForUnitType int `db:"keep_for_unit_type"` } - -func (p *Paste) GetByID(db *sqlx.DB) error { - err := db.Get(p, db.Rebind("SELECT * FROM `pastes` WHERE id=?"), p.ID) - if err != nil { - return err - } - - return nil -} - -func (p *Paste) GetPagedPastes(db *sqlx.DB, page int) ([]Paste, error) { - var pastes []Paste - - // Pagination - 30 pastes on page. - var startPagination = 0 - if page > 1 { - startPagination = (page - 1) * 30 - } - - err := db.Select(&pastes, db.Rebind("SELECT * FROM `pastes` ORDER BY id DESC LIMIT 30 OFFSET ?"), startPagination) - if err != nil { - return nil, err - } - - return pastes, nil - -} - -func (p *Paste) Save(db *sqlx.DB) (int64, error) { - result, err := db.NamedExec("INSERT INTO `pastes` (title, data, created_at, keep_for, keep_for_unit_type) VALUES (:title, :data, :created_at, :keep_for, :keep_for_unit_type)", p) - if err != nil { - return 0, err - } - - ID, err1 := result.LastInsertId() - if err1 != nil { - return 0, err - } - - return ID, nil -} diff --git a/pastes/queries.go b/pastes/queries.go new file mode 100644 index 0000000..6b2218a --- /dev/null +++ b/pastes/queries.go @@ -0,0 +1,73 @@ +// Fast Paste Bin - uberfast and easy-to-use pastebin. +// +// Copyright (c) 2018, Stanislav N. aka pztrn and Fast Paste Bin +// developers. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject +// to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package pastes + +// GetByID returns a single paste by ID. +func GetByID(id int) (*Paste, error) { + p := &Paste{} + dbConn := c.Database.GetDatabaseConnection() + err := dbConn.Get(p, dbConn.Rebind("SELECT * FROM `pastes` WHERE id=?"), id) + if err != nil { + return nil, err + } + + return p, nil +} + +// GetPagedPastes returns a paged slice of pastes. +func GetPagedPastes(page int) ([]Paste, error) { + var pastes []Paste + dbConn := c.Database.GetDatabaseConnection() + + // Pagination - 30 pastes on page. + var startPagination = 0 + if page > 1 { + startPagination = (page - 1) * 30 + } + + err := dbConn.Select(&pastes, dbConn.Rebind("SELECT * FROM `pastes` ORDER BY id DESC LIMIT 30 OFFSET ?"), startPagination) + if err != nil { + return nil, err + } + + return pastes, nil + +} + +// Save saves paste to database and returns it's ID. +func Save(p *Paste) (int64, error) { + dbConn := c.Database.GetDatabaseConnection() + result, err := dbConn.NamedExec("INSERT INTO `pastes` (title, data, created_at, keep_for, keep_for_unit_type) VALUES (:title, :data, :created_at, :keep_for, :keep_for_unit_type)", p) + if err != nil { + return 0, err + } + + ID, err1 := result.LastInsertId() + if err1 != nil { + return 0, err + } + + return ID, nil +}