Skip to content

Commit 8ec3445

Browse files
committed
Add force delete KM
1 parent 8d909f1 commit 8ec3445

File tree

15 files changed

+355
-9
lines changed

15 files changed

+355
-9
lines changed

wizard-server/src/Wizard/Api/Handler/KnowledgeModelPackage/Api.hs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module Wizard.Api.Handler.KnowledgeModelPackage.Api where
33
import Servant
44
import Servant.Swagger.Tags
55

6+
import Wizard.Api.Handler.KnowledgeModelPackage.Dependent.Api
67
import Wizard.Api.Handler.KnowledgeModelPackage.Detail_Bundle_GET
78
import Wizard.Api.Handler.KnowledgeModelPackage.Detail_DELETE
89
import Wizard.Api.Handler.KnowledgeModelPackage.Detail_GET
@@ -17,7 +18,7 @@ import Wizard.Api.Handler.KnowledgeModelPackage.List_Suggestions_GET
1718
import Wizard.Model.Context.BaseContext
1819

1920
type KnowledgeModelPackageAPI =
20-
Tags "Package"
21+
Tags "Knowledge Model Package"
2122
:> ( List_GET
2223
:<|> List_Suggestions_GET
2324
:<|> List_POST
@@ -29,6 +30,7 @@ type KnowledgeModelPackageAPI =
2930
:<|> List_From_Migration_POST
3031
:<|> Detail_Bundle_GET
3132
:<|> Detail_Pull_POST
33+
:<|> DependentAPI
3234
)
3335

3436
knowledgeModelPackageApi :: Proxy KnowledgeModelPackageAPI
@@ -47,3 +49,4 @@ knowledgeModelPackageServer =
4749
:<|> list_from_migration_POST
4850
:<|> detail_bundle_GET
4951
:<|> detail_pull_POST
52+
:<|> dependentServer
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module Wizard.Api.Handler.KnowledgeModelPackage.Dependent.Api where
2+
3+
import Servant
4+
import Servant.Swagger.Tags
5+
6+
import Wizard.Api.Handler.KnowledgeModelPackage.Dependent.List_GET
7+
import Wizard.Model.Context.BaseContext
8+
9+
type DependentAPI =
10+
Tags "Knowledge Model Package Dependent"
11+
:> List_GET
12+
13+
dependentApi :: Proxy DependentAPI
14+
dependentApi = Proxy
15+
16+
dependentServer :: ServerT DependentAPI BaseContextM
17+
dependentServer =
18+
list_GET
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
module Wizard.Api.Handler.KnowledgeModelPackage.Dependent.List_GET where
2+
3+
import qualified Data.UUID as U
4+
import Servant
5+
6+
import Shared.Common.Api.Handler.Common
7+
import Shared.Common.Model.Context.TransactionState
8+
import Wizard.Api.Handler.Common
9+
import Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpactJM ()
10+
import Wizard.Model.Context.BaseContext
11+
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact
12+
import Wizard.Service.KnowledgeModel.Package.KnowledgeModelPackageService
13+
14+
type List_GET =
15+
Header "Authorization" String
16+
:> Header "Host" String
17+
:> "knowledge-model-packages"
18+
:> Capture "uuid" U.UUID
19+
:> "dependents"
20+
:> QueryParam "allVersions" Bool
21+
:> Get '[SafeJSON] (Headers '[Header "x-trace-uuid" String] [KnowledgeModelPackageDeletionImpact])
22+
23+
list_GET
24+
:: Maybe String
25+
-> Maybe String
26+
-> U.UUID
27+
-> Maybe Bool
28+
-> BaseContextM (Headers '[Header "x-trace-uuid" String] [KnowledgeModelPackageDeletionImpact])
29+
list_GET mTokenHeader mServerUrl uuid mAllVersions =
30+
getAuthServiceExecutor mTokenHeader mServerUrl $ \runInAuthService ->
31+
runInAuthService NoTransaction $
32+
addTraceUuidHeader
33+
=<< getDependentPackageResources uuid mAllVersions

wizard-server/src/Wizard/Api/Handler/KnowledgeModelPackage/Detail_DELETE.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ type Detail_DELETE =
1414
:> Header "Host" String
1515
:> "knowledge-model-packages"
1616
:> Capture "uuid" U.UUID
17+
:> QueryParam "allVersions" Bool
1718
:> Verb DELETE 204 '[SafeJSON] (Headers '[Header "x-trace-uuid" String] NoContent)
1819

19-
detail_DELETE :: Maybe String -> Maybe String -> U.UUID -> BaseContextM (Headers '[Header "x-trace-uuid" String] NoContent)
20-
detail_DELETE mTokenHeader mServerUrl pkgUuid =
20+
detail_DELETE :: Maybe String -> Maybe String -> U.UUID -> Maybe Bool -> BaseContextM (Headers '[Header "x-trace-uuid" String] NoContent)
21+
detail_DELETE mTokenHeader mServerUrl uuid mAllVersions =
2122
getAuthServiceExecutor mTokenHeader mServerUrl $ \runInAuthService ->
2223
runInAuthService Transactional $
2324
addTraceUuidHeader =<< do
24-
deletePackage pkgUuid
25+
deletePackage uuid mAllVersions
2526
return NoContent

wizard-server/src/Wizard/Api/Handler/Swagger/Api.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import Wizard.Api.Resource.KnowledgeModel.Migration.KnowledgeModelMigrationResol
6363
import Wizard.Api.Resource.KnowledgeModel.Migration.KnowledgeModelMigrationSM ()
6464
import Wizard.Api.Resource.KnowledgeModel.Migration.KnowledgeModelMigrationStateSM ()
6565
import Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageChangeSM ()
66+
import Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpactSM ()
6667
import Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageDetailSM ()
6768
import Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageSuggestionSM ()
6869
import Wizard.Api.Resource.KnowledgeModel.Package.Publish.KnowledgeModelPackagePublishEditorSM ()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpactJM where
2+
3+
import Data.Aeson
4+
5+
import Shared.Common.Util.Aeson
6+
import Wizard.Api.Resource.KnowledgeModel.Editor.KnowledgeModelEditorSuggestionJM ()
7+
import Wizard.Api.Resource.Project.ProjectSimpleJM ()
8+
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact
9+
10+
instance FromJSON KnowledgeModelPackageDeletionImpact where
11+
parseJSON = genericParseJSON jsonOptions
12+
13+
instance ToJSON KnowledgeModelPackageDeletionImpact where
14+
toJSON = genericToJSON jsonOptions
15+
16+
instance FromJSON KnowledgeModelPackageReference where
17+
parseJSON = genericParseJSON jsonOptions
18+
19+
instance ToJSON KnowledgeModelPackageReference where
20+
toJSON = genericToJSON jsonOptions
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpactSM where
2+
3+
import Data.Swagger
4+
5+
import Shared.Common.Util.Swagger
6+
import Wizard.Api.Resource.KnowledgeModel.Editor.KnowledgeModelEditorSuggestionSM ()
7+
import Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpactJM ()
8+
import Wizard.Api.Resource.Project.ProjectSimpleSM ()
9+
import Wizard.Database.Migration.Development.KnowledgeModel.Data.Package.KnowledgeModelPackageDependents
10+
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact
11+
12+
instance ToSchema KnowledgeModelPackageDeletionImpact where
13+
declareNamedSchema = toSwagger nlRegistryPackageDeletionImpact
14+
15+
instance ToSchema KnowledgeModelPackageReference where
16+
declareNamedSchema = toSwagger netherlandsKmPackageReference

wizard-server/src/Wizard/Database/DAO/KnowledgeModel/KnowledgeModelPackageDAO.hs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ import Shared.Common.Model.Common.PageMetadata
1313
import Shared.Common.Model.Common.Pageable
1414
import Shared.Common.Model.Common.Sort
1515
import Shared.Common.Util.Logger
16+
import Shared.Common.Util.String
1617
import Shared.Coordinate.Model.Coordinate.Coordinate
1718
import Shared.KnowledgeModel.Model.KnowledgeModel.Package.KnowledgeModelPackage
1819
import Wizard.Database.DAO.Common
20+
import Wizard.Database.Mapping.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact ()
1921
import Wizard.Database.Mapping.KnowledgeModel.Package.KnowledgeModelPackageList ()
2022
import Wizard.Database.Mapping.KnowledgeModel.Package.KnowledgeModelPackageSuggestion ()
2123
import Wizard.Model.Context.AppContext
2224
import Wizard.Model.Context.ContextLenses ()
25+
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact
2326
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageList
2427
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageSuggestion
2528

@@ -151,6 +154,68 @@ countPackageSuggestions mQuery selectCondition excludeCondition selectParams exc
151154
[count] -> return . fromOnly $ count
152155
_ -> return 0
153156

157+
findDependentPackageResources :: U.UUID -> AppContextM KnowledgeModelPackageDeletionImpact
158+
findDependentPackageResources pkgUuid = do
159+
tenantUuid <- asks currentTenantUuid
160+
let sql =
161+
fromString $
162+
f''
163+
"WITH RECURSIVE package_tree AS ( \
164+
\ SELECT \
165+
\ uuid, \
166+
\ name, \
167+
\ version, \
168+
\ previous_package_uuid, \
169+
\ tenant_uuid \
170+
\ FROM knowledge_model_package \
171+
\ WHERE uuid = ? \
172+
\ AND tenant_uuid = '${tenantUuid}' \
173+
\ \
174+
\ UNION ALL \
175+
\ \
176+
\ SELECT \
177+
\ p.uuid, \
178+
\ p.name, \
179+
\ p.version, \
180+
\ p.previous_package_uuid, \
181+
\ p.tenant_uuid \
182+
\ FROM knowledge_model_package p \
183+
\ INNER JOIN package_tree pt ON p.previous_package_uuid = pt.uuid \
184+
\ WHERE p.tenant_uuid = '${tenantUuid}' \
185+
\) \
186+
\SELECT \
187+
\ root.uuid, \
188+
\ root.name, \
189+
\ root.version, \
190+
\ (SELECT COALESCE(jsonb_agg(jsonb_build_object( \
191+
\ 'uuid', pt.uuid, \
192+
\ 'name', pt.name, \
193+
\ 'version', pt.version \
194+
\ )), '[]'::jsonb) \
195+
\ FROM package_tree pt \
196+
\ WHERE pt.uuid != ?) AS packages, \
197+
\ (SELECT COALESCE(jsonb_agg(jsonb_build_object( \
198+
\ 'uuid', e.uuid, \
199+
\ 'name', e.name \
200+
\ )), '[]'::jsonb) \
201+
\ FROM knowledge_model_editor e \
202+
\ WHERE e.previous_package_uuid IN (SELECT uuid FROM package_tree) \
203+
\ AND e.tenant_uuid = '${tenantUuid}') AS editors, \
204+
\ (SELECT COALESCE(jsonb_agg(jsonb_build_object( \
205+
\ 'uuid', pr.uuid, \
206+
\ 'name', pr.name \
207+
\ )), '[]'::jsonb) \
208+
\ FROM project pr \
209+
\ WHERE pr.knowledge_model_package_uuid IN (SELECT uuid FROM package_tree) \
210+
\ AND pr.tenant_uuid = '${tenantUuid}') AS projects \
211+
\FROM package_tree root \
212+
\WHERE root.uuid = ?;"
213+
[("tenantUuid", U.toString tenantUuid)]
214+
let params = [toField pkgUuid, toField pkgUuid, toField pkgUuid]
215+
logQuery sql params
216+
let action conn = query conn sql params
217+
runOneEntityDB entityName action [("uuid", U.toString pkgUuid)]
218+
154219
updatePackageMetamodelVersion :: U.UUID -> Int -> AppContextM Int64
155220
updatePackageMetamodelVersion pkgUuid metamodelVersion = do
156221
tenantUuid <- asks currentTenantUuid
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module Wizard.Database.Mapping.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact where
2+
3+
import Database.PostgreSQL.Simple
4+
import Database.PostgreSQL.Simple.FromField
5+
import Database.PostgreSQL.Simple.FromRow
6+
7+
import Wizard.Api.Resource.KnowledgeModel.Editor.KnowledgeModelEditorSuggestionJM ()
8+
import Wizard.Api.Resource.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpactJM ()
9+
import Wizard.Api.Resource.Project.ProjectSimpleJM ()
10+
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact
11+
12+
instance FromRow KnowledgeModelPackageDeletionImpact where
13+
fromRow = do
14+
uuid <- field
15+
name <- field
16+
version <- field
17+
packages <- fieldWith fromJSONField
18+
editors <- fieldWith fromJSONField
19+
projects <- fieldWith fromJSONField
20+
return $ KnowledgeModelPackageDeletionImpact {..}
21+
22+
instance FromRow KnowledgeModelPackageReference
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module Wizard.Database.Migration.Development.KnowledgeModel.Data.Package.KnowledgeModelPackageDependents where
2+
3+
import Shared.KnowledgeModel.Database.Migration.Development.KnowledgeModel.Data.Package.KnowledgeModelPackages
4+
import Shared.KnowledgeModel.Model.KnowledgeModel.Package.KnowledgeModelPackage
5+
import Wizard.Database.Migration.Development.KnowledgeModel.Data.Editor.KnowledgeModelEditors
6+
import Wizard.Database.Migration.Development.Project.Data.Projects
7+
import Wizard.Model.KnowledgeModel.Package.KnowledgeModelPackageDeletionImpact
8+
import Wizard.Service.Project.ProjectMapper
9+
10+
nlRegistryPackageDeletionImpact :: KnowledgeModelPackageDeletionImpact
11+
nlRegistryPackageDeletionImpact =
12+
KnowledgeModelPackageDeletionImpact
13+
{ uuid = netherlandsKmPackage.uuid
14+
, name = netherlandsKmPackage.name
15+
, version = netherlandsKmPackage.version
16+
, packages = [netherlandsKmPackageReference]
17+
, editors = [amsterdamKnowledgeModelEditorSuggestion]
18+
, projects = [toSimple project4]
19+
}
20+
21+
netherlandsKmPackageReference :: KnowledgeModelPackageReference
22+
netherlandsKmPackageReference =
23+
KnowledgeModelPackageReference
24+
{ uuid = netherlandsKmPackageV2.uuid
25+
, name = netherlandsKmPackageV2.name
26+
, version = netherlandsKmPackageV2.version
27+
}

0 commit comments

Comments
 (0)