This commit is contained in:
2024-04-10 00:14:11 +02:00
parent c60dd3357f
commit 49f7be2a35
10 changed files with 93 additions and 20 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
*.exe *.exe
tmp-build

3
env.bat Normal file
View File

@ -0,0 +1,3 @@
set PATH=C:\TDM-GCC-64\bin;%PATH%
set CGOENABLED=1
set GOTMPDIR=.\tmp-build

34
model/time.go Normal file
View File

@ -0,0 +1,34 @@
package model
import (
"time"
"errors"
sqldriver "database/sql/driver"
)
type Time time.Time
func MakeTimeNow() Time {
return Time(time.Now().UTC())
}
func (self Time) String() string {
return time.Time(self).String()
}
func (self Time) Value() (sqldriver.Value, error) {
return time.Time(self).Format(time.RFC3339), nil
}
func (self *Time) Scan(value any) error {
if valueStr, ok := value.(string); ok {
parsedTime, err := time.Parse(time.RFC3339, valueStr)
if err == nil {
*self = Time(parsedTime.UTC())
}
return err
} else {
return errors.New("Expected a string")
}
}

View File

@ -3,5 +3,7 @@ package model
type Timer struct { type Timer struct {
Id UUID Id UUID
Name string Name string
StartTime Time
EndTime Time
} }

View File

@ -9,13 +9,13 @@ type UUID struct {
payload uuid.UUID payload uuid.UUID
} }
func NewUUID() UUID { func MakeUUID() UUID {
id, _ := uuid.NewRandom() id, _ := uuid.NewRandom()
return UUID { payload: id } return UUID { payload: id }
} }
func (self UUID) Value() (sqldriver.Value, error) { func (self UUID) Value() (sqldriver.Value, error) {
return self.payload.MarshalBinary() return self.payload[:], nil
} }
func (self *UUID) Scan(value any) error { func (self *UUID) Scan(value any) error {

View File

@ -19,28 +19,32 @@ func initializeDatabase(db *sql.DB) error {
_, err = tx.Exec(` _, err = tx.Exec(`
CREATE TABLE Timer ( CREATE TABLE Timer (
id BLOB NOT NULL UNIQUE, Id BLOB NOT NULL UNIQUE,
name TEXT NOT NULL, Name TEXT NOT NULL,
StartTime TEXT NOT NULL,
EndTime TEXT NOT NULL,
PRIMARY KEY (id) PRIMARY KEY (id)
) )
`) `)
if err != nil { return err } if err != nil { return err }
id := model.NewUUID() now := model.MakeTimeNow()
id := model.MakeUUID()
_, err = tx.Exec(` _, err = tx.Exec(`
INSERT INTO Timer VALUES ($1, $2)`, id, "My timer"); INSERT INTO Timer VALUES ($1, $2, $3, $4)`, id, "My timer", now, now);
if err != nil { return err } if err != nil { return err }
id = model.NewUUID() id = model.MakeUUID()
_, err = tx.Exec(` _, err = tx.Exec(`
INSERT INTO Timer VALUES ($1, $2)`, id, "My timer 2"); INSERT INTO Timer VALUES ($1, $2, $3, $4)`, id, "My timer 2", now, now);
if err != nil { return err } if err != nil { return err }
return tx.Commit() return tx.Commit()
} }
func queryAllTimers(db *sql.DB) []model.Timer { func queryAllTimers(db *sql.DB) []model.Timer {
rows, err := db.Query("SELECT id, name FROM Timer") rows, err := db.Query("SELECT Id, Name FROM Timer")
if err != nil { log.Fatalln(err) } if err != nil { log.Fatalln(err) }
timers := []model.Timer{} timers := []model.Timer{}
@ -58,10 +62,10 @@ func queryTimer(db *sql.DB, idStr string) *model.Timer {
var id model.UUID var id model.UUID
if err := id.Scan(idStr); err != nil { return nil } if err := id.Scan(idStr); err != nil { return nil }
row := db.QueryRow("SELECT id, name FROM Timer WHERE id=$1", id) row := db.QueryRow("SELECT Id, Name, StartTime, EndTime FROM Timer WHERE Id=$1", id)
var t model.Timer var t model.Timer
if err := row.Scan(&t.Id, &t.Name); err == nil { if err := row.Scan(&t.Id, &t.Name, &t.StartTime, &t.EndTime); err == nil {
return &t return &t
} }
@ -96,7 +100,7 @@ func (server *myServer) handleTimer(w http.ResponseWriter, r *http.Request) {
} }
func main() { func main() {
log.Println("Hello") log.Println("Starting...")
db, err := sql.Open("sqlite3", ":memory:") db, err := sql.Open("sqlite3", ":memory:")
if err != nil { if err != nil {
@ -116,6 +120,7 @@ func main() {
http.HandleFunc("/timer/{timerId}", myServer.handleTimer) http.HandleFunc("/timer/{timerId}", myServer.handleTimer)
http.HandleFunc("/", myServer.handleMain) http.HandleFunc("/", myServer.handleMain)
log.Println("Started!")
http.ListenAndServe("0.0.0.0:80", nil) http.ListenAndServe("0.0.0.0:80", nil)
} }

View File

@ -5,6 +5,8 @@ import (
) )
templ TimerView(timer model.Timer) { templ TimerView(timer model.Timer) {
<h1>This is timer { timer.Name }</h1> <h1>This is timer { timer.Name } </h1>
<a href="/">Back to list</a> <p><a href="/">Back to list</a></p>
<p>Start time: { timer.StartTime.String() }</p>
<p>End time: { timer.EndTime.String() }</p>
} }

View File

@ -40,7 +40,33 @@ func TimerView(timer model.Timer) templ.Component {
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
} }
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</h1><a href=\"/\">Back to list</a>") _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</h1><p><a href=\"/\">Back to list</a></p><p>Start time: ")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var3 string
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(timer.StartTime.String())
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `view\timer.templ`, Line: 10, Col: 45}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p><p>End time: ")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var4 string
templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(timer.EndTime.String())
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `view\timer.templ`, Line: 11, Col: 41}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</p>")
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
} }

View File

@ -6,7 +6,7 @@ import (
) )
templ timer(t model.Timer) { templ timer(t model.Timer) {
<p><a href={ templ.URL(fmt.Sprintf("/timer/%s", t.Id)) }>{ t.Name }</a></p> <p><a href={ templ.URL(fmt.Sprint("/timer/", t.Id)) }>{ t.Name }</a></p>
} }
templ TimersList(timers []model.Timer) { templ TimersList(timers []model.Timer) {

View File

@ -32,7 +32,7 @@ func timer(t model.Timer) templ.Component {
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
} }
var templ_7745c5c3_Var2 templ.SafeURL = templ.URL(fmt.Sprintf("/timer/%s", t.Id)) var templ_7745c5c3_Var2 templ.SafeURL = templ.URL(fmt.Sprint("/timer/", t.Id))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var2))) _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var2)))
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
@ -44,7 +44,7 @@ func timer(t model.Timer) templ.Component {
var templ_7745c5c3_Var3 string var templ_7745c5c3_Var3 string
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(t.Name) templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(t.Name)
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `view\timers_list.templ`, Line: 9, Col: 69} return templ.Error{Err: templ_7745c5c3_Err, FileName: `view\timers_list.templ`, Line: 9, Col: 66}
} }
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {