72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"log"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
type NoteService struct {
 | 
						|
	db *DB
 | 
						|
}
 | 
						|
type NoteServiceQuery struct {
 | 
						|
	Timestamp *string `db:"timestamp"`
 | 
						|
	PlayerID  *int64  `db:"player"`
 | 
						|
	ID        *int64  `db:"id"`
 | 
						|
}
 | 
						|
 | 
						|
func (ns *NoteService) Query(query NoteServiceQuery) ([]Note, error) {
 | 
						|
	res := []Note{}
 | 
						|
	sqlQuery := "SELECT id, content, timestamp, player FROM note"
 | 
						|
	whereQuery := BuildWhereQuery(query)
 | 
						|
	if whereQuery != "" {
 | 
						|
		sqlQuery += " " + whereQuery
 | 
						|
	}
 | 
						|
 | 
						|
	rows, err := ns.db.readConn.Query(sqlQuery)
 | 
						|
	if err != nil {
 | 
						|
		return res, fmt.Errorf("failed getting notes for query %q: %v", sqlQuery, err)
 | 
						|
	}
 | 
						|
	defer rows.Close()
 | 
						|
 | 
						|
	for rows.Next() {
 | 
						|
		note := Note{}
 | 
						|
		var ts string
 | 
						|
		err := rows.Scan(¬e.ID, ¬e.Content, &ts, ¬e.Player.ID)
 | 
						|
		if err != nil {
 | 
						|
			return res, fmt.Errorf("failed scanning note: %v", err)
 | 
						|
		}
 | 
						|
		note.Timestamp, err = time.Parse(time.RFC3339, ts)
 | 
						|
		if err != nil {
 | 
						|
			return res, fmt.Errorf("failed parsing timestamp: %v", err)
 | 
						|
		}
 | 
						|
		res = append(res, note)
 | 
						|
	}
 | 
						|
 | 
						|
	return res, nil
 | 
						|
}
 | 
						|
 | 
						|
func (ns *NoteService) Create(content string, timestamp time.Time, player Player) (Note, error) {
 | 
						|
	log.Printf("Creating note %q with timestamp %s and player %d", content, timestamp, player.ID)
 | 
						|
	note := Note{}
 | 
						|
	res, err := ns.db.writeConn.Exec("insert into note (content, timestamp, player) values (?, ?, ?)", content, timestamp.Format(time.RFC3339), player.ID)
 | 
						|
	if err != nil {
 | 
						|
		return note, fmt.Errorf("failed to insert note: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	id, err := res.LastInsertId()
 | 
						|
	if err != nil {
 | 
						|
		return note, fmt.Errorf("failed to get last insert id: %v", err)
 | 
						|
	}
 | 
						|
	log.Printf("Created note %q with timestamp %s and player %d with id %d", content, timestamp, player.ID, id)
 | 
						|
 | 
						|
	qres, err := ns.Query(NoteServiceQuery{ID: &id})
 | 
						|
	if err != nil {
 | 
						|
		return note, fmt.Errorf("failed getting note for id %d: %v", id, err)
 | 
						|
	}
 | 
						|
	if len(qres) > 1 {
 | 
						|
		return note, fmt.Errorf("more than one note found for id %d", id)
 | 
						|
	}
 | 
						|
 | 
						|
	return qres[0], nil
 | 
						|
} |