From a0d3bfd7b136a6ed9671e66a4c27a23d0c485da8 Mon Sep 17 00:00:00 2001 From: Casey Brooks Date: Thu, 23 Apr 2026 19:46:04 +0000 Subject: [PATCH 1/2] feat(api): add user search and profile APIs --- .../agynio/api/gateway/v1/organizations.proto | 3 ++ proto/agynio/api/gateway/v1/users.proto | 4 ++ .../api/organizations/v1/organizations.proto | 14 +++++++ proto/agynio/api/users/v1/users.proto | 42 +++++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/proto/agynio/api/gateway/v1/organizations.proto b/proto/agynio/api/gateway/v1/organizations.proto index 0236bbe..681251e 100644 --- a/proto/agynio/api/gateway/v1/organizations.proto +++ b/proto/agynio/api/gateway/v1/organizations.proto @@ -23,4 +23,7 @@ service OrganizationsGateway { rpc UpdateMembershipRole(agynio.api.organizations.v1.UpdateMembershipRoleRequest) returns (agynio.api.organizations.v1.UpdateMembershipRoleResponse); rpc ListMembers(agynio.api.organizations.v1.ListMembersRequest) returns (agynio.api.organizations.v1.ListMembersResponse); rpc ListMyMemberships(agynio.api.organizations.v1.ListMyMembershipsRequest) returns (agynio.api.organizations.v1.ListMyMembershipsResponse); + + // --- Org Nicknames --- + rpc SetMyOrgNickname(agynio.api.organizations.v1.SetMyOrgNicknameRequest) returns (agynio.api.organizations.v1.SetMyOrgNicknameResponse); } diff --git a/proto/agynio/api/gateway/v1/users.proto b/proto/agynio/api/gateway/v1/users.proto index 2e4fce3..eb46677 100644 --- a/proto/agynio/api/gateway/v1/users.proto +++ b/proto/agynio/api/gateway/v1/users.proto @@ -9,6 +9,10 @@ option go_package = "github.com/agynio/api/gen/agynio/api/gateway/v1;gatewayv1"; service UsersGateway { // --- Current User --- rpc GetMe(agynio.api.users.v1.GetMeRequest) returns (agynio.api.users.v1.GetMeResponse); + rpc UpdateMe(agynio.api.users.v1.UpdateMeRequest) returns (agynio.api.users.v1.UpdateMeResponse); + + // --- User Directory --- + rpc SearchUsers(agynio.api.users.v1.SearchUsersRequest) returns (agynio.api.users.v1.SearchUsersResponse); // --- Admin User Management --- rpc CreateUser(agynio.api.users.v1.CreateUserRequest) returns (agynio.api.users.v1.CreateUserResponse); diff --git a/proto/agynio/api/organizations/v1/organizations.proto b/proto/agynio/api/organizations/v1/organizations.proto index 16efb2b..a4080c4 100644 --- a/proto/agynio/api/organizations/v1/organizations.proto +++ b/proto/agynio/api/organizations/v1/organizations.proto @@ -26,6 +26,9 @@ service OrganizationsService { rpc UpdateMembershipRole(UpdateMembershipRoleRequest) returns (UpdateMembershipRoleResponse); rpc ListMembers(ListMembersRequest) returns (ListMembersResponse); rpc ListMyMemberships(ListMyMembershipsRequest) returns (ListMyMembershipsResponse); + + // --- Org Nicknames --- + rpc SetMyOrgNickname(SetMyOrgNicknameRequest) returns (SetMyOrgNicknameResponse); } // =========================================================================== @@ -209,3 +212,14 @@ message ListMyMembershipsResponse { repeated Membership memberships = 1; string next_page_token = 2; } + +// =========================================================================== +// SetMyOrgNickname +// =========================================================================== + +message SetMyOrgNicknameRequest { + string organization_id = 1; // UUID + string nickname = 2; +} + +message SetMyOrgNicknameResponse {} diff --git a/proto/agynio/api/users/v1/users.proto b/proto/agynio/api/users/v1/users.proto index e1a8fd4..b8e6e71 100644 --- a/proto/agynio/api/users/v1/users.proto +++ b/proto/agynio/api/users/v1/users.proto @@ -19,6 +19,10 @@ service UsersService { // --- Current User --- rpc GetMe(GetMeRequest) returns (GetMeResponse); + rpc UpdateMe(UpdateMeRequest) returns (UpdateMeResponse); + + // --- User Directory --- + rpc SearchUsers(SearchUsersRequest) returns (SearchUsersResponse); // --- Admin User Management --- rpc ListUsers(ListUsersRequest) returns (ListUsersResponse); @@ -63,6 +67,7 @@ message User { string email = 4; string photo_url = 5; string nickname = 6; + string username = 7; } // =========================================================================== @@ -86,6 +91,7 @@ message ResolveOrCreateUserRequest { string name = 2; string email = 3; string photo_url = 4; + optional string preferred_username = 5; } message ResolveOrCreateUserResponse { @@ -141,6 +147,7 @@ message UpdateUserRequest { optional string photo_url = 4; optional string nickname = 5; optional ClusterRole cluster_role = 6; + optional string username = 7; } message UpdateUserResponse { @@ -158,6 +165,40 @@ message GetMeResponse { ClusterRole cluster_role = 2; } +// =========================================================================== +// UpdateMe +// =========================================================================== + +message UpdateMeRequest { + optional string name = 1; + optional string username = 2; +} + +message UpdateMeResponse { + User user = 1; + ClusterRole cluster_role = 2; +} + +// =========================================================================== +// SearchUsers +// =========================================================================== + +message UserDirectoryEntry { + string identity_id = 1; + string username = 2; + string name = 3; + string photo_url = 4; +} + +message SearchUsersRequest { + string prefix = 1; + int32 limit = 2; +} + +message SearchUsersResponse { + repeated UserDirectoryEntry users = 1; +} + // =========================================================================== // ListUsers // =========================================================================== @@ -182,6 +223,7 @@ message CreateUserRequest { optional string nickname = 3; optional string photo_url = 4; ClusterRole cluster_role = 5; + optional string username = 6; } message CreateUserResponse { From 7faf34e15dfbf97f371cccaf6122c013b8f05c92 Mon Sep 17 00:00:00 2001 From: Casey Brooks Date: Thu, 23 Apr 2026 20:08:32 +0000 Subject: [PATCH 2/2] docs(api): clarify nickname updates --- proto/agynio/api/organizations/v1/organizations.proto | 2 ++ proto/agynio/api/users/v1/users.proto | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/proto/agynio/api/organizations/v1/organizations.proto b/proto/agynio/api/organizations/v1/organizations.proto index a4080c4..5de3af0 100644 --- a/proto/agynio/api/organizations/v1/organizations.proto +++ b/proto/agynio/api/organizations/v1/organizations.proto @@ -28,6 +28,7 @@ service OrganizationsService { rpc ListMyMemberships(ListMyMembershipsRequest) returns (ListMyMembershipsResponse); // --- Org Nicknames --- + // Self-service org nickname update for the calling identity. rpc SetMyOrgNickname(SetMyOrgNicknameRequest) returns (SetMyOrgNicknameResponse); } @@ -219,6 +220,7 @@ message ListMyMembershipsResponse { message SetMyOrgNicknameRequest { string organization_id = 1; // UUID + // Organization-scoped nickname for the caller. string nickname = 2; } diff --git a/proto/agynio/api/users/v1/users.proto b/proto/agynio/api/users/v1/users.proto index b8e6e71..c2b6464 100644 --- a/proto/agynio/api/users/v1/users.proto +++ b/proto/agynio/api/users/v1/users.proto @@ -19,6 +19,8 @@ service UsersService { // --- Current User --- rpc GetMe(GetMeRequest) returns (GetMeResponse); + // Updates cluster-wide profile fields (name/username). Org-scoped + // nicknames are managed via OrganizationsService.SetMyOrgNickname. rpc UpdateMe(UpdateMeRequest) returns (UpdateMeResponse); // --- User Directory --- @@ -66,7 +68,9 @@ message User { string name = 3; string email = 4; string photo_url = 5; + // Organization-scoped nickname (set via OrganizationsService.SetMyOrgNickname). string nickname = 6; + // Cluster-wide username. May be empty for existing users until set. string username = 7; } @@ -171,6 +175,7 @@ message GetMeResponse { message UpdateMeRequest { optional string name = 1; + // Cluster-wide username. Org-scoped nicknames are set via OrganizationsService.SetMyOrgNickname. optional string username = 2; } @@ -192,6 +197,7 @@ message UserDirectoryEntry { message SearchUsersRequest { string prefix = 1; + // Defaults to 10 when unset or zero. Max 20. int32 limit = 2; }