Skip to content

Commit 62112dd

Browse files
committed
delete package
1 parent 68a5a68 commit 62112dd

File tree

4 files changed

+119
-16
lines changed

4 files changed

+119
-16
lines changed

src/cls/ZPM/DeletedPackage.cls

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Class ZPM.DeletedPackage Extends %Persistent
2+
{
3+
4+
Property name As %String(MAXLEN = 50) [ Required ];
5+
6+
Property version As %String [ Required ];
7+
8+
Index NameVersion On (name, version) [ IdKey, Unique ];
9+
10+
Storage Default
11+
{
12+
<Data name="DeletedPackageDefaultData">
13+
<Value name="1">
14+
<Value>%%CLASSNAME</Value>
15+
</Value>
16+
</Data>
17+
<DataLocation>^ZPM.DeletedPackageD</DataLocation>
18+
<DefaultData>DeletedPackageDefaultData</DefaultData>
19+
<IdLocation>^ZPM.DeletedPackageD</IdLocation>
20+
<IndexLocation>^ZPM.DeletedPackageI</IndexLocation>
21+
<StreamLocation>^ZPM.DeletedPackageS</StreamLocation>
22+
<Type>%Storage.Persistent</Type>
23+
}
24+
25+
}

src/cls/ZPM/Owner.cls

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Class ZPM.Owner
2+
{
3+
4+
/// Check if user is not UnknownUser
5+
ClassMethod IsAuth() As %Status
6+
{
7+
If ($Username="UnknownUser") {
8+
Return $$$ERROR($$$GeneralError, "Authentification required")
9+
}
10+
Return $$$OK
11+
}
12+
13+
ClassMethod IsOwner(packageName As %String) As %Status
14+
{
15+
Set owner = ""
16+
&sql(SELECT TOP 1 owner INTO :owner FROM ZPM.Package WHERE name = :packageName ORDER BY publishTS)
17+
If ( (owner'="") && (owner '= $Username) ){
18+
Return $$$ERROR($$$GeneralError, "Invalid package owner")
19+
}
20+
Return $$$OK
21+
}
22+
23+
ClassMethod SaveOwner(packageName, packageVersion) As %Status
24+
{
25+
Set owner = $Username
26+
&sql(UPDATE ZPM.Package SET owner = :owner WHERE name = :packageName AND version = :packageVersion)
27+
Return $$$OK
28+
}
29+
30+
}

src/cls/ZPM/Package.cls

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Property version As %String [ Required ];
1313

1414
Index NameVersion On (name, version) [ IdKey, Unique ];
1515

16-
Property owner As %String;
16+
Property owner As %String(%JSONINCLUDE = "NONE");
1717

1818
Index Owner On owner;
1919

@@ -203,6 +203,28 @@ ClassMethod VersionFind(pkg As %String = "", version As %String = "") As %String
203203
}
204204
}
205205

206+
Trigger DeletePackage [ Event = DELETE, Foreach = row/object ]
207+
{
208+
// delete DeployedPackage
209+
New id,package,name,version
210+
Set id = {ID}
211+
Set package = ##class(Package).%OpenId(id)
212+
Set name = package.name
213+
Set version = package.version
214+
&sql(DELETE FROM ZPM.DeployedPackage WHERE name = :name AND version = :version)
215+
}
216+
217+
ClassMethod IsDeleted(name, version) As %Boolean
218+
{
219+
Set count = 0
220+
&sql(SELECT COUNT(1) INTO :count FROM DeletedPackage WHERE name = :name AND version = :version)
221+
If (count = 0) {
222+
Return 0
223+
} Else {
224+
Return 1
225+
}
226+
}
227+
206228
Method platformVersionsGet() As %ListOfDataTypes
207229
{
208230
Set tList = ##class(%ListOfDataTypes).%New()
@@ -227,12 +249,22 @@ Method platformVersionsGet() As %ListOfDataTypes
227249
Return tList
228250
}
229251

230-
ClassMethod DeleteExistingPackages(pkg, version) As %Status
252+
ClassMethod DeleteExistingPackages(pkg As %String, version As %String, markDeleted As %Boolean = 0) As %Status
231253
{
232254
// delete all "proxy" packages
233255
&sql(DELETE FROM ZPM.Package WHERE Name = :pkg AND UpLink IS NOT NULL)
234-
235-
Do ..NameVersionDelete(pkg, version)
256+
Set tSC = ..NameVersionDelete(pkg, version)
257+
Return:$$$ISERR(tSC) tSC
258+
259+
If (markDeleted) {
260+
Set count = 0
261+
&sql(SELECT COUNT(1) INTO :count FROM ZPM.Package WHERE Name = :pkg)
262+
If (count = 0) {
263+
&sql(DELETE FROM ZPM.DeletedPackage WHERE name = :pkg)
264+
} Else {
265+
&sql(INSERT INTO ZPM.DeletedPackage(name, version) VALUES (:pkg, :version))
266+
}
267+
}
236268
Return 1
237269
}
238270

src/cls/ZPM/Registry.cls

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -173,37 +173,52 @@ ClassMethod PackageInstaller(pkg As %String = "", version As %String = "") As %S
173173
/// Unpublish (delete) directly published package
174174
ClassMethod UnPublishPackage(pkg As %String = "", version As %String = "") As %Status
175175
{
176-
If ($Username="UnknownUser") {
177-
Return ..ReportHttpStatusCode(..#HTTP401UNAUTHORIZED)
176+
Set tSC = $$$OK
177+
Set tSC = ##class(ZPM.Owner).IsAuth()
178+
If ($$$ISERR(tSC)) {
179+
Return ..ReportHttpStatusCode(..#HTTP401UNAUTHORIZED, tSC)
178180
}
179-
Set sc = $$$OK
180181
Set pkg = $$$lcase(pkg)
181182
Set pPackage = ##class(ZPM.Package).NameVersionOpen(pkg, version)
182183
If ('$IsObject(pPackage)) {
183184
Return ..ReportHttpStatusCode(..#HTTP404NOTFOUND)
184185
}
186+
Set tSC = ##class(ZPM.Owner).IsOwner(pkg)
187+
If ($$$ISERR(tSC)) {
188+
Return ..ReportHttpStatusCode(..#HTTP403FORBIDDEN, tSC)
189+
}
185190
If (pPackage.UpLink'="") {
186191
// only directly published package could be deleted
187192
Return ..ReportHttpStatusCode(..#HTTP400BADREQUEST)
188193
}
189-
Return pPackage.%DeleteId(pPackage.%Id())
194+
Return ##class(ZPM.Package).DeleteExistingPackages(pkg, version, 1)
190195
}
191196

192197
ClassMethod PublishPackage() As %Status
193198
{
194-
try {
195-
If ($Username="UnknownUser") {
196-
Return ..ReportHttpStatusCode(..#HTTP401UNAUTHORIZED)
197-
}
198-
If (%request.ContentType '= ..#CONTENTTYPEJSON) {
199-
Return ..ReportHttpStatusCode(..#HTTP400BADREQUEST)
200-
}
201-
199+
Try {
200+
202201
Set name = %request.Content.%Get("name")
203202
Set version = %request.Content.%Get("version")
204203
Set deployed = %request.Content.%Get("deployed")
205204
Set platformVersion = %request.Content.%Get("platform_version")
206205

206+
Set tSC = ##class(ZPM.Owner).IsAuth()
207+
If ($$$ISERR(tSC)) {
208+
Return ..ReportHttpStatusCode(..#HTTP401UNAUTHORIZED, tSC)
209+
}
210+
Set tSC = ##class(ZPM.Owner).IsOwner(name)
211+
If ($$$ISERR(tSC)) {
212+
Return ..ReportHttpStatusCode(..#HTTP403FORBIDDEN, tSC)
213+
}
214+
If (##class(ZPM.Package).IsDeleted(name, version)) {
215+
Return ..ReportHttpStatusCode(..#HTTP403FORBIDDEN, $$$ERROR(5001,"This version was deleted, change version number"))
216+
}
217+
218+
If (%request.ContentType '= ..#CONTENTTYPEJSON) {
219+
Return ..ReportHttpStatusCode(..#HTTP400BADREQUEST)
220+
}
221+
207222
If ##class(ZPM.Package).NameVersionExists(name, version, .id) {
208223
Set package = ##class(ZPM.Package).%OpenId(id)
209224
}
@@ -230,6 +245,7 @@ ClassMethod PublishPackage() As %Status
230245
$$$ThrowOnError(package.packageFromBase64(%request.Content.%Get("package",,"stream")))
231246
}
232247
$$$ThrowOnError(package.%Save())
248+
Do ##class(ZPM.Owner).SaveOwner(package.name, package.version)
233249
Return ..Package(package.name, package.version)
234250
} catch ex {
235251
Do ex.Log()

0 commit comments

Comments
 (0)