fix(user fields): missing creationDate in details (#9250)

# Which Problems Are Solved

The `creationDate` property on user search V2 endpoint was missing

# How the Problems Are Solved

Added property in v2 `object.proto` and in the function creating the
details on each call

# Additional Changes
- none
# Additional Context
closes #8552

---------

Co-authored-by: Stefan Benz <46600784+stebenz@users.noreply.github.com>
This commit is contained in:
KevinRSI 2025-02-26 14:00:04 +01:00 committed by GitHub
parent 8f88c4cf5b
commit 70bddceda8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 113 additions and 17 deletions

View File

@ -76,6 +76,7 @@ func TestServer_GetIDPByID(t *testing.T) {
name, name,
&object.Details{ &object.Details{
Sequence: resp.Details.Sequence, Sequence: resp.Details.Sequence,
CreationDate: resp.Details.CreationDate,
ChangeDate: resp.Details.ChangeDate, ChangeDate: resp.Details.ChangeDate,
ResourceOwner: resp.Details.ResourceOwner, ResourceOwner: resp.Details.ResourceOwner,
}} }}
@ -124,6 +125,7 @@ func TestServer_GetIDPByID(t *testing.T) {
name, name,
&object.Details{ &object.Details{
Sequence: resp.Details.Sequence, Sequence: resp.Details.Sequence,
CreationDate: resp.Details.CreationDate,
ChangeDate: resp.Details.ChangeDate, ChangeDate: resp.Details.ChangeDate,
ResourceOwner: resp.Details.ResourceOwner, ResourceOwner: resp.Details.ResourceOwner,
}} }}
@ -145,6 +147,7 @@ func TestServer_GetIDPByID(t *testing.T) {
name, name,
&object.Details{ &object.Details{
Sequence: resp.Details.Sequence, Sequence: resp.Details.Sequence,
CreationDate: resp.Details.CreationDate,
ChangeDate: resp.Details.ChangeDate, ChangeDate: resp.Details.ChangeDate,
ResourceOwner: resp.Details.ResourceOwner, ResourceOwner: resp.Details.ResourceOwner,
}} }}
@ -193,6 +196,7 @@ func TestServer_GetIDPByID(t *testing.T) {
name, name,
&object.Details{ &object.Details{
Sequence: resp.Details.Sequence, Sequence: resp.Details.Sequence,
CreationDate: resp.Details.CreationDate,
ChangeDate: resp.Details.ChangeDate, ChangeDate: resp.Details.ChangeDate,
ResourceOwner: resp.Details.ResourceOwner, ResourceOwner: resp.Details.ResourceOwner,
}} }}

View File

@ -31,6 +31,7 @@ func idpToPb(idp *query.IDPTemplate) *idp_pb.IDP {
Sequence: idp.Sequence, Sequence: idp.Sequence,
EventDate: idp.ChangeDate, EventDate: idp.ChangeDate,
ResourceOwner: idp.ResourceOwner, ResourceOwner: idp.ResourceOwner,
CreationDate: idp.CreationDate,
}), }),
State: idpStateToPb(idp.State), State: idpStateToPb(idp.State),
Name: idp.Name, Name: idp.Name,

View File

@ -20,6 +20,9 @@ func DomainToDetailsPb(objectDetail *domain.ObjectDetails) *object.Details {
if !objectDetail.EventDate.IsZero() { if !objectDetail.EventDate.IsZero() {
details.ChangeDate = timestamppb.New(objectDetail.EventDate) details.ChangeDate = timestamppb.New(objectDetail.EventDate)
} }
if !objectDetail.CreationDate.IsZero() {
details.CreationDate = timestamppb.New(objectDetail.CreationDate)
}
return details return details
} }

View File

@ -19,6 +19,9 @@ func DomainToDetailsPb(objectDetail *domain.ObjectDetails) *object.Details {
if !objectDetail.EventDate.IsZero() { if !objectDetail.EventDate.IsZero() {
details.ChangeDate = timestamppb.New(objectDetail.EventDate) details.ChangeDate = timestamppb.New(objectDetail.EventDate)
} }
if !objectDetail.CreationDate.IsZero() {
details.CreationDate = timestamppb.New(objectDetail.CreationDate)
}
return details return details
} }

View File

@ -26,6 +26,16 @@ type orgAttr struct {
Details *object.Details Details *object.Details
} }
func createOrganization(ctx context.Context, name string) orgAttr {
orgResp := Instance.CreateOrganization(ctx, name, gofakeit.Email())
orgResp.Details.CreationDate = orgResp.Details.ChangeDate
return orgAttr{
ID: orgResp.GetOrganizationId(),
Name: name,
Details: orgResp.GetDetails(),
}
}
func TestServer_ListOrganizations(t *testing.T) { func TestServer_ListOrganizations(t *testing.T) {
type args struct { type args struct {
ctx context.Context ctx context.Context
@ -63,6 +73,7 @@ func TestServer_ListOrganizations(t *testing.T) {
State: org.OrganizationState_ORGANIZATION_STATE_ACTIVE, State: org.OrganizationState_ORGANIZATION_STATE_ACTIVE,
Details: &object.Details{ Details: &object.Details{
Sequence: Instance.DefaultOrg.Details.Sequence, Sequence: Instance.DefaultOrg.Details.Sequence,
CreationDate: Instance.DefaultOrg.Details.CreationDate,
ChangeDate: Instance.DefaultOrg.Details.ChangeDate, ChangeDate: Instance.DefaultOrg.Details.ChangeDate,
ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner, ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner,
}, },
@ -85,12 +96,7 @@ func TestServer_ListOrganizations(t *testing.T) {
prefix := fmt.Sprintf("ListOrgs-%s", gofakeit.AppName()) prefix := fmt.Sprintf("ListOrgs-%s", gofakeit.AppName())
for i := 0; i < count; i++ { for i := 0; i < count; i++ {
name := prefix + strconv.Itoa(i) name := prefix + strconv.Itoa(i)
orgResp := Instance.CreateOrganization(ctx, name, gofakeit.Email()) orgs[i] = createOrganization(ctx, name)
orgs[i] = orgAttr{
ID: orgResp.GetOrganizationId(),
Name: name,
Details: orgResp.GetDetails(),
}
} }
request.Queries = []*org.SearchQuery{ request.Queries = []*org.SearchQuery{
OrganizationNamePrefixQuery(prefix), OrganizationNamePrefixQuery(prefix),
@ -140,6 +146,7 @@ func TestServer_ListOrganizations(t *testing.T) {
Name: Instance.DefaultOrg.Name, Name: Instance.DefaultOrg.Name,
Details: &object.Details{ Details: &object.Details{
Sequence: Instance.DefaultOrg.Details.Sequence, Sequence: Instance.DefaultOrg.Details.Sequence,
CreationDate: Instance.DefaultOrg.Details.CreationDate,
ChangeDate: Instance.DefaultOrg.Details.ChangeDate, ChangeDate: Instance.DefaultOrg.Details.ChangeDate,
ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner, ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner,
}, },
@ -172,6 +179,7 @@ func TestServer_ListOrganizations(t *testing.T) {
Name: Instance.DefaultOrg.Name, Name: Instance.DefaultOrg.Name,
Details: &object.Details{ Details: &object.Details{
Sequence: Instance.DefaultOrg.Details.Sequence, Sequence: Instance.DefaultOrg.Details.Sequence,
CreationDate: Instance.DefaultOrg.Details.CreationDate,
ChangeDate: Instance.DefaultOrg.Details.ChangeDate, ChangeDate: Instance.DefaultOrg.Details.ChangeDate,
ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner, ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner,
}, },
@ -204,6 +212,7 @@ func TestServer_ListOrganizations(t *testing.T) {
Name: Instance.DefaultOrg.Name, Name: Instance.DefaultOrg.Name,
Details: &object.Details{ Details: &object.Details{
Sequence: Instance.DefaultOrg.Details.Sequence, Sequence: Instance.DefaultOrg.Details.Sequence,
CreationDate: Instance.DefaultOrg.Details.CreationDate,
ChangeDate: Instance.DefaultOrg.Details.ChangeDate, ChangeDate: Instance.DefaultOrg.Details.ChangeDate,
ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner, ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner,
}, },
@ -221,14 +230,9 @@ func TestServer_ListOrganizations(t *testing.T) {
func(ctx context.Context, request *org.ListOrganizationsRequest) ([]orgAttr, error) { func(ctx context.Context, request *org.ListOrganizationsRequest) ([]orgAttr, error) {
orgs := make([]orgAttr, 1) orgs := make([]orgAttr, 1)
name := fmt.Sprintf("ListOrgs-%s", gofakeit.AppName()) name := fmt.Sprintf("ListOrgs-%s", gofakeit.AppName())
orgResp := Instance.CreateOrganization(ctx, name, gofakeit.Email()) orgs[0] = createOrganization(ctx, name)
orgs[0] = orgAttr{
ID: orgResp.GetOrganizationId(),
Name: name,
Details: orgResp.GetDetails(),
}
domain := gofakeit.DomainName() domain := gofakeit.DomainName()
_, err := Instance.Client.Mgmt.AddOrgDomain(integration.SetOrgID(ctx, orgResp.GetOrganizationId()), &management.AddOrgDomainRequest{ _, err := Instance.Client.Mgmt.AddOrgDomain(integration.SetOrgID(ctx, orgs[0].ID), &management.AddOrgDomainRequest{
Domain: domain, Domain: domain,
}) })
if err != nil { if err != nil {
@ -262,18 +266,19 @@ func TestServer_ListOrganizations(t *testing.T) {
}, },
func(ctx context.Context, request *org.ListOrganizationsRequest) ([]orgAttr, error) { func(ctx context.Context, request *org.ListOrganizationsRequest) ([]orgAttr, error) {
name := gofakeit.Name() name := gofakeit.Name()
orgResp := Instance.CreateOrganization(ctx, name, gofakeit.Email()) orgResp := createOrganization(ctx, name)
deactivateOrgResp := Instance.DeactivateOrganization(ctx, orgResp.GetOrganizationId()) deactivateOrgResp := Instance.DeactivateOrganization(ctx, orgResp.ID)
request.Queries = []*org.SearchQuery{ request.Queries = []*org.SearchQuery{
OrganizationIdQuery(orgResp.GetOrganizationId()), OrganizationIdQuery(orgResp.ID),
OrganizationStateQuery(org.OrganizationState_ORGANIZATION_STATE_INACTIVE), OrganizationStateQuery(org.OrganizationState_ORGANIZATION_STATE_INACTIVE),
} }
return []orgAttr{{ return []orgAttr{{
ID: orgResp.GetOrganizationId(), ID: orgResp.ID,
Name: name, Name: name,
Details: &object.Details{ Details: &object.Details{
ResourceOwner: deactivateOrgResp.GetDetails().GetResourceOwner(), ResourceOwner: deactivateOrgResp.GetDetails().GetResourceOwner(),
Sequence: deactivateOrgResp.GetDetails().GetSequence(), Sequence: deactivateOrgResp.GetDetails().GetSequence(),
CreationDate: orgResp.Details.GetCreationDate(),
ChangeDate: deactivateOrgResp.GetDetails().GetChangeDate(), ChangeDate: deactivateOrgResp.GetDetails().GetChangeDate(),
}, },
}}, nil }}, nil
@ -317,6 +322,7 @@ func TestServer_ListOrganizations(t *testing.T) {
Name: Instance.DefaultOrg.Name, Name: Instance.DefaultOrg.Name,
Details: &object.Details{ Details: &object.Details{
Sequence: Instance.DefaultOrg.Details.Sequence, Sequence: Instance.DefaultOrg.Details.Sequence,
CreationDate: Instance.DefaultOrg.Details.ChangeDate,
ChangeDate: Instance.DefaultOrg.Details.ChangeDate, ChangeDate: Instance.DefaultOrg.Details.ChangeDate,
ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner, ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner,
}, },
@ -414,6 +420,7 @@ func TestServer_ListOrganizations(t *testing.T) {
Name: Instance.DefaultOrg.Name, Name: Instance.DefaultOrg.Name,
Details: &object.Details{ Details: &object.Details{
Sequence: Instance.DefaultOrg.Details.Sequence, Sequence: Instance.DefaultOrg.Details.Sequence,
CreationDate: Instance.DefaultOrg.Details.ChangeDate,
ChangeDate: Instance.DefaultOrg.Details.ChangeDate, ChangeDate: Instance.DefaultOrg.Details.ChangeDate,
ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner, ResourceOwner: Instance.DefaultOrg.Details.ResourceOwner,
}, },

View File

@ -129,6 +129,7 @@ func organizationToPb(organization *query.Org) *org.Organization {
Sequence: organization.Sequence, Sequence: organization.Sequence,
EventDate: organization.ChangeDate, EventDate: organization.ChangeDate,
ResourceOwner: organization.ResourceOwner, ResourceOwner: organization.ResourceOwner,
CreationDate: organization.CreationDate,
}), }),
State: orgStateToPb(organization.State), State: orgStateToPb(organization.State),
} }

View File

@ -23,6 +23,7 @@ func (s *Server) GetLoginSettings(ctx context.Context, req *settings.GetLoginSet
Settings: loginSettingsToPb(current), Settings: loginSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.OrgID, ResourceOwner: current.OrgID,
}, },
@ -38,6 +39,7 @@ func (s *Server) GetPasswordComplexitySettings(ctx context.Context, req *setting
Settings: passwordComplexitySettingsToPb(current), Settings: passwordComplexitySettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -53,6 +55,7 @@ func (s *Server) GetPasswordExpirySettings(ctx context.Context, req *settings.Ge
Settings: passwordExpirySettingsToPb(current), Settings: passwordExpirySettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -68,6 +71,7 @@ func (s *Server) GetBrandingSettings(ctx context.Context, req *settings.GetBrand
Settings: brandingSettingsToPb(current, s.assetsAPIDomain(ctx)), Settings: brandingSettingsToPb(current, s.assetsAPIDomain(ctx)),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -83,6 +87,7 @@ func (s *Server) GetDomainSettings(ctx context.Context, req *settings.GetDomainS
Settings: domainSettingsToPb(current), Settings: domainSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -98,6 +103,7 @@ func (s *Server) GetLegalAndSupportSettings(ctx context.Context, req *settings.G
Settings: legalAndSupportSettingsToPb(current), Settings: legalAndSupportSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -113,6 +119,7 @@ func (s *Server) GetLockoutSettings(ctx context.Context, req *settings.GetLockou
Settings: lockoutSettingsToPb(current), Settings: lockoutSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },

View File

@ -23,6 +23,7 @@ func (s *Server) GetLoginSettings(ctx context.Context, req *settings.GetLoginSet
Settings: loginSettingsToPb(current), Settings: loginSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.OrgID, ResourceOwner: current.OrgID,
}, },
@ -38,6 +39,7 @@ func (s *Server) GetPasswordComplexitySettings(ctx context.Context, req *setting
Settings: passwordComplexitySettingsToPb(current), Settings: passwordComplexitySettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -53,6 +55,7 @@ func (s *Server) GetPasswordExpirySettings(ctx context.Context, req *settings.Ge
Settings: passwordExpirySettingsToPb(current), Settings: passwordExpirySettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -68,6 +71,7 @@ func (s *Server) GetBrandingSettings(ctx context.Context, req *settings.GetBrand
Settings: brandingSettingsToPb(current, s.assetsAPIDomain(ctx)), Settings: brandingSettingsToPb(current, s.assetsAPIDomain(ctx)),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -83,6 +87,7 @@ func (s *Server) GetDomainSettings(ctx context.Context, req *settings.GetDomainS
Settings: domainSettingsToPb(current), Settings: domainSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -98,6 +103,7 @@ func (s *Server) GetLegalAndSupportSettings(ctx context.Context, req *settings.G
Settings: legalAndSupportSettingsToPb(current), Settings: legalAndSupportSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },
@ -113,6 +119,7 @@ func (s *Server) GetLockoutSettings(ctx context.Context, req *settings.GetLockou
Settings: lockoutSettingsToPb(current), Settings: lockoutSettingsToPb(current),
Details: &object_pb.Details{ Details: &object_pb.Details{
Sequence: current.Sequence, Sequence: current.Sequence,
CreationDate: timestamppb.New(current.CreationDate),
ChangeDate: timestamppb.New(current.ChangeDate), ChangeDate: timestamppb.New(current.ChangeDate),
ResourceOwner: current.ResourceOwner, ResourceOwner: current.ResourceOwner,
}, },

View File

@ -150,6 +150,7 @@ func TestServer_GetUserByID(t *testing.T) {
}, },
Details: &object.Details{ Details: &object.Details{
ChangeDate: timestamppb.Now(), ChangeDate: timestamppb.Now(),
CreationDate: timestamppb.Now(),
ResourceOwner: orgResp.OrganizationId, ResourceOwner: orgResp.OrganizationId,
}, },
}, },
@ -195,6 +196,7 @@ func TestServer_GetUserByID(t *testing.T) {
}, },
Details: &object.Details{ Details: &object.Details{
ChangeDate: timestamppb.Now(), ChangeDate: timestamppb.Now(),
CreationDate: timestamppb.Now(),
ResourceOwner: orgResp.OrganizationId, ResourceOwner: orgResp.OrganizationId,
}, },
}, },
@ -282,6 +284,7 @@ func TestServer_GetUserByID_Permission(t *testing.T) {
}, },
Details: &object.Details{ Details: &object.Details{
ChangeDate: timestamppb.Now(), ChangeDate: timestamppb.Now(),
CreationDate: timestamppb.Now(),
ResourceOwner: newOrg.GetOrganizationId(), ResourceOwner: newOrg.GetOrganizationId(),
}, },
}, },
@ -320,6 +323,7 @@ func TestServer_GetUserByID_Permission(t *testing.T) {
}, },
Details: &object.Details{ Details: &object.Details{
ChangeDate: timestamppb.Now(), ChangeDate: timestamppb.Now(),
CreationDate: timestamppb.Now(),
ResourceOwner: newOrg.GetOrganizationId(), ResourceOwner: newOrg.GetOrganizationId(),
}, },
}, },
@ -415,6 +419,8 @@ func createUser(ctx context.Context, orgID string, passwordChangeRequired bool)
phone := "+41" + gofakeit.Phone() phone := "+41" + gofakeit.Phone()
resp := Instance.CreateHumanUserVerified(ctx, orgID, username, phone) resp := Instance.CreateHumanUserVerified(ctx, orgID, username, phone)
info := userAttr{resp.GetUserId(), username, phone, nil, resp.GetDetails()} info := userAttr{resp.GetUserId(), username, phone, nil, resp.GetDetails()}
// as the change date of the creation is the creation date
resp.Details.CreationDate = resp.GetDetails().GetChangeDate()
if passwordChangeRequired { if passwordChangeRequired {
details := Instance.SetUserPassword(ctx, resp.GetUserId(), integration.UserPassword, true) details := Instance.SetUserPassword(ctx, resp.GetUserId(), integration.UserPassword, true)
info.Changed = details.GetChangeDate() info.Changed = details.GetChangeDate()

View File

@ -74,6 +74,7 @@ func Test_passkeyRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -90,6 +91,7 @@ func Test_passkeyRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -104,6 +106,10 @@ func Test_passkeyRegistrationDetailsToPb(t *testing.T) {
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,
}, },
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ResourceOwner: "me", ResourceOwner: "me",
}, },
PasskeyId: "123", PasskeyId: "123",
@ -150,6 +156,7 @@ func Test_passkeyDetailsToPb(t *testing.T) {
details: &domain.ObjectDetails{ details: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
err: nil, err: nil,
@ -161,6 +168,10 @@ func Test_passkeyDetailsToPb(t *testing.T) {
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,
}, },
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ResourceOwner: "me", ResourceOwner: "me",
}, },
}, },
@ -199,6 +210,7 @@ func Test_passkeyCodeDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
CodeID: "123", CodeID: "123",
@ -213,6 +225,10 @@ func Test_passkeyCodeDetailsToPb(t *testing.T) {
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,
}, },
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ResourceOwner: "me", ResourceOwner: "me",
}, },
Code: &user.PasskeyRegistrationCode{ Code: &user.PasskeyRegistrationCode{

View File

@ -21,6 +21,7 @@ func (s *Server) GetUserByID(ctx context.Context, req *user.GetUserByIDRequest)
return &user.GetUserByIDResponse{ return &user.GetUserByIDResponse{
Details: object.DomainToDetailsPb(&domain.ObjectDetails{ Details: object.DomainToDetailsPb(&domain.ObjectDetails{
Sequence: resp.Sequence, Sequence: resp.Sequence,
CreationDate: resp.CreationDate,
EventDate: resp.ChangeDate, EventDate: resp.ChangeDate,
ResourceOwner: resp.ResourceOwner, ResourceOwner: resp.ResourceOwner,
}), }),
@ -58,6 +59,7 @@ func userToPb(userQ *query.User, assetPrefix string) *user.User {
Sequence: userQ.Sequence, Sequence: userQ.Sequence,
EventDate: userQ.ChangeDate, EventDate: userQ.ChangeDate,
ResourceOwner: userQ.ResourceOwner, ResourceOwner: userQ.ResourceOwner,
CreationDate: userQ.CreationDate,
}), }),
State: userStateToPb(userQ.State), State: userStateToPb(userQ.State),
Username: userQ.Username, Username: userQ.Username,

View File

@ -43,6 +43,7 @@ func Test_u2fRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -59,6 +60,7 @@ func Test_u2fRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -73,6 +75,10 @@ func Test_u2fRegistrationDetailsToPb(t *testing.T) {
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,
}, },
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ResourceOwner: "me", ResourceOwner: "me",
}, },
U2FId: "123", U2FId: "123",

View File

@ -74,6 +74,7 @@ func Test_passkeyRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -90,6 +91,7 @@ func Test_passkeyRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -100,6 +102,10 @@ func Test_passkeyRegistrationDetailsToPb(t *testing.T) {
want: &user.RegisterPasskeyResponse{ want: &user.RegisterPasskeyResponse{
Details: &object.Details{ Details: &object.Details{
Sequence: 22, Sequence: 22,
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ChangeDate: &timestamppb.Timestamp{ ChangeDate: &timestamppb.Timestamp{
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,
@ -150,6 +156,7 @@ func Test_passkeyDetailsToPb(t *testing.T) {
details: &domain.ObjectDetails{ details: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
err: nil, err: nil,
@ -157,6 +164,10 @@ func Test_passkeyDetailsToPb(t *testing.T) {
want: &user.CreatePasskeyRegistrationLinkResponse{ want: &user.CreatePasskeyRegistrationLinkResponse{
Details: &object.Details{ Details: &object.Details{
Sequence: 22, Sequence: 22,
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ChangeDate: &timestamppb.Timestamp{ ChangeDate: &timestamppb.Timestamp{
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,
@ -199,6 +210,7 @@ func Test_passkeyCodeDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
CodeID: "123", CodeID: "123",
@ -209,6 +221,10 @@ func Test_passkeyCodeDetailsToPb(t *testing.T) {
want: &user.CreatePasskeyRegistrationLinkResponse{ want: &user.CreatePasskeyRegistrationLinkResponse{
Details: &object.Details{ Details: &object.Details{
Sequence: 22, Sequence: 22,
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ChangeDate: &timestamppb.Timestamp{ ChangeDate: &timestamppb.Timestamp{
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,

View File

@ -43,6 +43,7 @@ func Test_u2fRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -59,6 +60,7 @@ func Test_u2fRegistrationDetailsToPb(t *testing.T) {
ObjectDetails: &domain.ObjectDetails{ ObjectDetails: &domain.ObjectDetails{
Sequence: 22, Sequence: 22,
EventDate: time.Unix(3000, 22), EventDate: time.Unix(3000, 22),
CreationDate: time.Unix(3000, 22),
ResourceOwner: "me", ResourceOwner: "me",
}, },
ID: "123", ID: "123",
@ -69,6 +71,10 @@ func Test_u2fRegistrationDetailsToPb(t *testing.T) {
want: &user.RegisterU2FResponse{ want: &user.RegisterU2FResponse{
Details: &object.Details{ Details: &object.Details{
Sequence: 22, Sequence: 22,
CreationDate: &timestamppb.Timestamp{
Seconds: 3000,
Nanos: 22,
},
ChangeDate: &timestamppb.Timestamp{ ChangeDate: &timestamppb.Timestamp{
Seconds: 3000, Seconds: 3000,
Nanos: 22, Nanos: 22,

View File

@ -19,6 +19,7 @@ import (
type Details interface { type Details interface {
comparable comparable
GetSequence() uint64 GetSequence() uint64
GetCreationDate() *timestamppb.Timestamp
GetChangeDate() *timestamppb.Timestamp GetChangeDate() *timestamppb.Timestamp
GetResourceOwner() string GetResourceOwner() string
} }
@ -62,6 +63,12 @@ func AssertDetails[D Details, M DetailsMsg[D]](t assert.TestingT, expected, actu
assert.NotZero(t, gotDetails.GetSequence()) assert.NotZero(t, gotDetails.GetSequence())
if wantDetails.GetCreationDate() != nil {
wantCreationDate := time.Now()
gotCreationDate := gotDetails.GetCreationDate().AsTime()
assert.WithinRange(t, gotCreationDate, wantCreationDate.Add(-time.Minute), wantCreationDate.Add(time.Minute))
}
if wantDetails.GetChangeDate() != nil { if wantDetails.GetChangeDate() != nil {
wantChangeDate := time.Now() wantChangeDate := time.Now()
gotChangeDate := gotDetails.GetChangeDate().AsTime() gotChangeDate := gotDetails.GetChangeDate().AsTime()

View File

@ -78,6 +78,8 @@ message Details {
example: "\"69629023906488334\""; example: "\"69629023906488334\"";
} }
]; ];
//creation_date is the timestamp where the first operation on the object was made
google.protobuf.Timestamp creation_date = 4;
} }
message ListDetails { message ListDetails {

View File

@ -78,6 +78,8 @@ message Details {
example: "\"69629023906488334\""; example: "\"69629023906488334\"";
} }
]; ];
//creation_date is the timestamp where the first operation on the object was made
google.protobuf.Timestamp creation_date = 4;
} }
message ListDetails { message ListDetails {