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 }