1
0
mirror of https://github.com/ManyakRus/crud_generator.git synced 2025-01-04 13:23:00 +02:00
crud_generator/internal/create_files/protobuf/protobuf.go

450 lines
14 KiB
Go
Raw Normal View History

package protobuf
2023-10-26 13:18:38 +02:00
import (
"github.com/ManyakRus/crud_generator/internal/config"
"github.com/ManyakRus/crud_generator/internal/create_files"
"github.com/ManyakRus/crud_generator/internal/folders"
2023-10-26 13:18:38 +02:00
"github.com/ManyakRus/crud_generator/internal/types"
2024-05-13 17:07:32 +02:00
"github.com/ManyakRus/crud_generator/pkg/dbmeta"
2023-10-26 13:18:38 +02:00
"github.com/ManyakRus/starter/log"
"github.com/ManyakRus/starter/micro"
"os"
"sort"
2024-06-04 13:39:37 +02:00
"strconv"
2023-10-26 13:18:38 +02:00
"strings"
)
2023-11-15 10:43:15 +02:00
// CreateAllFiles - создаёт все файлы в папке grpc proto
2023-10-26 13:18:38 +02:00
func CreateAllFiles(MapAll map[string]*types.Table) error {
var err error
err = CreateFileProto(MapAll)
if err != nil {
log.Error("CreateFileProto() error: ", err)
return err
}
return err
}
// CreateFileProto - создаёт 1 файл в папке grpc
func CreateFileProto(MapAll map[string]*types.Table) error {
var err error
//чтение файлов
DirBin := micro.ProgramDir_bin()
2023-11-01 16:34:57 +02:00
DirTemplates := DirBin + config.Settings.TEMPLATE_FOLDERNAME + micro.SeparatorFile()
DirReady := DirBin + config.Settings.READY_FOLDERNAME + micro.SeparatorFile()
2023-11-15 12:58:31 +02:00
DirTemplatesProto := DirTemplates + config.Settings.TEMPLATE_FOLDERNAME_GRPC_PROTO + micro.SeparatorFile()
DirReadyProto := DirReady + config.Settings.TEMPLATE_FOLDERNAME_GRPC_PROTO + micro.SeparatorFile()
2023-10-26 13:18:38 +02:00
FilenameReadyProto := DirReadyProto + config.Settings.SERVICE_NAME + ".proto"
//создадим папку готовых файлов
folders.CreateFolder(DirReadyProto)
2023-11-15 16:59:21 +02:00
FilenameTemplateProto := DirTemplatesProto + "service.proto_"
if config.Settings.TEMPLATE_EXTERNAL_PROTO_FILENAME != "" {
FilenameTemplateProto = config.Settings.TEMPLATE_EXTERNAL_PROTO_FILENAME
}
2023-10-26 13:18:38 +02:00
bytes, err := os.ReadFile(FilenameTemplateProto)
if err != nil {
log.Panic("ReadFile() ", FilenameTemplateProto, " error: ", err)
}
TextProto := string(bytes)
//заменим название сервиса
2023-11-07 16:58:02 +02:00
ServiceName := config.Settings.SERVICE_NAME
ServiceNameProto := micro.StringFromUpperCase(ServiceName)
TEMPLATE_SERVICE_NAME := config.Settings.TEMPLATE_SERVICE_NAME
TextProto = strings.ReplaceAll(TextProto, TEMPLATE_SERVICE_NAME, ServiceNameProto)
//заменим ещё раз с большой буквы
TEMPLATE_SERVICE_NAME = micro.StringFromUpperCase(TEMPLATE_SERVICE_NAME)
TextProto = strings.ReplaceAll(TextProto, TEMPLATE_SERVICE_NAME, ServiceNameProto)
2023-10-26 13:18:38 +02:00
//сортировка по названию таблиц
keys := make([]string, 0, len(MapAll))
for k := range MapAll {
keys = append(keys, k)
}
sort.Strings(keys)
//найдём новый текст для каждой таблицы
TextProtoNew := ""
2023-10-26 13:18:38 +02:00
for _, key1 := range keys {
Table1, ok := MapAll[key1]
if ok == false {
log.Panic("MapAll[key1] not found")
}
2023-11-03 13:21:35 +02:00
2024-06-04 13:39:37 +02:00
//проверка что таблица нормальная
2024-09-06 14:10:00 +02:00
err1 := create_files.IsGood_Table(Table1)
2024-06-04 17:03:27 +02:00
if err1 != nil {
log.Warn(err1)
2024-06-04 13:39:37 +02:00
continue
}
2024-09-17 13:41:37 +02:00
TextProtoNew = TextProtoNew + FindText_ProtoTable1(TextProto, Table1)
TextProtoNew = TextProtoNew + FindText_ProtoTable1_UpdateManyFields(TextProto, Table1)
TextProtoNew = TextProtoNew + FindText_ProtoTable1_UpdateEveryColumn(TextProto, Table1)
2024-03-06 16:45:55 +02:00
2024-08-16 11:44:58 +02:00
//добавим текст FindBy
TextProtoNew1 := ""
TextProto, TextProtoNew1 = FindText_FindBy(TextProto, Table1)
2024-08-21 12:25:41 +02:00
TextProtoNew = TextProtoNew + TextProtoNew1
2024-08-16 11:44:58 +02:00
//добавим текст FindMassBy
2024-08-21 12:25:41 +02:00
TextProto, TextProtoNew1 = FindText_FindMassBy(TextProto, Table1)
TextProtoNew = TextProtoNew + TextProtoNew1
2024-08-16 11:44:58 +02:00
2024-09-17 15:50:01 +02:00
//добавим текст ReadAll
TextProto, TextProtoNew1 = FindText_ReadAll(TextProto, Table1)
TextProtoNew = TextProtoNew + TextProtoNew1
2024-10-15 15:39:32 +02:00
//добавим текст FindModelBy
2024-10-17 13:14:00 +02:00
TextProto, TextProtoNew1 = FindText_FindModelBy(MapAll, TextProto, Table1)
2024-10-15 15:39:32 +02:00
TextProtoNew = TextProtoNew + TextProtoNew1
2024-11-06 12:33:26 +02:00
//cache
2024-03-06 16:45:55 +02:00
if config.Settings.NEED_CREATE_CACHE_API == true {
2024-09-17 13:41:37 +02:00
TextProtoNew = TextProtoNew + FindText_ProtoTable1_Cache(TextProto, Table1)
2024-03-06 16:45:55 +02:00
}
2024-11-06 12:33:26 +02:00
//ReadObject
if config.Settings.NEED_CREATE_READOBJECT == true {
TextProto, TextProtoNew1 = FindText_ReadObject(TextProto, Table1)
}
TextProtoNew = TextProtoNew + TextProtoNew1
//
2024-05-13 17:07:32 +02:00
TextProto = AddTextMessageRequestID(TextProto, Table1)
}
2023-10-26 13:18:38 +02:00
//найдём куда вставить текст
sFind := "\nservice "
pos1 := strings.Index(TextProto, sFind)
if pos1 < 0 {
log.Panic("Not found text ", sFind)
}
2023-10-26 13:18:38 +02:00
s2 := TextProto[pos1+1:]
sFind = "\n"
posEnd := strings.Index(s2, sFind)
if posEnd < 0 {
log.Panic("Not found text ", sFind)
2023-10-26 13:18:38 +02:00
}
PosStart := pos1 + posEnd + 1
//
TextProto = TextProto[:PosStart] + TextProtoNew + TextProto[PosStart:]
2023-10-26 13:18:38 +02:00
2024-01-15 12:19:27 +02:00
//
2024-09-06 14:10:00 +02:00
TextProto = create_files.Delete_EmptyLines(TextProto)
2024-01-15 12:19:27 +02:00
2023-10-26 13:18:38 +02:00
//запись файла
2024-09-23 12:33:40 +02:00
err = os.WriteFile(FilenameReadyProto, []byte(TextProto), config.Settings.FILE_PERMISSIONS)
2023-10-26 13:18:38 +02:00
return err
}
//func FillTableProto1(TextProto string, Table1 *types.Table) string {
// Otvet := TextProto
//
// //ModelName := Table1.NameGo
//
//
// //создание текста
2024-09-17 13:41:37 +02:00
// TextProtoTable := FindText_ProtoTable1(Table1)
2023-10-26 13:18:38 +02:00
//
// return Otvet
//}
2024-06-04 13:39:37 +02:00
// AddTextMessageRequestID1 - в текст .proto добавляет message с RequestID
2024-05-13 17:07:32 +02:00
func AddTextMessageRequestID1(Text string, Table1 *types.Table) string {
Otvet := Text
//найдём текст RequestID
2024-09-06 14:10:00 +02:00
PrimaryKeyColumn := create_files.Find_PrimaryKeyColumn(Table1)
2024-05-13 17:07:32 +02:00
if PrimaryKeyColumn == nil {
return Otvet
}
2024-09-06 14:10:00 +02:00
TextRequest, TextFieldName := create_files.FindText_ProtobufRequest(Table1)
2024-05-13 17:07:32 +02:00
//найдём уже есть message
TextFind := "message " + TextRequest + " {"
pos1 := strings.Index(Otvet, TextFind)
if pos1 >= 0 {
return Otvet
}
//найдём ProtobufTypePK
MappingPK, ok := dbmeta.GetMappings()[PrimaryKeyColumn.Type]
if ok == false {
log.Error("Неизвестный тип столбца " + PrimaryKeyColumn.Type)
return Otvet
}
ProtobufTypePK := MappingPK.ProtobufType
//добавим message
TextMessage := `
// ` + TextRequest + ` - параметры запроса на сервер
message ` + TextRequest + ` {
2024-08-21 12:25:41 +02:00
uint32 VersionModel = 1; //версия структуры модели
` + ProtobufTypePK + ` ` + TextFieldName + ` = 2; // id записи в БД
2024-05-13 17:07:32 +02:00
}
`
Otvet = Otvet + TextMessage
return Otvet
}
2024-06-04 13:39:37 +02:00
// AddTextMessageRequestID_ManyPK - в текст .proto добавляет message с RequestID
func AddTextMessageRequestID_ManyPK(Text string, Table1 *types.Table) string {
Otvet := Text
//найдём текст RequestID
2024-09-06 14:10:00 +02:00
PrimaryKeyColumns := create_files.Find_PrimaryKeyColumns(Table1)
2024-06-04 13:39:37 +02:00
if len(PrimaryKeyColumns) == 0 {
return Otvet
}
Otvet = AddTextMessageRequestID_ColumnType_ManyPK(Otvet, Table1, PrimaryKeyColumns[0])
return Otvet
}
2024-05-13 17:07:32 +02:00
// AddTextMessageRequestID_ColumnType - в текст .proto добавляет message с RequestID_Int64
func AddTextMessageRequestID_ColumnType(Text string, Table1 *types.Table, Column1 *types.Column) string {
Otvet := Text
2024-06-04 13:39:37 +02:00
if Table1.PrimaryKeyColumnsCount == 1 {
Otvet = AddTextMessageRequestID_ColumnType1(Otvet, Table1, Column1)
} else {
Otvet = AddTextMessageRequestID_ColumnType_ManyPK(Otvet, Table1, Column1)
}
return Otvet
}
// AddTextMessageRequestID_ColumnType1 - в текст .proto добавляет message с RequestID_Int64, 1PK
func AddTextMessageRequestID_ColumnType1(Text string, Table1 *types.Table, Column1 *types.Column) string {
Otvet := Text
2024-05-13 17:07:32 +02:00
//найдём текст RequestID
2024-09-06 14:10:00 +02:00
PrimaryKeyColumn := create_files.Find_PrimaryKeyColumn(Table1)
2024-05-13 17:07:32 +02:00
if PrimaryKeyColumn == nil {
return Otvet
}
//
2024-09-06 14:10:00 +02:00
_, FieldNamePK := create_files.FindText_ProtobufRequest(Table1)
2024-05-13 17:07:32 +02:00
2024-09-06 14:10:00 +02:00
TextRequest, FieldName, _, _ := create_files.FindText_ProtobufRequest_ID_Type(Table1, Column1, "_")
2024-05-13 17:07:32 +02:00
//найдём уже есть message
TextFind := "message " + TextRequest + " {"
pos1 := strings.Index(Otvet, TextFind)
if pos1 >= 0 {
return Otvet
}
//найдём ProtobufTypePK
MappingPK, ok := dbmeta.GetMappings()[PrimaryKeyColumn.Type]
if ok == false {
log.Error("Неизвестный тип столбца " + PrimaryKeyColumn.Type)
return Otvet
}
ProtobufTypePK := MappingPK.ProtobufType
//найдём ProtobufTypeColumn
Mapping1, ok := dbmeta.GetMappings()[Column1.Type]
if ok == false {
log.Error("Неизвестный тип столбца " + Column1.Type)
return Otvet
}
ProtobufTypeColumn := Mapping1.ProtobufType
//добавим message
TextMessage := `
// ` + TextRequest + ` - параметры запроса на сервер
message ` + TextRequest + ` {
2024-08-21 12:25:41 +02:00
uint32 VersionModel = 1; //версия структуры модели
` + ProtobufTypePK + ` ` + FieldNamePK + ` = 2; // id записи в БД
2024-05-13 17:07:32 +02:00
` + ProtobufTypeColumn + ` ` + FieldName + ` = 3; // значение поиска
}
`
Otvet = Otvet + TextMessage
return Otvet
}
2024-06-04 13:39:37 +02:00
// AddTextMessageRequestID_ColumnType_ManyPK - в текст .proto добавляет message с RequestID_Int64, много PK
func AddTextMessageRequestID_ColumnType_ManyPK(Text string, Table1 *types.Table, Column1 *types.Column) string {
Otvet := Text
//найдём текст RequestID
2024-09-06 14:10:00 +02:00
PrimaryKeyColumns := create_files.Find_PrimaryKeyColumns(Table1)
2024-06-04 13:39:37 +02:00
if len(PrimaryKeyColumns) == 0 {
return Otvet
}
//
2024-09-06 14:10:00 +02:00
TextRequest := create_files.FindText_ProtobufRequest_Column_ManyPK(Table1, Column1)
2024-06-04 13:39:37 +02:00
//найдём уже есть message
TextFind := "message " + TextRequest + " {"
pos1 := strings.Index(Otvet, TextFind)
if pos1 >= 0 {
return Otvet
}
TextMessage := `
// ` + TextRequest + ` - параметры запроса на сервер
message ` + TextRequest + ` {
2024-08-21 12:25:41 +02:00
uint32 VersionModel = 1; //версия структуры модели`
2024-06-04 13:39:37 +02:00
//заполним строки про PrimaryKey
isPrimaryKey := false
Number := 1
for _, ColumnPK1 := range PrimaryKeyColumns {
Number = Number + 1
sNumber := strconv.Itoa(Number)
if Column1 == ColumnPK1 {
isPrimaryKey = true
}
//найдём ProtobufTypePK
MappingPK, ok := dbmeta.GetMappings()[ColumnPK1.Type]
if ok == false {
log.Error("Неизвестный тип столбца " + ColumnPK1.Type)
return Otvet
}
ProtobufTypePK := MappingPK.ProtobufType
2024-09-06 14:10:00 +02:00
_, FieldNamePK, _, _ := create_files.FindText_ProtobufRequest_ID_Type(Table1, ColumnPK1, "")
2024-06-04 13:39:37 +02:00
//добавим message
TextMessage = TextMessage + `
2024-08-21 12:25:41 +02:00
` + ProtobufTypePK + ` ` + FieldNamePK + ` = ` + sNumber + `; //id записи в БД`
2024-06-04 13:39:37 +02:00
}
//заполним строку про Column1
if isPrimaryKey == false {
//найдём ProtobufTypeColumn
Mapping1, ok := dbmeta.GetMappings()[Column1.Type]
if ok == false {
log.Error("Неизвестный тип столбца " + Column1.Type)
return Otvet
}
ProtobufTypeColumn := Mapping1.ProtobufType
2024-09-06 14:10:00 +02:00
_, FieldName, _, _ := create_files.FindText_ProtobufRequest_ID_Type(Table1, Column1, "")
2024-06-04 13:39:37 +02:00
Number = Number + 1
sNumber := strconv.Itoa(Number)
TextMessage = TextMessage + `
` + ProtobufTypeColumn + ` ` + FieldName + ` = ` + sNumber + `; //значение поиска`
}
TextMessage = TextMessage + `
}`
Otvet = Otvet + "\n" + TextMessage
return Otvet
}
2024-08-16 11:44:58 +02:00
// AddTextMessageRequestID_Columns - в текст .proto добавляет message из присланных колонок
func AddTextMessageRequestID_Columns(Text string, Columns []*types.Column) string {
Otvet := Text
2024-09-06 14:10:00 +02:00
TextRequest := "Request_" + create_files.Find_RequestFieldNames_FromMass(Columns)
2024-08-16 11:44:58 +02:00
//найдём уже есть message
TextFind := "message " + TextRequest + " {"
pos1 := strings.Index(Otvet, TextFind)
if pos1 >= 0 {
return Otvet
}
TextMessage := `
// ` + TextRequest + ` - параметры запроса на сервер
message ` + TextRequest + ` {
2024-08-21 12:25:41 +02:00
uint32 VersionModel = 1; //версия структуры модели`
2024-08-16 11:44:58 +02:00
2024-08-21 12:25:41 +02:00
//
for i, Column1 := range Columns {
ProtoType := create_files.Convert_GolangTypeNameToProtobufTypeName(Column1.TypeGo)
2024-09-06 14:10:00 +02:00
ProtoName := create_files.Find_RequestFieldName_FromMass(Column1, Columns)
2024-08-21 12:25:41 +02:00
TextMessage = TextMessage + `
` + ProtoType + ` ` + ProtoName + ` = ` + strconv.Itoa(i+2) + `; //значение поиска`
2024-08-21 12:25:41 +02:00
}
2024-08-16 11:44:58 +02:00
2024-10-15 15:39:32 +02:00
TextMessage = TextMessage + `
}`
Otvet = TextMessage
return Otvet
}
// AddTextMessageRequestModel_Column - в текст .proto добавляет message из присланных колонок
func AddTextMessageRequestModel_Column(Text string, Column1 *types.Column) string {
Otvet := Text
ProtoName := create_files.Convert_GolangTypeNameToProtobufFieldName(Column1.TypeGo)
TextRequest := "Request_Model_" + ProtoName
//найдём уже есть message
TextFind := "message " + TextRequest + " {"
pos1 := strings.Index(Otvet, TextFind)
if pos1 >= 0 {
return Otvet
}
TextMessage := `
// ` + TextRequest + ` - параметры запроса на сервер
message ` + TextRequest + ` {
uint32 VersionModel = 1; //версия структуры модели
string ModelString = 2; //объект-модель в формате json
`
//
//for i, Column1 := range Columns {
ProtoType := create_files.Convert_GolangTypeNameToProtobufTypeName(Column1.TypeGo)
//ProtoName := create_files.Find_RequestFieldName(Table1, Column1)
TextMessage = TextMessage + "\t" + ProtoType + ` ` + ProtoName + ` = 3; //значение поиска`
//}
2024-08-16 11:44:58 +02:00
TextMessage = TextMessage + `
}`
Otvet = Otvet + "\n" + TextMessage
return Otvet
}
2024-06-04 13:39:37 +02:00
// AddTextMessageRequestID - возвращает текст в .proto для таблицы
2024-05-13 17:07:32 +02:00
func AddTextMessageRequestID(TextProto string, Table1 *types.Table) string {
Otvet := TextProto //"\n\t//\n"
2024-06-04 13:39:37 +02:00
Otvet = AddTextMessageRequestID_ManyPK(Otvet, Table1)
2024-05-13 17:07:32 +02:00
//сортировка по названию колонок
keys := make([]string, 0, len(Table1.MapColumns))
for k := range Table1.MapColumns {
keys = append(keys, k)
}
sort.Strings(keys)
//для каждой колонки добавим добавим message RequestId_Int64
for _, key1 := range keys {
Column1, ok := Table1.MapColumns[key1]
if ok == false {
2024-09-17 13:41:37 +02:00
log.Panic("FindText_ProtoTable1_UpdateEveryColumn() Table1.MapColumns[key1] = false")
2024-05-13 17:07:32 +02:00
}
2024-06-04 13:39:37 +02:00
Otvet = AddTextMessageRequestID_ColumnType_ManyPK(Otvet, Table1, Column1)
2024-05-13 17:07:32 +02:00
}
return Otvet
}