package user import ( "net/url" "gno.land/p/jeronimoalbi/pager" "gno.land/p/nt/ufmt" "gno.land/r/akkadia/admin" ) // Render handles RESTful routing and returns Markdown responses func Render(iUrl string) string { u, err := url.Parse(iUrl) if err != nil { return "404\n" } query := u.Query() switch u.Path { case "": return renderHome() case "users": return renderUsersList(iUrl) case "user": addr := address(query.Get("address")) return renderUser(iUrl, addr) default: return renderError("Not found") } } // renderHome renders the home page func renderHome() string { output := `# AKKADIA User ## Introduction User realm manages user profiles for AKKADIA. - **properties**: Admin-managed user attributes - **metadatas**: User-managed personal data ## Stats ` output += ufmt.Sprintf("* **Total Users**: %d\n", GetTotalUserSize()) output += ` ## Quick Links * [Browse Users](/r/akkadia/user:users) ## User Lookup ` return output } // renderUsersList renders a list of all users with pagination func renderUsersList(iUrl string) string { output := "# Users\n\n" output += "[← Home](/r/akkadia/user:)\n\n" if properties.Size() == 0 { output += "*No users registered yet.*\n" return output } pages, err := pager.New(iUrl, properties.Size(), pager.WithPageSize(20)) if err != nil { return renderError("Invalid page") } // Get current page number for back links currentPage := (pages.Offset() / pages.PageSize()) + 1 properties.IterateByOffset(pages.Offset(), pages.PageSize(), func(key string, _ interface{}) bool { output += ufmt.Sprintf("* [%s](/r/akkadia/user:user?address=%s&page=%d)\n", key, key, currentPage) return false }) if pages.HasPages() { output += "\n" + pager.Picker(pages) } return output } // renderUser renders a single user detail func renderUser(iUrl string, addr address) string { if !addr.IsValid() { return renderError("Invalid address") } u, _ := url.Parse(iUrl) page := u.Query().Get("page") addrStr := addr.String() props, propsFound := properties.Get(addrStr) metas, metasFound := metadatas.Get(addrStr) if !propsFound && !metasFound { return renderError("User not found") } output := "# User Detail\n\n" if page != "" { output += ufmt.Sprintf("[← Back to List](/r/akkadia/user:users?page=%s)\n\n", page) } else { output += "[← Home](/r/akkadia/user:)\n\n" } output += ufmt.Sprintf("* **Address**: %s [[View on Explorer](%s/m/explorer/player?address=%s)]\n\n", addrStr, admin.GetExplorerURL(), addrStr) if propsFound { output += "## Properties\n\n" for k, v := range props.(map[string]string) { if k == "address" { continue } output += ufmt.Sprintf("* **%s**: %s\n", k, v) } output += "\n" } if metasFound { output += "## Metadata\n\n" for k, v := range metas.(map[string]string) { if k == "address" { continue } output += ufmt.Sprintf("* **%s**: %s\n", k, v) } } return output } // renderError renders an error page func renderError(message string) string { output := "# Error\n\n" output += ufmt.Sprintf("> %s\n\n", message) output += "[← Back to Home](/r/akkadia/user:)\n" return output }