package api import ( "errors" "fmt" "github.com/google/uuid" "go-nkode/models" ) type NKodeAPI struct { Customers map[uuid.UUID]Customer SignupSessions map[uuid.UUID]UserSignSession } func NewNKodeAPI() NKodeAPI { return NKodeAPI{ Customers: make(map[uuid.UUID]Customer), SignupSessions: make(map[uuid.UUID]UserSignSession), } } func (n *NKodeAPI) CreateNewCustomer(keypadSize models.KeypadSize, nkodePolicy models.NKodePolicy) (*uuid.UUID, error) { newCustomer, err := NewCustomer(keypadSize, nkodePolicy) if err != nil { return nil, err } n.Customers[newCustomer.CustomerId] = *newCustomer return &newCustomer.CustomerId, nil } func (n *NKodeAPI) GenerateSignupInterface(customerId uuid.UUID) (*uuid.UUID, []int, error) { customer, exists := n.Customers[customerId] if !exists { return nil, nil, errors.New(fmt.Sprintf("customer doesnt exists: %s", customerId.String())) } signupSession, err := NewSignupSession(customer.Attributes.KeypadSize, customer.CustomerId) if err != nil { return nil, nil, err } n.SignupSessions[signupSession.SessionId] = *signupSession return &signupSession.SessionId, signupSession.SetInterface, nil } func (n *NKodeAPI) SetNKode(username string, customerId uuid.UUID, keySelection []int, sessionId uuid.UUID) ([]int, error) { _, exists := n.Customers[customerId] if !exists { return nil, errors.New(fmt.Sprintf("set nkode customer id does not exist %s", customerId.String())) } session, exists := n.SignupSessions[sessionId] if !exists { return nil, errors.New(fmt.Sprintf("session id does not exist %s", sessionId.String())) } confirmInterface, err := session.SetUserNKode(username, keySelection) if err != nil { return nil, err } n.SignupSessions[sessionId] = session return confirmInterface, nil } func (n *NKodeAPI) ConfirmNKode(customerId uuid.UUID, keySelection []int, sessionId uuid.UUID) error { session, exists := n.SignupSessions[sessionId] if !exists { return errors.New(fmt.Sprintf("session id does not exist %s", sessionId.String())) } customer, exists := n.Customers[customerId] passcode, err := session.DeducePasscode(keySelection) if err != nil { return err } err = customer.IsValidNKode(passcode) if err != nil { return err } err = customer.AddNewUser(session.Username, passcode, session.LoginInterface) if err != nil { return err } delete(n.SignupSessions, session.SessionId) n.Customers[customerId] = customer return nil } func (n *NKodeAPI) GetLoginInterface(username string, customerId uuid.UUID) ([]int, error) { err := n.customerUserExists(username, customerId) if err != nil { return nil, err } user := n.Customers[customerId].Users[username] err = user.Interface.PartialInterfaceShuffle() if err != nil { return nil, err } n.Customers[customerId].Users[username] = user return user.Interface.IdxInterface, nil } func (n *NKodeAPI) Login(customerId uuid.UUID, username string, keySelection []int) error { customer, exists := n.Customers[customerId] if !exists { return errors.New(fmt.Sprintf("customer %s does not exist", customerId.String())) } user, exists := customer.Users[username] if !exists { return errors.New(fmt.Sprintf("user dne %s", username)) } passcode, err := customer.ValidKeyEntry(username, keySelection) if err != nil { return err } if user.Renew { err = user.RefreshPasscode(passcode, customer.Attributes) if err != nil { return err } } return nil } func (n *NKodeAPI) customerUserExists(username string, customerId uuid.UUID) error { customer, exists := n.Customers[customerId] if !exists { return errors.New(fmt.Sprintf("customer %s does not exist", customerId.String())) } _, exists = customer.Users[username] if !exists { return errors.New(fmt.Sprintf("user dne %s", username)) } return nil } func (n *NKodeAPI) RenewAttributes(customerId uuid.UUID) error { customer, exists := n.Customers[customerId] if !exists { return errors.New(fmt.Sprintf("customer %s does not exist", customerId.String())) } return customer.RenewKeys() }