Bad .gitignore removed all the db.go files.

master
Zed A. Shaw 23 hours ago
parent 6bcec26be1
commit 28a2c991a2
  1. 2
      .gitignore
  2. 174
      features/admin/db.go
  3. 46
      features/auth/db.go
  4. 9
      features/email/db.go
  5. 9
      features/fakepay/db.go
  6. 9
      features/paypal/db.go
  7. 9
      features/shopping/db.go
  8. 9
      features/survey/db.go
  9. 9
      tools/cmd/fgen/templates/feature/db.go

2
.gitignore vendored

@ -34,4 +34,4 @@ public
webapp webapp
bin bin
static/style.css static/style.css
db.* db.sqlite3*

@ -0,0 +1,174 @@
package features_admin
import (
"reflect"
"fmt"
"errors"
"MY/webapp/data"
_ "github.com/mattn/go-sqlite3"
sq "github.com/Masterminds/squirrel"
)
func Schema(table string) ([]string, error) {
the_type, ok := data.Models()[table]
if !ok { return nil, errors.New("Invalid table") }
field_num := the_type.NumField()
fields := make([]string, 0, field_num)
for i := 0; i < field_num; i++ {
tag := the_type.Field(i).Name
fields = append(fields, tag)
}
return fields, nil
}
func SearchTable(search string, table string, limit uint64, page uint64) ([]any, error) {
var results []any
the_type := data.Models()[table]
like := fmt.Sprint("%", search, "%")
builder := sq.Select("*").
Limit(limit).
Offset(limit * page).
From(table)
field_num := the_type.NumField()
var or_clause sq.Or
for i := 0; i < field_num; i++ {
tag := the_type.Field(i).Tag.Get("db")
or_clause = append(or_clause, sq.Like{tag: like})
}
builder = builder.Where(or_clause)
sql_query, args, err := builder.ToSql()
if err != nil { return results, err }
// BUG: refactor this to share a common func with SelectTable
rows, err := data.DB.Queryx(sql_query, args...)
if err != nil { return results, err }
defer rows.Close()
for rows.Next() {
the_data := reflect.New(the_type).Interface()
err = rows.StructScan(the_data)
if err != nil { return results, err }
results = append(results, the_data)
}
return results, rows.Err()
}
func SelectTable(table string, limit uint64, page uint64) ([]any, error) {
var results []any
the_type := data.Models()[table]
sql_query, args, err := sq.Select("*").
Limit(limit).
Offset(limit * page).
From(table).
ToSql()
if err != nil { return results, err }
rows, err := data.DB.Queryx(sql_query, args...)
if err != nil { return results, err }
defer rows.Close()
for rows.Next() {
the_data := reflect.New(the_type).Interface()
err = rows.StructScan(the_data)
if err != nil { return results, err }
results = append(results, the_data)
}
return results, rows.Err()
}
func Get(table string, id int64) (reflect.Value, error) {
the_type := data.Models()[table]
sql_query, args, err := sq.Select("*").From(table).Where(sq.Eq{"id": id}).ToSql()
if err != nil { return reflect.New(nil), err }
the_data := reflect.New(the_type)
err = data.DB.Get(the_data.Interface(), sql_query, args...)
// BUG: not sure if Elem or returning the reflect.New is better
return the_data.Elem(), err
}
func Delete(table string, id int64) error {
sql_query, args, err := sq.Delete(table).Where(sq.Eq{"id": id}).ToSql()
if err != nil { return err }
_, err = data.DB.Exec(sql_query, args...)
return err
}
func Insert(table string, value reflect.Value) (int64, int64, error) {
type_of := value.Type()
field_num := value.NumField()
var columns []string
var values []any
for i := 0; i < field_num; i++ {
field := value.Field(i)
tag := type_of.Field(i).Tag.Get("db")
if tag == "id" { continue }
columns = append(columns, tag)
values = append(values, field.Interface())
}
builder := sq.Insert(table).Columns(columns...).Values(values...)
sql_query, args, err := builder.ToSql()
if err != nil { return -1, -1, err }
result, err := data.DB.Exec(sql_query, args...)
if err != nil { return -1, -1, err }
id, err := result.LastInsertId()
if err != nil { return -1, -1, err }
count, err := result.RowsAffected()
if err != nil { return id, -1, err }
return id, count, err
}
func Update(table string, value reflect.Value) (int64, error) {
builder := sq.Update(table)
orig_id := value.FieldByName("Id").Int()
type_of := value.Type()
field_num := value.NumField()
for i := 0; i < field_num; i++ {
field := value.Field(i)
tag := type_of.Field(i).Tag.Get("db")
// skip update of id to avoid replacing it
if tag == "id" { continue }
builder = builder.Set(tag, field.Interface())
}
builder = builder.Where(sq.Eq{"id": orig_id})
sql_query, args, err := builder.ToSql()
if err != nil { return -1, err }
fmt.Println("UPDATE QUERY", sql_query, args)
if err != nil { return -1, err}
_, err = data.DB.Exec(sql_query, args...)
if err != nil { return -1, err }
return orig_id, err
}

@ -0,0 +1,46 @@
package features_auth
import (
"golang.org/x/crypto/bcrypt"
"github.com/gofiber/fiber/v2"
_ "github.com/mattn/go-sqlite3"
sq "github.com/Masterminds/squirrel"
"MY/webapp/data"
"MY/webapp/common"
)
func SetUserPassword(user *data.User) error {
hashed, err := bcrypt.GenerateFromPassword([]byte(user.Password), 12)
if err != nil { return err }
user.Password = string(hashed)
return nil
}
func LogoutUser(c *fiber.Ctx) error {
sess, err := common.STORE.Get(c)
if err != nil { return err }
err = sess.Destroy()
if err != nil { return err }
err = sess.Save()
return err
}
func LoginUser(result *data.User, login *data.Login) (bool, error) {
sql, args, err := sq.Select("username, password").
From("user").Where("username=?", login.Username).ToSql()
if err != nil { return false, err }
err = data.DB.Get(result, sql, args...)
if err != nil { return false, err }
pass_good := bcrypt.CompareHashAndPassword([]byte(result.Password), []byte(login.Password))
if pass_good != nil { return false, pass_good }
return login.Username == result.Username && pass_good == nil, nil
}

@ -0,0 +1,9 @@
package features_email
import (
// "MY/webapp/data"
// _ "github.com/mattn/go-sqlite3"
// sq "github.com/Masterminds/squirrel"
)

@ -0,0 +1,9 @@
package features_fakepay
import (
// "MY/webapp/data"
// _ "github.com/mattn/go-sqlite3"
// sq "github.com/Masterminds/squirrel"
)

@ -0,0 +1,9 @@
package features_paypal
import (
// "MY/webapp/data"
// _ "github.com/mattn/go-sqlite3"
// sq "github.com/Masterminds/squirrel"
)

@ -0,0 +1,9 @@
package features_shopping
import (
// "MY/webapp/data"
// _ "github.com/mattn/go-sqlite3"
// sq "github.com/Masterminds/squirrel"
)

@ -0,0 +1,9 @@
package features_survey
import (
// "MY/webapp/data"
// _ "github.com/mattn/go-sqlite3"
// sq "github.com/Masterminds/squirrel"
)

@ -0,0 +1,9 @@
package features_{{ .Name }}
import (
// "MY/webapp/data"
// _ "github.com/mattn/go-sqlite3"
// sq "github.com/Masterminds/squirrel"
)
Loading…
Cancel
Save