From 390c429480b80b463663260e0e714c4e897f17e1 Mon Sep 17 00:00:00 2001
From: ko_oler <kooler89@gmail.com>
Date: Mon, 12 Feb 2024 16:23:30 +0300
Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20FindOptio?=
 =?UTF-8?q?nsFromPB=20=D0=B8=20FindOptionsToPB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/options/options.go | 56 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 55 insertions(+), 1 deletion(-)

diff --git a/pkg/options/options.go b/pkg/options/options.go
index 09296f35..066d3f8a 100644
--- a/pkg/options/options.go
+++ b/pkg/options/options.go
@@ -1,6 +1,10 @@
 package options
 
-import "time"
+import (
+	"time"
+
+	commonpb "git.perx.ru/perxis/perxis-go/proto/common"
+)
 
 // SortOptions настройки сортировки результатов
 type SortOptions struct {
@@ -82,6 +86,56 @@ func MergeFindOptions(opts ...interface{}) *FindOptions {
 	return fo
 }
 
+func FindOptionsFromPB(protoOpts *commonpb.FindOptions) *FindOptions {
+	if protoOpts == nil {
+		return nil
+	}
+	fo := &FindOptions{
+		SortOptions: SortOptions{
+			Sort: protoOpts.Sort,
+		},
+		PaginationOptions: PaginationOptions{
+			Offset: int(protoOpts.Offset),
+			Limit:  int(protoOpts.Limit),
+		},
+		FieldOptions: FieldOptions{
+			Fields:        protoOpts.Fields,
+			ExcludeFields: protoOpts.ExcludeFields,
+		},
+	}
+
+	if fo.Offset == 0 && fo.Limit == 0 && fo.PageSize != 0 {
+		fo.Offset = fo.PageSize * (fo.PageNum - 1)
+		fo.Limit = fo.PageSize
+	}
+
+	return fo
+}
+
+func FindOptionsToPB(opts *FindOptions) *commonpb.FindOptions {
+	if opts == nil {
+		return nil
+	}
+	fo := &commonpb.FindOptions{
+		Sort:          opts.Sort,
+		PageNum:       int32(opts.PageNum),
+		PageSize:      int32(opts.PageSize),
+		Offset:        int32(opts.Offset),
+		Limit:         int32(opts.Limit),
+		Fields:        opts.Fields,
+		ExcludeFields: opts.ExcludeFields,
+	}
+	if fo.PageSize != 0 && fo.Limit == 0 {
+		fo.Limit = fo.PageSize
+		fo.Offset = fo.PageSize * (fo.PageNum - 1)
+	}
+	if fo.Limit != 0 && fo.PageSize == 0 {
+		fo.PageSize = fo.Limit
+		fo.PageNum = fo.Offset / fo.Limit
+	}
+	return fo
+}
+
 type TimeFilter struct {
 	Before, After time.Time
 }
-- 
GitLab