84 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"log"
 | 
						|
)
 | 
						|
 | 
						|
type GuildService struct {
 | 
						|
	db *DB
 | 
						|
}
 | 
						|
type GuildServiceQuery struct {
 | 
						|
	Name *string `db:"name"`
 | 
						|
	ID   *int64  `db:"id"`
 | 
						|
}
 | 
						|
 | 
						|
func (gs *GuildService) Query(query GuildServiceQuery) ([]Guild, error) {
 | 
						|
	res := []Guild{}
 | 
						|
	sqlQuery := "SELECT id, name FROM guild"
 | 
						|
	whereQuery := BuildWhereQuery(query)
 | 
						|
	if whereQuery != "" {
 | 
						|
		sqlQuery += " " + whereQuery
 | 
						|
	}
 | 
						|
 | 
						|
	rows, err := gs.db.readConn.Query(sqlQuery)
 | 
						|
	if err != nil {
 | 
						|
		return res, fmt.Errorf("failed getting guilds for query %q: %v", sqlQuery, err)
 | 
						|
	}
 | 
						|
	defer rows.Close()
 | 
						|
 | 
						|
	for rows.Next() {
 | 
						|
		guild := Guild{}
 | 
						|
		err := rows.Scan(&guild.ID, &guild.Name)
 | 
						|
		if err != nil {
 | 
						|
			return res, fmt.Errorf("failed scanning guild: %v", err)
 | 
						|
		}
 | 
						|
		res = append(res, guild)
 | 
						|
	}
 | 
						|
 | 
						|
	return res, nil
 | 
						|
}
 | 
						|
 | 
						|
func (gs *GuildService) Create(name string) (Guild, error) {
 | 
						|
	log.Printf("Creating guild %s", name)
 | 
						|
	guild := Guild{}
 | 
						|
	res, err := gs.db.writeConn.Exec("insert into guild (name) values (?)", name)
 | 
						|
	if err != nil {
 | 
						|
		return guild, fmt.Errorf("failed to insert guild: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	id, err := res.LastInsertId()
 | 
						|
	if err != nil {
 | 
						|
		return guild, fmt.Errorf("failed to get last insert id: %v", err)
 | 
						|
	}
 | 
						|
	log.Printf("Created guild %s with id %d", name, id)
 | 
						|
 | 
						|
	qres, err := gs.Query(GuildServiceQuery{ID: &id})
 | 
						|
	if err != nil {
 | 
						|
		return guild, fmt.Errorf("failed getting guild for id %d: %v", id, err)
 | 
						|
	}
 | 
						|
	if len(qres) > 1 {
 | 
						|
		return guild, fmt.Errorf("more than one guild found for id %d", id)
 | 
						|
	}
 | 
						|
 | 
						|
	return qres[0], nil
 | 
						|
}
 | 
						|
 | 
						|
func (gs *GuildService) GetOrCreate(name string) (Guild, error) {
 | 
						|
	guild := Guild{}
 | 
						|
	guilds, err := gs.Query(GuildServiceQuery{Name: &name})
 | 
						|
	if len(guilds) > 1 {
 | 
						|
		return guild, fmt.Errorf("more than one guild found for name %s", name)
 | 
						|
	}
 | 
						|
	if err != nil || len(guilds) == 0 {
 | 
						|
		guild, err = gs.Create(name)
 | 
						|
		if err != nil {
 | 
						|
			return guild, fmt.Errorf("failed creating guild: %v", err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if len(guilds) == 1 {
 | 
						|
		guild = guilds[0]
 | 
						|
	}
 | 
						|
	return guild, nil
 | 
						|
}
 |