From 6bce64f15961ec9f2a59bd9d424b7390c583d214 Mon Sep 17 00:00:00 2001 From: gogacoder Date: Sun, 9 Mar 2025 20:17:42 +0700 Subject: [PATCH] fix: create --- .../app/internal/services/authorservice.ts | 8 ++-- .../app/internal/services/postservice.ts | 8 ++-- internal/services/append_associations.go | 45 +++++++++++++++++++ internal/services/author.go | 8 +++- 4 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 internal/services/append_associations.go diff --git a/frontend/bindings/app/internal/services/authorservice.ts b/frontend/bindings/app/internal/services/authorservice.ts index b6380f1..6ec3d81 100644 --- a/frontend/bindings/app/internal/services/authorservice.ts +++ b/frontend/bindings/app/internal/services/authorservice.ts @@ -20,7 +20,7 @@ export function Count(): Promise & { cancel(): void } { export function Create(item: $models.Author): Promise<$models.Author> & { cancel(): void } { let $resultPromise = $Call.ByID(3684602449, item) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType0($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); @@ -34,7 +34,7 @@ export function Delete(id: number): Promise & { cancel(): void } { export function GetAll(): Promise<($models.Author | null)[]> & { cancel(): void } { let $resultPromise = $Call.ByID(3248293926) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType2($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); @@ -43,7 +43,7 @@ export function GetAll(): Promise<($models.Author | null)[]> & { cancel(): void export function GetById(id: number): Promise<$models.Author | null> & { cancel(): void } { let $resultPromise = $Call.ByID(1703016211, id) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType1($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); @@ -52,7 +52,7 @@ export function GetById(id: number): Promise<$models.Author | null> & { cancel() export function Update(item: $models.Author): Promise<$models.Author> & { cancel(): void } { let $resultPromise = $Call.ByID(2240704960, item) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType0($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); diff --git a/frontend/bindings/app/internal/services/postservice.ts b/frontend/bindings/app/internal/services/postservice.ts index 72d6196..04dec58 100644 --- a/frontend/bindings/app/internal/services/postservice.ts +++ b/frontend/bindings/app/internal/services/postservice.ts @@ -20,7 +20,7 @@ export function Count(): Promise & { cancel(): void } { export function Create(item: $models.Post): Promise<$models.Post> & { cancel(): void } { let $resultPromise = $Call.ByID(1443399856, item) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType0($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); @@ -39,7 +39,7 @@ export function ExportToExcel(): Promise & { cancel(): void } { export function GetAll(): Promise<($models.Post | null)[]> & { cancel(): void } { let $resultPromise = $Call.ByID(65691059) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType2($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); @@ -48,7 +48,7 @@ export function GetAll(): Promise<($models.Post | null)[]> & { cancel(): void } export function GetById(id: number): Promise<$models.Post | null> & { cancel(): void } { let $resultPromise = $Call.ByID(4074736792, id) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType1($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); @@ -57,7 +57,7 @@ export function GetById(id: number): Promise<$models.Post | null> & { cancel(): export function Update(item: $models.Post): Promise<$models.Post> & { cancel(): void } { let $resultPromise = $Call.ByID(137798821, item) as any; - let $typingPromise = $resultPromise.then(($result: any) => { + let $typingPromise = $resultPromise.then(($result) => { return $$createType0($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); diff --git a/internal/services/append_associations.go b/internal/services/append_associations.go new file mode 100644 index 0000000..0ba068f --- /dev/null +++ b/internal/services/append_associations.go @@ -0,0 +1,45 @@ +package services + +import ( + "errors" + "reflect" + + "gorm.io/gorm" +) + +// AppendAssociations uses reflection to find all exported slice fields +// in 'item' and then appends any elements in each slice to the association. +func AppendAssociations(db *gorm.DB, item interface{}) error { + // We expect a pointer to a struct so we can do db.Model(item). + val := reflect.ValueOf(item) + if val.Kind() != reflect.Ptr { + return errors.New("item must be a pointer to a struct") + } + + elem := val.Elem() + if elem.Kind() != reflect.Struct { + return errors.New("item must be a pointer to a struct") + } + + t := elem.Type() + for i := 0; i < elem.NumField(); i++ { + fieldVal := elem.Field(i) + fieldType := t.Field(i) + + // Process only exported fields (PkgPath == "") and slices. + if fieldType.PkgPath == "" && fieldVal.Kind() == reflect.Slice { + // The association name is the struct field name by default. + assocName := fieldType.Name + + // Append slice elements to the existing association. + // You can add checks here if you want to skip empty slices, etc. + if fieldVal.Len() > 0 { + if err := db.Model(item).Association(assocName).Append(fieldVal.Interface()); err != nil { + return err + } + } + } + } + + return nil +} diff --git a/internal/services/author.go b/internal/services/author.go index 9f59e9e..0a98461 100644 --- a/internal/services/author.go +++ b/internal/services/author.go @@ -15,14 +15,20 @@ type Author = models.Author func (service *AuthorService) Create(item Author) (Author, error) { ReplaceEmptySlicesWithNil(&item) - err := dal.Author.Preload(field.Associations).Create(&item) + err := dal.Author.Create(&item) + if err != nil { + return item, err + } + err = AppendAssociations(database.GetInstance(), &item) return item, err } + func (service *AuthorService) GetAll() ([]*Author, error) { var authors []*Author authors, err := dal.Author.Preload(field.Associations).Find() return authors, err } + func (service *AuthorService) GetById(id uint) (*Author, error) { item, err := dal.Author.Preload(field.Associations).Where(dal.Author.Id.Eq(id)).First() if err != nil {