package server import ( "code.severnaya.net/kordophone-mock/v2/data" "code.severnaya.net/kordophone-mock/v2/model" ) const VERSION = "Kordophone-2.0" const ( AUTH_USERNAME = "test" AUTH_PASSWORD = "test" ) type Server struct { version string conversations []model.Conversation authTokens []model.AuthToken } type AuthError struct { message string } func (e *AuthError) Error() string { return e.message } func NewServer() *Server { return &Server{ version: VERSION, conversations: []model.Conversation{}, } } func (s *Server) Version() string { return s.version } func (s *Server) Conversations() []model.Conversation { return s.conversations } func (s *Server) AddConversation(c model.Conversation) { s.conversations = append(s.conversations, c) } func (s *Server) PopulateWithTestData() { numConversations := 100 cs := make([]model.Conversation, numConversations) for i := 0; i < numConversations; i++ { cs[i] = data.GenerateRandomConversation() } s.conversations = cs } func (s *Server) Authenticate(username string, password string) (*model.AuthToken, error) { if username != AUTH_USERNAME || password != AUTH_PASSWORD { return nil, &AuthError{"Invalid username or password"} } token, err := model.NewAuthToken(username) if err != nil { return nil, err } // Register for future auth s.registerAuthToken(token) return token, nil } func (s *Server) CheckBearerToken(token string) bool { return s.authenticateToken(token) } // Private func (s *Server) registerAuthToken(token *model.AuthToken) { s.authTokens = append(s.authTokens, *token) } func (s *Server) authenticateToken(token string) bool { for _, t := range s.authTokens { if t.SignedToken == token { return true } } return false }