package db import "fmt" // memDB is the first Store implementation used for testing. type memDB struct { // FIXME: Giusto per la cronaca fare le modifiche in questo modo alle mappe non รจ per niente thread safe, servirebbe come minimo usare un mutex per quando si scrive su una di queste variabili // mutex *sync.Mutex users map[string]*User rooms map[string]*Room seats map[string]*Seat } 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) GetUserSeat(userID string) ([]string, error) { for _, seat := range db.seats { if len(seat.OccupiedBy) > 0 && seat.OccupiedBy[0] == userID { return []string{userID}, nil } } return []string{}, 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 }