You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
3.2 KiB
Go
168 lines
3.2 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
"git.phc.dm.unipi.it/aziis98/posti-dm/server/util"
|
|
)
|
|
|
|
// memDB is the first Store implementation used for testing.
|
|
type memDB struct {
|
|
mutex *sync.Mutex
|
|
|
|
users map[string]*User
|
|
rooms map[string]*Room
|
|
seats map[string]*Seat
|
|
}
|
|
|
|
func (db *memDB) BeginTransaction() {
|
|
db.mutex.Lock()
|
|
}
|
|
|
|
func (db *memDB) EndTransaction() {
|
|
db.mutex.Unlock()
|
|
}
|
|
|
|
func (db *memDB) CreateUser(user *User) error {
|
|
if _, present := db.users[user.ID]; present {
|
|
return ErrAlreadyExists
|
|
}
|
|
db.users[user.ID] = user
|
|
return nil
|
|
}
|
|
|
|
func (db *memDB) CreateRoom(room *Room) error {
|
|
if _, present := db.rooms[room.ID]; present {
|
|
return ErrAlreadyExists
|
|
}
|
|
db.rooms[room.ID] = room
|
|
return nil
|
|
}
|
|
|
|
func (db *memDB) CreateSeat(seat *Seat) error {
|
|
if _, present := db.seats[seat.ID]; present {
|
|
return ErrAlreadyExists
|
|
}
|
|
db.seats[seat.ID] = seat
|
|
return nil
|
|
}
|
|
|
|
func (db *memDB) DeleteUser(user *User) error {
|
|
if _, present := db.users[user.ID]; !present {
|
|
return ErrDoesntExist
|
|
}
|
|
|
|
delete(db.users, user.ID)
|
|
return nil
|
|
}
|
|
|
|
func (db *memDB) DeleteRoom(room *Room) error {
|
|
if _, present := db.rooms[room.ID]; !present {
|
|
return ErrDoesntExist
|
|
}
|
|
|
|
delete(db.rooms, room.ID)
|
|
return nil
|
|
}
|
|
|
|
func (db *memDB) DeleteSeat(seat *Seat) error {
|
|
if _, present := db.seats[seat.ID]; !present {
|
|
return ErrDoesntExist
|
|
}
|
|
|
|
delete(db.seats, seat.ID)
|
|
return nil
|
|
}
|
|
|
|
func (db *memDB) GetUser(userID string) (*User, error) {
|
|
user, present := db.users[userID]
|
|
if !present {
|
|
return nil, fmt.Errorf(`no such user "%s"`, userID)
|
|
}
|
|
|
|
return user, nil
|
|
}
|
|
|
|
func (db *memDB) GetRoom(roomID string) (*Room, error) {
|
|
room, present := db.rooms[roomID]
|
|
if !present {
|
|
return nil, fmt.Errorf(`no such room "%s"`, roomID)
|
|
}
|
|
|
|
return room, nil
|
|
}
|
|
|
|
func (db *memDB) GetSeat(seatID string) (*Seat, error) {
|
|
seat, present := db.seats[seatID]
|
|
if !present {
|
|
return nil, fmt.Errorf(`no such seat "%s"`, seatID)
|
|
}
|
|
|
|
return seat, nil
|
|
}
|
|
|
|
func (db *memDB) GetRooms() ([]string, error) {
|
|
roomIDs := []string{}
|
|
|
|
for roomID := range db.rooms {
|
|
roomIDs = append(roomIDs, roomID)
|
|
}
|
|
|
|
return roomIDs, nil
|
|
}
|
|
|
|
func (db *memDB) GetRoomOccupiedSeats(roomID string) ([]string, error) {
|
|
room, err := db.GetRoom(roomID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
seats := []string{}
|
|
for _, seatID := range room.SeatIDs {
|
|
seat := db.seats[seatID]
|
|
if len(seat.OccupiedBy) == 1 {
|
|
seats = append(seats, seatID)
|
|
}
|
|
}
|
|
|
|
return seats, nil
|
|
}
|
|
|
|
func (db *memDB) GetRoomFreeSeats(roomID string) ([]string, error) {
|
|
room, err := db.GetRoom(roomID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
seats := []string{}
|
|
for _, seatID := range room.SeatIDs {
|
|
seat := db.seats[seatID]
|
|
if len(seat.OccupiedBy) == 0 {
|
|
seats = append(seats, seatID)
|
|
}
|
|
}
|
|
|
|
return seats, nil
|
|
}
|
|
|
|
func (db *memDB) GetUserSeats(userID string) (util.StringSet, error) {
|
|
for _, seat := range db.seats {
|
|
if len(seat.OccupiedBy) > 0 && seat.OccupiedBy[0] == userID {
|
|
return util.NewStringSet(seat.ID), nil
|
|
}
|
|
}
|
|
|
|
return util.NewStringSet(), nil
|
|
}
|
|
|
|
func (db *memDB) OccupySeat(seatID, userID string) error {
|
|
db.seats[seatID].OccupiedBy = []string{userID}
|
|
return nil
|
|
}
|
|
|
|
func (db *memDB) FreeSeat(seatID string) error {
|
|
db.seats[seatID].OccupiedBy = []string{}
|
|
return nil
|
|
}
|