memberships: user page (#126)

* reworked homepage and userhandler

* minor fixes for UI
diff --git a/core/auth/memberships/group.html b/core/auth/memberships/group.html
index ac432d8..f923232 100644
--- a/core/auth/memberships/group.html
+++ b/core/auth/memberships/group.html
@@ -43,7 +43,7 @@
         </tr>
         {{- range .Owners }}
         <tr>
-            <td>{{ . }}</td>
+            <td><a href="/user/{{ . }}">{{ . }}</a></td>
             <td>Delete</td>
         </tr>
         {{- end }}
@@ -56,7 +56,7 @@
         </tr>
         {{- range .Members }}
         <tr>
-            <td>{{ . }}</td>
+            <td><a href="/user/{{ . }}">{{ . }}</a></td>
             <td>Delete</td>
         </tr>
         {{- end }}
diff --git a/core/auth/memberships/index.html b/core/auth/memberships/index.html
index 03ee299..cd3cf50 100644
--- a/core/auth/memberships/index.html
+++ b/core/auth/memberships/index.html
@@ -7,7 +7,8 @@
     <link rel="stylesheet" href="/static/pico.2.0.6.min.css">
 </head>
 <body class="container">
-    <h1>Groups Managment</h1>
+    <h1>User: {{ .CurrentUser }}</h1>
+    {{ if .LoggedInUserPage }}
     <form action="/create-group" method="post">
         <label for="group-name">Group Name:</label>
         <input type="text" id="group-name" name="group-name" required>
@@ -15,6 +16,7 @@
         <input type="text" id="description" name="description">
         <button type="submit">Create Group</button>
     </form>
+    {{ end }}
     <h4>Owner</h4>
     <table>
         <tr>
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 {