From c5ce8500e5990245c8f81239bc25fe4df3b2928a Mon Sep 17 00:00:00 2001 From: elliot14A Date: Tue, 13 Jun 2023 12:27:36 +0530 Subject: [PATCH 1/2] feat: create post & medium association --- server/action/medium/delete.go | 8 ++++++++ server/action/organisation/application/space/create.go | 1 + server/action/organisation/application/space/delete.go | 4 ++++ server/action/organisation/application/space/details.go | 2 +- server/action/organisation/application/space/list.go | 1 + server/action/organisation/application/space/update.go | 9 ++++++++- server/model/medium.go | 1 + server/model/space.go | 2 ++ 8 files changed, 26 insertions(+), 2 deletions(-) diff --git a/server/action/medium/delete.go b/server/action/medium/delete.go index 352a57d5..e07c8d16 100644 --- a/server/action/medium/delete.go +++ b/server/action/medium/delete.go @@ -87,6 +87,14 @@ func delete(w http.ResponseWriter, r *http.Request) { return } + model.DB.Model(&model.Space{}).Where(&model.Space{MediumID: &uintID}).Count(&totAssociated) + + if totAssociated != 0 { + loggerx.Error(errors.New("medium is associated with space")) + errorx.Render(w, errorx.Parser(errorx.CannotDelete("media", "space"))) + return + } + model.DB.Delete(&result) renderx.JSON(w, http.StatusOK, nil) } diff --git a/server/action/organisation/application/space/create.go b/server/action/organisation/application/space/create.go index 40b2fe97..60abd36a 100644 --- a/server/action/organisation/application/space/create.go +++ b/server/action/organisation/application/space/create.go @@ -124,6 +124,7 @@ func create(w http.ResponseWriter, r *http.Request) { ID: uint(uID), }, }) + err = tx.Model(&model.Space{}).Create(&space).Error if err != nil { tx.Rollback() diff --git a/server/action/organisation/application/space/delete.go b/server/action/organisation/application/space/delete.go index ae50468c..f4261d55 100644 --- a/server/action/organisation/application/space/delete.go +++ b/server/action/organisation/application/space/delete.go @@ -97,6 +97,10 @@ func delete(w http.ResponseWriter, r *http.Request) { errorx.Render(w, errorx.Parser(errorx.RecordNotFound())) return } + // delete the medium associated with the space + if space.MediumID != nil { + err = tx.Model(&model.Medium{}).Where("id = ?", *space.MediumID).Delete(&model.Medium{}).Error + } err = tx.Model(&model.Space{}).Where("id = ?", space.ID).Delete(space).Error if err != nil { diff --git a/server/action/organisation/application/space/details.go b/server/action/organisation/application/space/details.go index 260303d9..70835b12 100644 --- a/server/action/organisation/application/space/details.go +++ b/server/action/organisation/application/space/details.go @@ -81,7 +81,7 @@ func details(w http.ResponseWriter, r *http.Request) { Base: model.Base{ ID: uint(sID), }, - }).Preload("Users").Preload("Organisation").Preload("Application").Preload("Tokens").Find(&space).Error + }).Preload("Users").Preload("Organisation").Preload("Application").Preload("Tokens").Preload("Medium").Find(&space).Error if err != nil { loggerx.Error(err) errorx.Render(w, errorx.Parser(errorx.DBError())) diff --git a/server/action/organisation/application/space/list.go b/server/action/organisation/application/space/list.go index 511e7c72..2517a5a4 100644 --- a/server/action/organisation/application/space/list.go +++ b/server/action/organisation/application/space/list.go @@ -100,6 +100,7 @@ func list(w http.ResponseWriter, r *http.Request) { ID: uint(spaceID), }, }).Preload("Users").Preload("Organisation").Preload("Application").Preload("Tokens"). + Preload("Medium"). Find(&space).Error if err != nil { loggerx.Error(err) diff --git a/server/action/organisation/application/space/update.go b/server/action/organisation/application/space/update.go index 74817dc5..d1c28e06 100644 --- a/server/action/organisation/application/space/update.go +++ b/server/action/organisation/application/space/update.go @@ -101,8 +101,15 @@ func update(w http.ResponseWriter, r *http.Request) { "name": space.Name, "slug": space.Slug, "description": space.Description, - "meta_fields": space.MetaFields, + "meta_fields": space.MetaFields, } + + if space.MediumID == nil { + updateMap["medium_id"] = nil + } else { + updateMap["medium_id"] = *space.MediumID + } + updatedSpace := new(model.Space) err = tx.Model(&model.Space{}).Where("id = ?", space.ID).Updates(updateMap).First(updatedSpace).Error if err != nil { diff --git a/server/model/medium.go b/server/model/medium.go index 69f702a2..e191796e 100644 --- a/server/model/medium.go +++ b/server/model/medium.go @@ -25,6 +25,7 @@ type Medium struct { URL postgres.Jsonb `gorm:"column:url" json:"url" swaggertype:"primitive,string"` Dimensions string `gorm:"column:dimensions" json:"dimensions"` UserID uint `gorm:"column:user_id" json:"user_id"` + Space *Space `gorm:"foreignKey:MediumID" json:"space"` } // TableName medium table name diff --git a/server/model/space.go b/server/model/space.go index e8cbb559..a9be7d7b 100644 --- a/server/model/space.go +++ b/server/model/space.go @@ -15,6 +15,8 @@ type Space struct { Organisation *Organisation `gorm:"foreignKey:organisation_id" json:"organisation"` ApplicationID uint `gorm:"column:application_id" json:"application_id"` Application *Application `gorm:"foreignKey:application_id" json:"application"` + MediumID *uint `gorm:"column:medium_id" json:"medium_id,omitempty"` + Medium *Medium `gorm:"foreignKey:medium_id" json:"medium,omitempty"` Users []User `gorm:"many2many:space_users;" json:"users"` Roles []SpaceRole `gorm:"many2many:space_roles;" json:"roles"` Tokens []SpaceToken `json:"tokens"` From 1ee60895235bcb04937ef6c74a06c72d31b53e28 Mon Sep 17 00:00:00 2001 From: elliot14A Date: Tue, 13 Jun 2023 12:40:43 +0530 Subject: [PATCH 2/2] feat: update medium delete method to make MediumID field in space to nil upon Medium is being deleted --- server/action/medium/delete.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/server/action/medium/delete.go b/server/action/medium/delete.go index e07c8d16..55bef786 100644 --- a/server/action/medium/delete.go +++ b/server/action/medium/delete.go @@ -87,11 +87,10 @@ func delete(w http.ResponseWriter, r *http.Request) { return } - model.DB.Model(&model.Space{}).Where(&model.Space{MediumID: &uintID}).Count(&totAssociated) - - if totAssociated != 0 { - loggerx.Error(errors.New("medium is associated with space")) - errorx.Render(w, errorx.Parser(errorx.CannotDelete("media", "space"))) + err = model.DB.Model(&model.Space{}).Where(&model.Space{MediumID: &result.ID}).Update("medium_id", nil).Error + if err != nil { + loggerx.Error(err) + errorx.Render(w, errorx.Parser(errorx.DBError())) return }