docs: reorder & testing

This commit is contained in:
Ilia Denisov
2026-05-07 00:58:53 +03:00
committed by GitHub
parent f446c6a2ac
commit 604fe40bcf
148 changed files with 9150 additions and 2757 deletions
+265
View File
@@ -510,3 +510,268 @@ func recoverUserDecodePanic[T any](message string, result **T, err *error) {
*err = fmt.Errorf("%s: panic recovered: %v", message, recovered)
}
}
// ListMySessionsRequestToPayload converts usermodel.ListMySessionsRequest
// to FlatBuffers bytes suitable for the authenticated gateway transport.
func ListMySessionsRequestToPayload(request *usermodel.ListMySessionsRequest) ([]byte, error) {
if request == nil {
return nil, errors.New("encode list my sessions request payload: request is nil")
}
builder := flatbuffers.NewBuilder(32)
userfbs.ListMySessionsRequestStart(builder)
offset := userfbs.ListMySessionsRequestEnd(builder)
userfbs.FinishListMySessionsRequestBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToListMySessionsRequest converts FlatBuffers payload bytes into
// usermodel.ListMySessionsRequest.
func PayloadToListMySessionsRequest(data []byte) (result *usermodel.ListMySessionsRequest, err error) {
if len(data) == 0 {
return nil, errors.New("decode list my sessions request payload: data is empty")
}
defer recoverUserDecodePanic("decode list my sessions request payload", &result, &err)
_ = userfbs.GetRootAsListMySessionsRequest(data, 0)
return &usermodel.ListMySessionsRequest{}, nil
}
// ListMySessionsResponseToPayload converts usermodel.ListMySessionsResponse
// to FlatBuffers bytes suitable for the authenticated gateway transport.
func ListMySessionsResponseToPayload(response *usermodel.ListMySessionsResponse) ([]byte, error) {
if response == nil {
return nil, errors.New("encode list my sessions response payload: response is nil")
}
builder := flatbuffers.NewBuilder(256)
itemOffsets := make([]flatbuffers.UOffsetT, len(response.Items))
for index := range response.Items {
itemOffsets[index] = encodeDeviceSession(builder, response.Items[index])
}
var itemsVector flatbuffers.UOffsetT
if len(itemOffsets) > 0 {
userfbs.ListMySessionsResponseStartItemsVector(builder, len(itemOffsets))
for index := len(itemOffsets) - 1; index >= 0; index-- {
builder.PrependUOffsetT(itemOffsets[index])
}
itemsVector = builder.EndVector(len(itemOffsets))
}
userfbs.ListMySessionsResponseStart(builder)
if itemsVector != 0 {
userfbs.ListMySessionsResponseAddItems(builder, itemsVector)
}
offset := userfbs.ListMySessionsResponseEnd(builder)
userfbs.FinishListMySessionsResponseBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToListMySessionsResponse converts FlatBuffers payload bytes into
// usermodel.ListMySessionsResponse.
func PayloadToListMySessionsResponse(data []byte) (result *usermodel.ListMySessionsResponse, err error) {
if len(data) == 0 {
return nil, errors.New("decode list my sessions response payload: data is empty")
}
defer recoverUserDecodePanic("decode list my sessions response payload", &result, &err)
response := userfbs.GetRootAsListMySessionsResponse(data, 0)
count := response.ItemsLength()
out := &usermodel.ListMySessionsResponse{
Items: make([]usermodel.DeviceSession, 0, count),
}
view := new(userfbs.DeviceSessionView)
for index := 0; index < count; index++ {
if !response.Items(view, index) {
return nil, fmt.Errorf("decode list my sessions response payload: item %d is missing", index)
}
out.Items = append(out.Items, decodeDeviceSession(view))
}
return out, nil
}
// RevokeMySessionRequestToPayload converts usermodel.RevokeMySessionRequest
// to FlatBuffers bytes suitable for the authenticated gateway transport.
func RevokeMySessionRequestToPayload(request *usermodel.RevokeMySessionRequest) ([]byte, error) {
if request == nil {
return nil, errors.New("encode revoke my session request payload: request is nil")
}
builder := flatbuffers.NewBuilder(64)
deviceSessionID := builder.CreateString(request.DeviceSessionID)
userfbs.RevokeMySessionRequestStart(builder)
userfbs.RevokeMySessionRequestAddDeviceSessionId(builder, deviceSessionID)
offset := userfbs.RevokeMySessionRequestEnd(builder)
userfbs.FinishRevokeMySessionRequestBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToRevokeMySessionRequest converts FlatBuffers payload bytes into
// usermodel.RevokeMySessionRequest.
func PayloadToRevokeMySessionRequest(data []byte) (result *usermodel.RevokeMySessionRequest, err error) {
if len(data) == 0 {
return nil, errors.New("decode revoke my session request payload: data is empty")
}
defer recoverUserDecodePanic("decode revoke my session request payload", &result, &err)
request := userfbs.GetRootAsRevokeMySessionRequest(data, 0)
return &usermodel.RevokeMySessionRequest{
DeviceSessionID: string(request.DeviceSessionId()),
}, nil
}
// RevokeMySessionResponseToPayload converts usermodel.RevokeMySessionResponse
// to FlatBuffers bytes suitable for the authenticated gateway transport.
func RevokeMySessionResponseToPayload(response *usermodel.RevokeMySessionResponse) ([]byte, error) {
if response == nil {
return nil, errors.New("encode revoke my session response payload: response is nil")
}
builder := flatbuffers.NewBuilder(128)
sessionOffset := encodeDeviceSession(builder, response.Session)
userfbs.RevokeMySessionResponseStart(builder)
userfbs.RevokeMySessionResponseAddSession(builder, sessionOffset)
offset := userfbs.RevokeMySessionResponseEnd(builder)
userfbs.FinishRevokeMySessionResponseBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToRevokeMySessionResponse converts FlatBuffers payload bytes into
// usermodel.RevokeMySessionResponse.
func PayloadToRevokeMySessionResponse(data []byte) (result *usermodel.RevokeMySessionResponse, err error) {
if len(data) == 0 {
return nil, errors.New("decode revoke my session response payload: data is empty")
}
defer recoverUserDecodePanic("decode revoke my session response payload", &result, &err)
response := userfbs.GetRootAsRevokeMySessionResponse(data, 0)
view := response.Session(nil)
if view == nil {
return nil, errors.New("decode revoke my session response payload: session is missing")
}
return &usermodel.RevokeMySessionResponse{Session: decodeDeviceSession(view)}, nil
}
// RevokeAllMySessionsRequestToPayload converts
// usermodel.RevokeAllMySessionsRequest to FlatBuffers bytes suitable for
// the authenticated gateway transport.
func RevokeAllMySessionsRequestToPayload(request *usermodel.RevokeAllMySessionsRequest) ([]byte, error) {
if request == nil {
return nil, errors.New("encode revoke all my sessions request payload: request is nil")
}
builder := flatbuffers.NewBuilder(32)
userfbs.RevokeAllMySessionsRequestStart(builder)
offset := userfbs.RevokeAllMySessionsRequestEnd(builder)
userfbs.FinishRevokeAllMySessionsRequestBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToRevokeAllMySessionsRequest converts FlatBuffers payload bytes
// into usermodel.RevokeAllMySessionsRequest.
func PayloadToRevokeAllMySessionsRequest(data []byte) (result *usermodel.RevokeAllMySessionsRequest, err error) {
if len(data) == 0 {
return nil, errors.New("decode revoke all my sessions request payload: data is empty")
}
defer recoverUserDecodePanic("decode revoke all my sessions request payload", &result, &err)
_ = userfbs.GetRootAsRevokeAllMySessionsRequest(data, 0)
return &usermodel.RevokeAllMySessionsRequest{}, nil
}
// RevokeAllMySessionsResponseToPayload converts
// usermodel.RevokeAllMySessionsResponse to FlatBuffers bytes suitable
// for the authenticated gateway transport.
func RevokeAllMySessionsResponseToPayload(response *usermodel.RevokeAllMySessionsResponse) ([]byte, error) {
if response == nil {
return nil, errors.New("encode revoke all my sessions response payload: response is nil")
}
builder := flatbuffers.NewBuilder(64)
userID := builder.CreateString(response.Summary.UserID)
userfbs.DeviceSessionRevocationSummaryViewStart(builder)
userfbs.DeviceSessionRevocationSummaryViewAddUserId(builder, userID)
userfbs.DeviceSessionRevocationSummaryViewAddRevokedCount(builder, int32(response.Summary.RevokedCount))
summaryOffset := userfbs.DeviceSessionRevocationSummaryViewEnd(builder)
userfbs.RevokeAllMySessionsResponseStart(builder)
userfbs.RevokeAllMySessionsResponseAddSummary(builder, summaryOffset)
offset := userfbs.RevokeAllMySessionsResponseEnd(builder)
userfbs.FinishRevokeAllMySessionsResponseBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToRevokeAllMySessionsResponse converts FlatBuffers payload bytes
// into usermodel.RevokeAllMySessionsResponse.
func PayloadToRevokeAllMySessionsResponse(data []byte) (result *usermodel.RevokeAllMySessionsResponse, err error) {
if len(data) == 0 {
return nil, errors.New("decode revoke all my sessions response payload: data is empty")
}
defer recoverUserDecodePanic("decode revoke all my sessions response payload", &result, &err)
response := userfbs.GetRootAsRevokeAllMySessionsResponse(data, 0)
summary := response.Summary(nil)
if summary == nil {
return nil, errors.New("decode revoke all my sessions response payload: summary is missing")
}
return &usermodel.RevokeAllMySessionsResponse{
Summary: usermodel.DeviceSessionRevocationSummary{
UserID: string(summary.UserId()),
RevokedCount: int(summary.RevokedCount()),
},
}, nil
}
func encodeDeviceSession(builder *flatbuffers.Builder, sess usermodel.DeviceSession) flatbuffers.UOffsetT {
deviceSessionID := builder.CreateString(sess.DeviceSessionID)
userID := builder.CreateString(sess.UserID)
status := builder.CreateString(sess.Status)
var clientPublicKey flatbuffers.UOffsetT
if sess.ClientPublicKey != "" {
clientPublicKey = builder.CreateString(sess.ClientPublicKey)
}
userfbs.DeviceSessionViewStart(builder)
userfbs.DeviceSessionViewAddDeviceSessionId(builder, deviceSessionID)
userfbs.DeviceSessionViewAddUserId(builder, userID)
userfbs.DeviceSessionViewAddStatus(builder, status)
if clientPublicKey != 0 {
userfbs.DeviceSessionViewAddClientPublicKey(builder, clientPublicKey)
}
userfbs.DeviceSessionViewAddCreatedAtMs(builder, sess.CreatedAt.UTC().UnixMilli())
if sess.RevokedAt != nil {
userfbs.DeviceSessionViewAddRevokedAtMs(builder, sess.RevokedAt.UTC().UnixMilli())
}
if sess.LastSeenAt != nil {
userfbs.DeviceSessionViewAddLastSeenAtMs(builder, sess.LastSeenAt.UTC().UnixMilli())
}
return userfbs.DeviceSessionViewEnd(builder)
}
func decodeDeviceSession(view *userfbs.DeviceSessionView) usermodel.DeviceSession {
return usermodel.DeviceSession{
DeviceSessionID: string(view.DeviceSessionId()),
UserID: string(view.UserId()),
Status: string(view.Status()),
ClientPublicKey: string(view.ClientPublicKey()),
CreatedAt: time.UnixMilli(view.CreatedAtMs()).UTC(),
RevokedAt: optionalUnixMilli(view.RevokedAtMs()),
LastSeenAt: optionalUnixMilli(view.LastSeenAtMs()),
}
}