memberships: user page (#126)

* reworked homepage and userhandler

* minor fixes for UI
diff --git a/core/auth/memberships/main.go b/core/auth/memberships/main.go
index bc8f384..a645777 100644
--- a/core/auth/memberships/main.go
+++ b/core/auth/memberships/main.go
@@ -484,6 +484,7 @@
 		r := mux.NewRouter()
 		r.PathPrefix("/static/").Handler(http.FileServer(http.FS(staticResources)))
 		r.HandleFunc("/group/{group-name}", s.groupHandler)
+		r.HandleFunc("/user/{username}", s.userHandler)
 		r.HandleFunc("/create-group", s.createGroupHandler)
 		r.HandleFunc("/add-user", s.addUserHandler)
 		r.HandleFunc("/add-child-group", s.addChildGroupHandler)
@@ -523,12 +524,25 @@
 		http.Error(w, "User Not Logged In", http.StatusUnauthorized)
 		return
 	}
-	ownerGroups, err := s.store.GetGroupsOwnedBy(loggedInUser)
+	http.Redirect(w, r, "/user/"+loggedInUser, http.StatusSeeOther)
+}
+
+func (s *Server) userHandler(w http.ResponseWriter, r *http.Request) {
+	loggedInUser, err := getLoggedInUser(r)
+	if err != nil {
+		http.Error(w, "User Not Logged In", http.StatusUnauthorized)
+		return
+	}
+	vars := mux.Vars(r)
+	user := strings.ToLower(vars["username"])
+	// TODO(dtabidze): should check if username exists or not.
+	loggedInUserPage := loggedInUser == user
+	ownerGroups, err := s.store.GetGroupsOwnedBy(user)
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	membershipGroups, err := s.store.GetGroupsUserBelongsTo(loggedInUser)
+	membershipGroups, err := s.store.GetGroupsUserBelongsTo(user)
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
@@ -538,7 +552,7 @@
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	transitiveGroups, err := s.store.GetAllTransitiveGroupsForUser(loggedInUser)
+	transitiveGroups, err := s.store.GetAllTransitiveGroupsForUser(user)
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
@@ -547,10 +561,14 @@
 		OwnerGroups      []Group
 		MembershipGroups []Group
 		TransitiveGroups []Group
+		LoggedInUserPage bool
+		CurrentUser      string
 	}{
 		OwnerGroups:      ownerGroups,
 		MembershipGroups: membershipGroups,
 		TransitiveGroups: transitiveGroups,
+		LoggedInUserPage: loggedInUserPage,
+		CurrentUser:      user,
 	}
 	w.Header().Set("Content-Type", "text/html")
 	if err := tmpl.Execute(w, data); err != nil {