Skip to content

Commit d155322

Browse files
committed
Add force delete KM
1 parent bb7b297 commit d155322

File tree

15 files changed

+366
-9
lines changed

15 files changed

+366
-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 netherlandsKmPackageDeletionImpact
14+
15+
instance ToSchema KnowledgeModelPackageReference where
16+
declareNamedSchema = toSwagger netherlandsKmPackageReference

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

Lines changed: 67 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

@@ -156,6 +159,70 @@ countPackageSuggestions mQuery selectCondition excludeCondition selectParams exc
156159
[count] -> return . fromOnly $ count
157160
_ -> return 0
158161

162+
findDependentPackageResources :: [U.UUID] -> AppContextM [KnowledgeModelPackageDeletionImpact]
163+
findDependentPackageResources pkgUuids = do
164+
tenantUuid <- asks currentTenantUuid
165+
let sql =
166+
f''
167+
"WITH RECURSIVE package_tree AS ( \
168+
\ SELECT \
169+
\ uuid, \
170+
\ name, \
171+
\ version, \
172+
\ previous_package_uuid, \
173+
\ tenant_uuid \
174+
\ FROM knowledge_model_package \
175+
\ WHERE uuid IN (${pkgUuids}) \
176+
\ AND tenant_uuid = '${tenantUuid}' \
177+
\ \
178+
\ UNION \
179+
\ \
180+
\ SELECT \
181+
\ p.uuid, \
182+
\ p.name, \
183+
\ p.version, \
184+
\ p.previous_package_uuid, \
185+
\ p.tenant_uuid \
186+
\ FROM knowledge_model_package p \
187+
\ INNER JOIN package_tree pt ON p.previous_package_uuid = pt.uuid \
188+
\ WHERE p.tenant_uuid = '${tenantUuid}' \
189+
\) \
190+
\SELECT \
191+
\ pt.uuid, \
192+
\ pt.name, \
193+
\ pt.version, \
194+
\ (SELECT COALESCE(jsonb_agg(jsonb_build_object( \
195+
\ 'uuid', child.uuid, \
196+
\ 'name', child.name, \
197+
\ 'version', child.version \
198+
\ )), '[]'::jsonb) \
199+
\ FROM knowledge_model_package child \
200+
\ WHERE child.previous_package_uuid = pt.uuid \
201+
\ AND child.tenant_uuid = pt.tenant_uuid) AS packages, \
202+
\ \
203+
\ (SELECT COALESCE(jsonb_agg(jsonb_build_object( \
204+
\ 'uuid', e.uuid, \
205+
\ 'name', e.name \
206+
\ )), '[]'::jsonb) \
207+
\ FROM knowledge_model_editor e \
208+
\ WHERE e.previous_package_uuid = pt.uuid \
209+
\ AND e.tenant_uuid = pt.tenant_uuid) AS editors, \
210+
\ \
211+
\ (SELECT COALESCE(jsonb_agg(jsonb_build_object( \
212+
\ 'uuid', pr.uuid, \
213+
\ 'name', pr.name \
214+
\ )), '[]'::jsonb) \
215+
\ FROM project pr \
216+
\ WHERE pr.knowledge_model_package_uuid = pt.uuid \
217+
\ AND pr.tenant_uuid = pt.tenant_uuid) AS projects \
218+
\FROM package_tree pt;"
219+
[ ("pkgUuids", L.intercalate "," . fmap (\u -> f' "'%s'" [U.toString u]) $ pkgUuids)
220+
, ("tenantUuid", U.toString tenantUuid)
221+
]
222+
logInfoI _CMP_DATABASE (trim sql)
223+
let action conn = query_ conn (fromString sql)
224+
runDB action
225+
159226
updatePackageMetamodelVersion :: U.UUID -> Int -> AppContextM Int64
160227
updatePackageMetamodelVersion pkgUuid metamodelVersion = do
161228
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: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
netherlandsKmPackageDeletionImpact :: KnowledgeModelPackageDeletionImpact
11+
netherlandsKmPackageDeletionImpact =
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+
}
28+
29+
netherlandsKmPackageV2DeletionImpact :: KnowledgeModelPackageDeletionImpact
30+
netherlandsKmPackageV2DeletionImpact =
31+
KnowledgeModelPackageDeletionImpact
32+
{ uuid = netherlandsKmPackageV2.uuid
33+
, name = netherlandsKmPackageV2.name
34+
, version = netherlandsKmPackageV2.version
35+
, packages = []
36+
, editors = []
37+
, projects = []
38+
}

0 commit comments

Comments
 (0)