Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
apollo
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
apollo
Commits
e25fe0ce
Commit
e25fe0ce
authored
Jul 05, 2018
by
jian.tan
Committed by
nobodyiam
Jul 22, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:添加Apollo-Portal项目删除接口.
parent
6860f0a2
Changes
39
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
39 changed files
with
938 additions
and
553 deletions
+938
-553
apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/AppController.java
...amework/apollo/adminservice/controller/AppController.java
+17
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/AppNamespaceRepository.java
...amework/apollo/biz/repository/AppNamespaceRepository.java
+7
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/AppRepository.java
.../ctrip/framework/apollo/biz/repository/AppRepository.java
+6
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ClusterRepository.java
...ip/framework/apollo/biz/repository/ClusterRepository.java
+8
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/CommitRepository.java
...rip/framework/apollo/biz/repository/CommitRepository.java
+5
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/GrayReleaseRuleRepository.java
...work/apollo/biz/repository/GrayReleaseRuleRepository.java
+7
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/NamespaceRepository.java
.../framework/apollo/biz/repository/NamespaceRepository.java
+5
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseHistoryRepository.java
...ework/apollo/biz/repository/ReleaseHistoryRepository.java
+5
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java
...ip/framework/apollo/biz/repository/ReleaseRepository.java
+6
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/AdminService.java
.../com/ctrip/framework/apollo/biz/service/AdminService.java
+63
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/AppNamespaceService.java
...rip/framework/apollo/biz/service/AppNamespaceService.java
+7
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/AppService.java
...va/com/ctrip/framework/apollo/biz/service/AppService.java
+7
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ClusterService.java
...om/ctrip/framework/apollo/biz/service/ClusterService.java
+10
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/CommitService.java
...com/ctrip/framework/apollo/biz/service/CommitService.java
+6
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/GrayReleaseRuleService.java
.../framework/apollo/biz/service/GrayReleaseRuleService.java
+20
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/NamespaceService.java
.../ctrip/framework/apollo/biz/service/NamespaceService.java
+14
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ReleaseHistoryService.java
...p/framework/apollo/biz/service/ReleaseHistoryService.java
+7
-0
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ReleaseService.java
...om/ctrip/framework/apollo/biz/service/ReleaseService.java
+6
-0
apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/repository/AppNamespaceRepositoryTest.java
...ork/apollo/biz/repository/AppNamespaceRepositoryTest.java
+7
-0
apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/repository/AppRepositoryTest.java
...ip/framework/apollo/biz/repository/AppRepositoryTest.java
+25
-0
apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/AdminServiceTest.java
.../ctrip/framework/apollo/biz/service/AdminServiceTest.java
+97
-63
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java
...om/ctrip/framework/apollo/portal/api/AdminServiceAPI.java
+394
-408
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/AppController.java
...rip/framework/apollo/portal/controller/AppController.java
+35
-23
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppDeletionEvent.java
...ip/framework/apollo/portal/listener/AppDeletionEvent.java
+18
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppInfoChangedListener.java
...mework/apollo/portal/listener/AppInfoChangedListener.java
+19
-2
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/AppNamespaceRepository.java
...work/apollo/portal/repository/AppNamespaceRepository.java
+8
-3
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/AppRepository.java
...rip/framework/apollo/portal/repository/AppRepository.java
+5
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/FavoriteRepository.java
...ramework/apollo/portal/repository/FavoriteRepository.java
+8
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/PermissionRepository.java
...mework/apollo/portal/repository/PermissionRepository.java
+11
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/RoleRepository.java
...ip/framework/apollo/portal/repository/RoleRepository.java
+10
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppNamespaceService.java
.../framework/apollo/portal/service/AppNamespaceService.java
+5
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java
...com/ctrip/framework/apollo/portal/service/AppService.java
+23
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/FavoriteService.java
...trip/framework/apollo/portal/service/FavoriteService.java
+9
-6
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/RolePermissionService.java
...ramework/apollo/portal/service/RolePermissionService.java
+4
-0
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/defaultimpl/DefaultRolePermissionService.java
.../portal/spi/defaultimpl/DefaultRolePermissionService.java
+6
-0
scripts/docker-quick-start/sql/apolloconfigdb.sql
scripts/docker-quick-start/sql/apolloconfigdb.sql
+11
-11
scripts/docker-quick-start/sql/apolloportaldb.sql
scripts/docker-quick-start/sql/apolloportaldb.sql
+25
-25
scripts/sql/apolloconfigdb.sql
scripts/sql/apolloconfigdb.sql
+5
-5
scripts/sql/apolloportaldb.sql
scripts/sql/apolloportaldb.sql
+7
-7
No files found.
apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/AppController.java
View file @
e25fe0ce
...
...
@@ -6,6 +6,7 @@ import com.ctrip.framework.apollo.common.dto.AppDTO;
import
com.ctrip.framework.apollo.common.entity.App
;
import
com.ctrip.framework.apollo.common.exception.BadRequestException
;
import
com.ctrip.framework.apollo.common.exception.NotFoundException
;
import
com.ctrip.framework.apollo.common.exception.ServiceException
;
import
com.ctrip.framework.apollo.common.utils.BeanUtils
;
import
com.ctrip.framework.apollo.common.utils.InputValidator
;
import
com.ctrip.framework.apollo.core.utils.StringUtils
;
...
...
@@ -92,4 +93,20 @@ public class AppController {
return
appService
.
isAppIdUnique
(
appId
);
}
@RequestMapping
(
value
=
"/apps"
,
method
=
RequestMethod
.
DELETE
)
public
void
deleteApp
(
@RequestParam
(
"appId"
)
String
appId
,
@RequestParam
(
"operator"
)
String
operator
)
{
App
app
=
appService
.
findOne
(
appId
);
if
(
Objects
.
isNull
(
app
))
{
throw
new
NotFoundException
(
"app not found for appId "
+
appId
);
}
try
{
adminService
.
deleteApp
(
appId
,
operator
);
}
catch
(
Exception
e
)
{
String
exc
=
String
.
format
(
"user:%s deleting app:%s,failure:%s"
,
operator
,
app
,
e
.
getMessage
());
throw
new
ServiceException
(
exc
);
}
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/AppNamespaceRepository.java
View file @
e25fe0ce
...
...
@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.biz.repository;
import
com.ctrip.framework.apollo.common.entity.AppNamespace
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
java.util.List
;
...
...
@@ -24,4 +26,9 @@ public interface AppNamespaceRepository extends PagingAndSortingRepository<AppNa
List
<
AppNamespace
>
findFirst500ByIdGreaterThanOrderByIdAsc
(
long
id
);
@Modifying
@Query
(
"UPDATE AppNamespace SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/AppRepository.java
View file @
e25fe0ce
...
...
@@ -2,6 +2,7 @@ package com.ctrip.framework.apollo.biz.repository;
import
com.ctrip.framework.apollo.common.entity.App
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
org.springframework.data.repository.query.Param
;
...
...
@@ -15,4 +16,9 @@ public interface AppRepository extends PagingAndSortingRepository<App, Long> {
App
findByAppId
(
String
appId
);
@Modifying
@Query
(
"UPDATE App SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
deleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ClusterRepository.java
View file @
e25fe0ce
...
...
@@ -3,6 +3,8 @@ package com.ctrip.framework.apollo.biz.repository;
import
com.ctrip.framework.apollo.biz.entity.Cluster
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
java.util.List
;
...
...
@@ -16,4 +18,10 @@ public interface ClusterRepository extends PagingAndSortingRepository<Cluster, L
Cluster
findByAppIdAndName
(
String
appId
,
String
name
);
List
<
Cluster
>
findByParentClusterId
(
Long
parentClusterId
);
@Modifying
@Query
(
"UPDATE Cluster SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/CommitRepository.java
View file @
e25fe0ce
...
...
@@ -18,4 +18,9 @@ public interface CommitRepository extends PagingAndSortingRepository<Commit, Lon
@Query
(
"update Commit set isdeleted=1,DataChange_LastModifiedBy = ?4 where appId=?1 and clusterName=?2 and namespaceName = ?3"
)
int
batchDelete
(
String
appId
,
String
clusterName
,
String
namespaceName
,
String
operator
);
@Modifying
@Query
(
"UPDATE Commit SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/GrayReleaseRuleRepository.java
View file @
e25fe0ce
...
...
@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.biz.repository;
import
com.ctrip.framework.apollo.biz.entity.GrayReleaseRule
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
java.util.List
;
...
...
@@ -17,4 +19,9 @@ public interface GrayReleaseRuleRepository extends PagingAndSortingRepository<Gr
List
<
GrayReleaseRule
>
findFirst500ByIdGreaterThanOrderByIdAsc
(
Long
id
);
@Modifying
@Query
(
"UPDATE GrayReleaseRule SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/NamespaceRepository.java
View file @
e25fe0ce
...
...
@@ -25,4 +25,9 @@ public interface NamespaceRepository extends PagingAndSortingRepository<Namespac
int
countByNamespaceNameAndAppIdNot
(
String
namespaceName
,
String
appId
);
@Modifying
@Query
(
"UPDATE Namespace SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseHistoryRepository.java
View file @
e25fe0ce
...
...
@@ -23,4 +23,9 @@ public interface ReleaseHistoryRepository extends PagingAndSortingRepository<Rel
@Query
(
"update ReleaseHistory set isdeleted=1,DataChange_LastModifiedBy = ?4 where appId=?1 and clusterName=?2 and namespaceName = ?3"
)
int
batchDelete
(
String
appId
,
String
clusterName
,
String
namespaceName
,
String
operator
);
@Modifying
@Query
(
"UPDATE ReleaseHistory SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java
View file @
e25fe0ce
...
...
@@ -35,4 +35,10 @@ public interface ReleaseRepository extends PagingAndSortingRepository<Release, L
// For release history conversion program, need to delete after conversion it done
List
<
Release
>
findByAppIdAndClusterNameAndNamespaceNameOrderByIdAsc
(
String
appId
,
String
clusterName
,
String
namespaceName
);
@Modifying
@Query
(
"UPDATE Release SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
oldAppId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/AdminService.java
View file @
e25fe0ce
package
com
.
ctrip
.
framework
.
apollo
.
biz
.
service
;
import
com.ctrip.framework.apollo.biz.entity.Cluster
;
import
com.ctrip.framework.apollo.biz.entity.Namespace
;
import
com.ctrip.framework.apollo.common.entity.App
;
import
com.ctrip.framework.apollo.core.ConfigConsts
;
import
com.google.common.collect.Sets
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Set
;
@Service
public
class
AdminService
{
...
...
@@ -18,6 +27,18 @@ public class AdminService {
private
ClusterService
clusterService
;
@Autowired
private
NamespaceService
namespaceService
;
@Autowired
private
ReleaseHistoryService
releaseHistoryService
;
@Autowired
private
ReleaseService
releaseService
;
@Autowired
private
GrayReleaseRuleService
grayReleaseRuleService
;
@Autowired
private
CommitService
commitService
;
@Autowired
private
ItemService
itemService
;
final
static
Logger
logger
=
LoggerFactory
.
getLogger
(
AdminService
.
class
);
@Transactional
public
App
createNewApp
(
App
app
)
{
...
...
@@ -35,5 +56,47 @@ public class AdminService {
return
app
;
}
@Transactional
public
void
deleteApp
(
String
appId
,
String
operator
)
{
logger
.
info
(
"{} is deleting App:{}"
,
operator
,
appId
);
List
<
Cluster
>
managedClusters
=
clusterService
.
findClusters
(
appId
);
Set
<
Namespace
>
managedNamespaces
=
Sets
.
newLinkedHashSet
();
if
(
Objects
.
nonNull
(
managedClusters
))
{
for
(
Cluster
cluster
:
managedClusters
)
{
managedNamespaces
.
addAll
(
namespaceService
.
findNamespaces
(
appId
,
cluster
.
getName
()));
}
}
//1.delete release history.
releaseHistoryService
.
batchDeleteByDeleteApp
(
appId
,
operator
);
//2.delete release.
releaseService
.
deleteApp
(
appId
,
operator
);
//3.delete config items.
for
(
Namespace
namespace
:
managedNamespaces
)
{
itemService
.
batchDelete
(
namespace
.
getId
(),
operator
);
}
//4.delete Namespaces
namespaceService
.
deleteApp
(
managedNamespaces
,
operator
);
//5.delete GrayReleaseRule
grayReleaseRuleService
.
deleteApp
(
appId
,
operator
);
//6.delete history.
commitService
.
deleteApp
(
appId
,
operator
);
//7.delete cluster
clusterService
.
deleteApp
(
appId
,
operator
);
//8.delete appNamespace
appNamespaceService
.
deleteApp
(
appId
,
operator
);
//9.delete app
appService
.
deleteApp
(
appId
,
operator
);
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/AppNamespaceService.java
View file @
e25fe0ce
...
...
@@ -137,4 +137,11 @@ public class AppNamespaceService {
namespaceService
.
save
(
namespace
);
}
}
@Transactional
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
appNamespaceRepository
.
countByAppId
(
appId
)
>
0
)
{
appNamespaceRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/AppService.java
View file @
e25fe0ce
...
...
@@ -92,4 +92,11 @@ public class AppService {
managedApp
.
getDataChangeLastModifiedBy
());
}
@Transactional
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
appRepository
.
countByAppId
(
appId
)
>
0
)
{
appRepository
.
deleteApp
(
appId
,
operator
);
}
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ClusterService.java
View file @
e25fe0ce
...
...
@@ -137,4 +137,14 @@ public class ClusterService {
return
clusterRepository
.
findByParentClusterId
(
parentCluster
.
getId
());
}
@Transactional
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
clusterRepository
.
countByAppId
(
appId
)
>
0
)
{
clusterRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
public
List
<
Cluster
>
findClusters
(
String
appId
)
{
return
clusterRepository
.
findByAppId
(
appId
);
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/CommitService.java
View file @
e25fe0ce
...
...
@@ -31,4 +31,10 @@ public class CommitService {
return
commitRepository
.
batchDelete
(
appId
,
clusterName
,
namespaceName
,
operator
);
}
@Transactional
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
commitRepository
.
countByAppId
(
appId
)
>
0
)
{
commitRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/GrayReleaseRuleService.java
0 → 100644
View file @
e25fe0ce
package
com
.
ctrip
.
framework
.
apollo
.
biz
.
service
;
import
com.ctrip.framework.apollo.biz.repository.GrayReleaseRuleRepository
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
@Service
public
class
GrayReleaseRuleService
{
@Autowired
private
GrayReleaseRuleRepository
grayReleaseRuleRepository
;
@Transactional
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
grayReleaseRuleRepository
.
countByAppId
(
appId
)
>
0
)
{
grayReleaseRuleRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/NamespaceService.java
View file @
e25fe0ce
...
...
@@ -395,5 +395,19 @@ public class NamespaceService {
return
false
;
}
@Transactional
public
void
deleteApp
(
Set
<
Namespace
>
namespaces
,
String
operator
)
{
if
(
Objects
.
nonNull
(
namespaces
))
{
String
appId
=
namespaces
.
iterator
().
next
().
getAppId
();
namespaceRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
//Publish release message
for
(
Namespace
namespace
:
namespaces
)
{
messageSender
.
sendMessage
(
ReleaseMessageKeyGenerator
.
generate
(
appId
,
namespace
.
getClusterName
(),
namespace
.
getNamespaceName
()),
Topics
.
APOLLO_RELEASE_TOPIC
);
}
}
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ReleaseHistoryService.java
View file @
e25fe0ce
...
...
@@ -76,4 +76,11 @@ public class ReleaseHistoryService {
public
int
batchDelete
(
String
appId
,
String
clusterName
,
String
namespaceName
,
String
operator
)
{
return
releaseHistoryRepository
.
batchDelete
(
appId
,
clusterName
,
namespaceName
,
operator
);
}
@Transactional
public
void
batchDeleteByDeleteApp
(
String
appId
,
String
operator
)
{
if
(
releaseHistoryRepository
.
countByAppId
(
appId
)
>
0
)
{
releaseHistoryRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
}
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ReleaseService.java
View file @
e25fe0ce
...
...
@@ -467,4 +467,10 @@ public class ReleaseService {
return
releaseRepository
.
batchDelete
(
appId
,
clusterName
,
namespaceName
,
operator
);
}
@Transactional
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
releaseRepository
.
countByAppId
(
appId
)
>
0
)
{
releaseRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
}
apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/repository/AppNamespaceRepositoryTest.java
View file @
e25fe0ce
...
...
@@ -27,4 +27,11 @@ public class AppNamespaceRepositoryTest extends AbstractIntegrationTest{
assertNull
(
appNamespace
);
}
@Test
public
void
testDeleteAppNamespaceWhenDeleteApp
()
throws
Exception
{
String
appId
=
"100003171"
;
int
count
=
repository
.
countByAppId
(
appId
);
assertEquals
(
count
,
repository
.
batchDeleteByDeleteApp
(
appId
,
null
));
}
}
apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/repository/AppRepositoryTest.java
View file @
e25fe0ce
...
...
@@ -56,4 +56,29 @@ public class AppRepositoryTest extends AbstractIntegrationTest{
Assert
.
assertEquals
(
0
,
appRepository
.
count
());
}
@Test
public
void
testDelete
()
{
String
appId
=
"someAppId"
;
String
appName
=
"someAppName"
;
String
ownerName
=
"someOwnerName"
;
String
ownerEmail
=
"someOwnerName@ctrip.com"
;
String
operator
=
"someOwnerName"
;
App
app
=
new
App
();
app
.
setAppId
(
appId
);
app
.
setName
(
appName
);
app
.
setOwnerName
(
ownerName
);
app
.
setOwnerEmail
(
ownerEmail
);
Assert
.
assertEquals
(
0
,
appRepository
.
count
());
appRepository
.
save
(
app
);
Assert
.
assertEquals
(
1
,
appRepository
.
count
());
Assert
.
assertEquals
(
1
,
appRepository
.
deleteApp
(
app
.
getAppId
(),
operator
));
Assert
.
assertEquals
(
0
,
appRepository
.
count
());
}
}
apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/AdminServiceTest.java
View file @
e25fe0ce
...
...
@@ -8,7 +8,6 @@ import com.ctrip.framework.apollo.biz.repository.AppRepository;
import
com.ctrip.framework.apollo.common.entity.App
;
import
com.ctrip.framework.apollo.common.exception.ServiceException
;
import
com.ctrip.framework.apollo.core.ConfigConsts
;
import
org.junit.Assert
;
import
org.junit.Test
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -16,67 +15,102 @@ import org.springframework.beans.factory.annotation.Autowired;
import
java.util.Date
;
import
java.util.List
;
public
class
AdminServiceTest
extends
AbstractIntegrationTest
{
@Autowired
private
AdminService
adminService
;
@Autowired
private
AuditService
auditService
;
@Autowired
private
AppRepository
appRepository
;
@Autowired
private
ClusterService
clusterService
;
@Autowired
private
NamespaceService
namespaceService
;
@Test
public
void
testCreateNewApp
()
{
String
appId
=
"someAppId"
;
App
app
=
new
App
();
app
.
setAppId
(
appId
);
app
.
setName
(
"someAppName"
);
String
owner
=
"someOwnerName"
;
app
.
setOwnerName
(
owner
);
app
.
setOwnerEmail
(
"someOwnerName@ctrip.com"
);
app
.
setDataChangeCreatedBy
(
owner
);
app
.
setDataChangeLastModifiedBy
(
owner
);
app
.
setDataChangeCreatedTime
(
new
Date
());
app
=
adminService
.
createNewApp
(
app
);
Assert
.
assertEquals
(
appId
,
app
.
getAppId
());
List
<
Cluster
>
clusters
=
clusterService
.
findParentClusters
(
app
.
getAppId
());
Assert
.
assertEquals
(
1
,
clusters
.
size
());
Assert
.
assertEquals
(
ConfigConsts
.
CLUSTER_NAME_DEFAULT
,
clusters
.
get
(
0
).
getName
());
List
<
Namespace
>
namespaces
=
namespaceService
.
findNamespaces
(
appId
,
clusters
.
get
(
0
).
getName
());
Assert
.
assertEquals
(
1
,
namespaces
.
size
());
Assert
.
assertEquals
(
ConfigConsts
.
NAMESPACE_APPLICATION
,
namespaces
.
get
(
0
).
getNamespaceName
());
List
<
Audit
>
audits
=
auditService
.
findByOwner
(
owner
);
Assert
.
assertEquals
(
4
,
audits
.
size
());
}
@Test
(
expected
=
ServiceException
.
class
)
public
void
testCreateDuplicateApp
()
{
String
appId
=
"someAppId"
;
App
app
=
new
App
();
app
.
setAppId
(
appId
);
app
.
setName
(
"someAppName"
);
String
owner
=
"someOwnerName"
;
app
.
setOwnerName
(
owner
);
app
.
setOwnerEmail
(
"someOwnerName@ctrip.com"
);
app
.
setDataChangeCreatedBy
(
owner
);
app
.
setDataChangeLastModifiedBy
(
owner
);
app
.
setDataChangeCreatedTime
(
new
Date
());
appRepository
.
save
(
app
);
adminService
.
createNewApp
(
app
);
}
public
class
AdminServiceTest
extends
AbstractIntegrationTest
{
@Autowired
private
AdminService
adminService
;
@Autowired
private
AuditService
auditService
;
@Autowired
private
AppRepository
appRepository
;
@Autowired
private
ClusterService
clusterService
;
@Autowired
private
NamespaceService
namespaceService
;
@Autowired
private
AppNamespaceService
appNamespaceService
;
@Test
public
void
testCreateNewApp
()
{
String
appId
=
"someAppId"
;
App
app
=
new
App
();
app
.
setAppId
(
appId
);
app
.
setName
(
"someAppName"
);
String
owner
=
"someOwnerName"
;
app
.
setOwnerName
(
owner
);
app
.
setOwnerEmail
(
"someOwnerName@ctrip.com"
);
app
.
setDataChangeCreatedBy
(
owner
);
app
.
setDataChangeLastModifiedBy
(
owner
);
app
.
setDataChangeCreatedTime
(
new
Date
());
app
=
adminService
.
createNewApp
(
app
);
Assert
.
assertEquals
(
appId
,
app
.
getAppId
());
List
<
Cluster
>
clusters
=
clusterService
.
findParentClusters
(
app
.
getAppId
());
Assert
.
assertEquals
(
1
,
clusters
.
size
());
Assert
.
assertEquals
(
ConfigConsts
.
CLUSTER_NAME_DEFAULT
,
clusters
.
get
(
0
).
getName
());
List
<
Namespace
>
namespaces
=
namespaceService
.
findNamespaces
(
appId
,
clusters
.
get
(
0
).
getName
());
Assert
.
assertEquals
(
1
,
namespaces
.
size
());
Assert
.
assertEquals
(
ConfigConsts
.
NAMESPACE_APPLICATION
,
namespaces
.
get
(
0
).
getNamespaceName
());
List
<
Audit
>
audits
=
auditService
.
findByOwner
(
owner
);
Assert
.
assertEquals
(
4
,
audits
.
size
());
}
@Test
(
expected
=
ServiceException
.
class
)
public
void
testCreateDuplicateApp
()
{
String
appId
=
"someAppId"
;
App
app
=
new
App
();
app
.
setAppId
(
appId
);
app
.
setName
(
"someAppName"
);
String
owner
=
"someOwnerName"
;
app
.
setOwnerName
(
owner
);
app
.
setOwnerEmail
(
"someOwnerName@ctrip.com"
);
app
.
setDataChangeCreatedBy
(
owner
);
app
.
setDataChangeLastModifiedBy
(
owner
);
app
.
setDataChangeCreatedTime
(
new
Date
());
appRepository
.
save
(
app
);
adminService
.
createNewApp
(
app
);
}
@Test
public
void
testDeleteApp
()
{
String
appId
=
"someAppId"
;
App
app
=
new
App
();
app
.
setAppId
(
appId
);
app
.
setName
(
"someAppName"
);
String
owner
=
"someOwnerName"
;
app
.
setOwnerName
(
owner
);
app
.
setOwnerEmail
(
"someOwnerName@ctrip.com"
);
app
.
setDataChangeCreatedBy
(
owner
);
app
.
setDataChangeLastModifiedBy
(
owner
);
app
.
setDataChangeCreatedTime
(
new
Date
());
app
=
adminService
.
createNewApp
(
app
);
Assert
.
assertEquals
(
appId
,
app
.
getAppId
());
Assert
.
assertEquals
(
1
,
appNamespaceService
.
findByAppId
(
appId
).
size
());
Assert
.
assertEquals
(
1
,
clusterService
.
findClusters
(
appId
).
size
());
Assert
.
assertEquals
(
1
,
namespaceService
.
findNamespaces
(
appId
,
ConfigConsts
.
CLUSTER_NAME_DEFAULT
).
size
());
adminService
.
deleteApp
(
appId
,
owner
);
Assert
.
assertEquals
(
0
,
appNamespaceService
.
findByAppId
(
appId
).
size
());
Assert
.
assertEquals
(
0
,
clusterService
.
findClusters
(
appId
).
size
());
Assert
.
assertEquals
(
0
,
namespaceService
.
findByAppIdAndNamespaceName
(
appId
,
ConfigConsts
.
CLUSTER_NAME_DEFAULT
).
size
());
}
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java
View file @
e25fe0ce
This diff is collapsed.
Click to expand it.
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/AppController.java
View file @
e25fe0ce
package
com
.
ctrip
.
framework
.
apollo
.
portal
.
controller
;
import
com.google.common.collect.Sets
;
import
com.ctrip.framework.apollo.common.entity.App
;
import
com.ctrip.framework.apollo.common.exception.BadRequestException
;
import
com.ctrip.framework.apollo.common.http.MultiResponseEntity
;
...
...
@@ -14,12 +12,16 @@ import com.ctrip.framework.apollo.portal.component.PortalSettings;
import
com.ctrip.framework.apollo.portal.entity.model.AppModel
;
import
com.ctrip.framework.apollo.portal.entity.vo.EnvClusterInfo
;
import
com.ctrip.framework.apollo.portal.listener.AppCreationEvent
;
import
com.ctrip.framework.apollo.portal.listener.AppDeletionEvent
;
import
com.ctrip.framework.apollo.portal.listener.AppInfoChangedEvent
;
import
com.ctrip.framework.apollo.portal.service.AppService
;
import
com.ctrip.framework.apollo.portal.service.RolePermissionService
;
import
com.ctrip.framework.apollo.portal.spi.UserInfoHolder
;
import
com.ctrip.framework.apollo.portal.util.RoleUtils
;
import
com.google.common.collect.Sets
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Set
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.ApplicationEventPublisher
;
import
org.springframework.data.domain.Pageable
;
...
...
@@ -36,10 +38,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.client.HttpClientErrorException
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Set
;
@RestController
@RequestMapping
(
"/apps"
)
...
...
@@ -82,8 +80,9 @@ public class AppController {
Set
<
String
>
admins
=
appModel
.
getAdmins
();
if
(!
CollectionUtils
.
isEmpty
(
admins
))
{
rolePermissionService
.
assignRoleToUsers
(
RoleUtils
.
buildAppMasterRoleName
(
createdApp
.
getAppId
()),
admins
,
userInfoHolder
.
getUser
().
getUserId
());
rolePermissionService
.
assignRoleToUsers
(
RoleUtils
.
buildAppMasterRoleName
(
createdApp
.
getAppId
()),
admins
,
userInfoHolder
.
getUser
().
getUserId
());
}
return
createdApp
;
...
...
@@ -113,8 +112,8 @@ public class AppController {
response
.
addResponseEntity
(
RichResponseEntity
.
ok
(
appService
.
createEnvNavNode
(
env
,
appId
)));
}
catch
(
Exception
e
)
{
response
.
addResponseEntity
(
RichResponseEntity
.
error
(
HttpStatus
.
INTERNAL_SERVER_ERROR
,
"load env:"
+
env
.
name
()
+
" cluster error."
+
e
.
getMessage
()));
"load env:"
+
env
.
name
()
+
" cluster error."
+
e
.
getMessage
()));
}
}
return
response
;
...
...
@@ -124,8 +123,9 @@ public class AppController {
"application/json"
})
public
ResponseEntity
<
Void
>
create
(
@PathVariable
String
env
,
@RequestBody
App
app
)
{
RequestPrecondition
.
checkArgumentsNotEmpty
(
app
.
getName
(),
app
.
getAppId
(),
app
.
getOwnerEmail
(),
app
.
getOwnerName
(),
app
.
getOrgId
(),
app
.
getOrgName
());
RequestPrecondition
.
checkArgumentsNotEmpty
(
app
.
getName
(),
app
.
getAppId
(),
app
.
getOwnerEmail
(),
app
.
getOwnerName
(),
app
.
getOrgId
(),
app
.
getOrgName
());
if
(!
InputValidator
.
isValidClusterNamespace
(
app
.
getAppId
()))
{
throw
new
BadRequestException
(
InputValidator
.
INVALID_CLUSTER_NAMESPACE_MESSAGE
);
}
...
...
@@ -141,6 +141,17 @@ public class AppController {
return
appService
.
load
(
appId
);
}
@RequestMapping
(
value
=
"/{appId:.+}"
,
method
=
RequestMethod
.
DELETE
)
public
void
deleteApp
(
@PathVariable
String
appId
)
{
App
app
=
appService
.
load
(
appId
);
publisher
.
publishEvent
(
new
AppDeletionEvent
(
app
));
appService
.
deleteAppInLocal
(
appId
);
}
@RequestMapping
(
value
=
"/{appId}/miss_envs"
,
method
=
RequestMethod
.
GET
)
public
MultiResponseEntity
<
Env
>
findMissEnvs
(
@PathVariable
String
appId
)
{
...
...
@@ -154,9 +165,9 @@ public class AppController {
response
.
addResponseEntity
(
RichResponseEntity
.
ok
(
env
));
}
else
{
response
.
addResponseEntity
(
RichResponseEntity
.
error
(
HttpStatus
.
INTERNAL_SERVER_ERROR
,
String
.
format
(
"load appId:%s from env %s error."
,
appId
,
env
)
+
e
.
getMessage
()));
String
.
format
(
"load appId:%s from env %s error."
,
appId
,
env
)
+
e
.
getMessage
()));
}
}
}
...
...
@@ -175,16 +186,17 @@ public class AppController {
RequestPrecondition
.
checkArgumentsNotEmpty
(
appId
,
appName
,
ownerName
,
orgId
,
orgName
);
if
(!
InputValidator
.
isValidClusterNamespace
(
appModel
.
getAppId
()))
{
throw
new
BadRequestException
(
String
.
format
(
"AppId格式错误: %s"
,
InputValidator
.
INVALID_CLUSTER_NAMESPACE_MESSAGE
));
throw
new
BadRequestException
(
String
.
format
(
"AppId格式错误: %s"
,
InputValidator
.
INVALID_CLUSTER_NAMESPACE_MESSAGE
));
}
return
App
.
builder
()
.
appId
(
appId
)
.
name
(
appName
)
.
ownerName
(
ownerName
)
.
orgId
(
orgId
)
.
orgName
(
orgName
)
.
build
();
.
appId
(
appId
)
.
name
(
appName
)
.
ownerName
(
ownerName
)
.
orgId
(
orgId
)
.
orgName
(
orgName
)
.
build
();
}
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppDeletionEvent.java
0 → 100644
View file @
e25fe0ce
package
com
.
ctrip
.
framework
.
apollo
.
portal
.
listener
;
import
com.ctrip.framework.apollo.common.entity.App
;
import
com.google.common.base.Preconditions
;
import
org.springframework.context.ApplicationEvent
;
public
class
AppDeletionEvent
extends
ApplicationEvent
{
public
AppDeletionEvent
(
Object
source
)
{
super
(
source
);
}
public
App
getApp
()
{
Preconditions
.
checkState
(
source
!=
null
);
return
(
App
)
this
.
source
;
}
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppInfoChangedListener.java
View file @
e25fe0ce
...
...
@@ -5,6 +5,7 @@ import com.ctrip.framework.apollo.common.utils.BeanUtils;
import
com.ctrip.framework.apollo.core.enums.Env
;
import
com.ctrip.framework.apollo.portal.api.AdminServiceAPI
;
import
com.ctrip.framework.apollo.portal.component.PortalSettings
;
import
com.ctrip.framework.apollo.portal.spi.UserInfoHolder
;
import
com.ctrip.framework.apollo.tracer.Tracer
;
import
org.slf4j.Logger
;
...
...
@@ -23,7 +24,8 @@ public class AppInfoChangedListener {
private
AdminServiceAPI
.
AppAPI
appAPI
;
@Autowired
private
PortalSettings
portalSettings
;
@Autowired
private
UserInfoHolder
userInfoHolder
;
@EventListener
public
void
onAppInfoChange
(
AppInfoChangedEvent
event
)
{
...
...
@@ -39,7 +41,22 @@ public class AppInfoChangedListener {
Tracer
.
logError
(
String
.
format
(
"Update app's info failed. Env = %s, AppId = %s"
,
env
,
appId
),
e
);
}
}
}
@EventListener
public
void
onAppDelete
(
AppDeletionEvent
event
)
{
AppDTO
appDTO
=
BeanUtils
.
transfrom
(
AppDTO
.
class
,
event
.
getApp
());
String
appId
=
appDTO
.
getAppId
();
String
operator
=
userInfoHolder
.
getUser
().
getName
();
List
<
Env
>
envs
=
portalSettings
.
getActiveEnvs
();
for
(
Env
env
:
envs
)
{
try
{
appAPI
.
deleteApp
(
env
,
appId
,
operator
);
}
catch
(
Throwable
e
)
{
logger
.
error
(
"Delete app failed. Env = {}, AppId = {}"
,
env
,
appId
,
e
);
Tracer
.
logError
(
String
.
format
(
"Delete app failed. Env = %s, AppId = %s"
,
env
,
appId
),
e
);
}
}
}
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/AppNamespaceRepository.java
View file @
e25fe0ce
package
com
.
ctrip
.
framework
.
apollo
.
portal
.
repository
;
import
com.ctrip.framework.apollo.common.entity.AppNamespace
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
java.util.List
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
public
interface
AppNamespaceRepository
extends
PagingAndSortingRepository
<
AppNamespace
,
Long
>
{
...
...
@@ -16,4 +16,9 @@ public interface AppNamespaceRepository extends PagingAndSortingRepository<AppNa
List
<
AppNamespace
>
findByIsPublicTrue
();
@Modifying
@Query
(
"UPDATE AppNamespace SET IsDeleted=1,DataChange_LastModifiedBy=?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/AppRepository.java
View file @
e25fe0ce
...
...
@@ -3,6 +3,8 @@ package com.ctrip.framework.apollo.portal.repository;
import
com.ctrip.framework.apollo.common.entity.App
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
java.util.List
;
...
...
@@ -17,4 +19,7 @@ public interface AppRepository extends PagingAndSortingRepository<App, Long> {
List
<
App
>
findByAppIdIn
(
Set
<
String
>
appIds
);
@Modifying
@Query
(
"UPDATE App SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
deleteApp
(
String
appId
,
String
operator
);
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/FavoriteRepository.java
View file @
e25fe0ce
...
...
@@ -3,6 +3,8 @@ package com.ctrip.framework.apollo.portal.repository;
import
com.ctrip.framework.apollo.portal.entity.po.Favorite
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
java.util.List
;
...
...
@@ -16,4 +18,10 @@ public interface FavoriteRepository extends PagingAndSortingRepository<Favorite,
Favorite
findFirstByUserIdOrderByPositionAscDataChangeCreatedTimeAsc
(
String
userId
);
Favorite
findByUserIdAndAppId
(
String
userId
,
String
appId
);
@Modifying
@Query
(
"UPDATE Favorite SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1"
)
int
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
int
countByAppId
(
String
appId
);
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/PermissionRepository.java
View file @
e25fe0ce
...
...
@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.portal.repository;
import
com.ctrip.framework.apollo.portal.entity.po.Permission
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
import
java.util.Collection
;
...
...
@@ -21,4 +23,13 @@ public interface PermissionRepository extends PagingAndSortingRepository<Permiss
*/
List
<
Permission
>
findByPermissionTypeInAndTargetId
(
Collection
<
String
>
permissionTypes
,
String
targetId
);
/**
* delete Permission when delete app.
*/
@Modifying
@Query
(
"UPDATE Permission SET IsDeleted=1,"
+
"TargetId=CONCAT('DELETED_',TargetId,'_',CURRENT_TIMESTAMP),"
+
"DataChange_LastModifiedBy = ?2 WHERE TargetId LIKE ?1 OR TargetId LIKE CONCAT(?1,'+%')"
)
Integer
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/repository/RoleRepository.java
View file @
e25fe0ce
...
...
@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.portal.repository;
import
com.ctrip.framework.apollo.portal.entity.po.Role
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.PagingAndSortingRepository
;
/**
...
...
@@ -12,4 +14,12 @@ public interface RoleRepository extends PagingAndSortingRepository<Role, Long> {
* find role by role name
*/
Role
findTopByRoleName
(
String
roleName
);
@Modifying
@Query
(
"UPDATE Role SET IsDeleted=1,"
+
"RoleName=CONCAT('DELETED_',RoleName,'_',CURRENT_TIMESTAMP),"
+
"DataChange_LastModifiedBy = ?2 WHERE RoleName LIKE CONCAT('Master+',?1) "
+
"OR RoleName LIKE CONCAT('ModifyNamespace+',?1,'+%') "
+
"OR RoleName LIKE CONCAT('ReleaseNamespace+',?1,'+%')"
)
Integer
batchDeleteByDeleteApp
(
String
appId
,
String
operator
);
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppNamespaceService.java
View file @
e25fe0ce
...
...
@@ -118,4 +118,9 @@ public class AppNamespaceService {
return
createdAppNamespace
;
}
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
appNamespaceRepository
.
countByAppId
(
appId
)
>
0
)
{
appNamespaceRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java
View file @
e25fe0ce
...
...
@@ -41,6 +41,10 @@ public class AppService {
@Autowired
private
RoleInitializationService
roleInitializationService
;
@Autowired
private
RolePermissionService
rolePermissionService
;
@Autowired
private
FavoriteService
favoriteService
;
@Autowired
private
UserService
userService
;
...
...
@@ -139,4 +143,23 @@ public class AppService {
return
node
;
}
@Transactional
public
void
deleteAppInLocal
(
String
appId
)
{
App
managedApp
=
appRepository
.
findByAppId
(
appId
);
if
(
managedApp
==
null
)
{
throw
new
BadRequestException
(
String
.
format
(
"App not exists. AppId = %s"
,
appId
));
}
String
operator
=
userInfoHolder
.
getUser
().
getUserId
();
//删除portal数据库中的app
appRepository
.
deleteApp
(
appId
,
operator
);
//删除portal数据库中的appNamespace
appNamespaceService
.
deleteApp
(
appId
,
operator
);
//删除portal数据库中的收藏表
favoriteService
.
deleteApp
(
appId
,
operator
);
//删除portal数据库中Perimission、Role相关数据
rolePermissionService
.
deleteRolePermissionsByAppId
(
appId
,
operator
);
}
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/FavoriteService.java
View file @
e25fe0ce
package
com
.
ctrip
.
framework
.
apollo
.
portal
.
service
;
import
com.ctrip.framework.apollo.common.exception.BadRequestException
;
import
com.ctrip.framework.apollo.portal.entity.po.Favorite
;
import
com.ctrip.framework.apollo.portal.entity.bo.UserInfo
;
import
com.ctrip.framework.apollo.portal.entity.po.Favorite
;
import
com.ctrip.framework.apollo.portal.repository.FavoriteRepository
;
import
com.ctrip.framework.apollo.portal.spi.UserInfoHolder
;
import
com.ctrip.framework.apollo.portal.spi.UserService
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Objects
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Objects
;
@Service
public
class
FavoriteService
{
...
...
@@ -110,4 +108,9 @@ public class FavoriteService {
}
}
public
void
deleteApp
(
String
appId
,
String
operator
)
{
if
(
favoriteRepository
.
countByAppId
(
appId
)
>
0
)
{
favoriteRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/RolePermissionService.java
View file @
e25fe0ce
...
...
@@ -56,4 +56,8 @@ public interface RolePermissionService {
*/
public
Set
<
Permission
>
createPermissions
(
Set
<
Permission
>
permissions
);
/**
* delete permissions when delete app.
*/
public
void
deleteRolePermissionsByAppId
(
String
appId
,
String
operator
);
}
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/spi/defaultimpl/DefaultRolePermissionService.java
View file @
e25fe0ce
...
...
@@ -220,4 +220,10 @@ public class DefaultRolePermissionService implements RolePermissionService {
return
FluentIterable
.
from
(
results
).
toSet
();
}
@Transactional
@Override
public
void
deleteRolePermissionsByAppId
(
String
appId
,
String
operator
)
{
permissionRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
roleRepository
.
batchDeleteByDeleteApp
(
appId
,
operator
);
}
}
scripts/docker-quick-start/sql/apolloconfigdb.sql
View file @
e25fe0ce
...
...
@@ -364,38 +364,38 @@ CREATE TABLE `ServerConfig` (
#
------------------------------------------------------------
INSERT
INTO
`ServerConfig`
(
`Key`
,
`Cluster`
,
`Value`
,
`Comment`
)
VALUES
(
'eureka.service.url'
,
'default'
,
'http://localhost:8080/eureka/'
,
'Eureka服务Url,多个service以英文逗号分隔'
),
(
'namespace.lock.switch'
,
'default'
,
'false'
,
'一次发布只能有一个人修改开关'
),
(
'item.value.length.limit'
,
'default'
,
'20000'
,
'item value最大长度限制'
),
(
'config-service.cache.enabled'
,
'default'
,
'false'
,
'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!'
),
(
'item.key.length.limit'
,
'default'
,
'128'
,
'item key 最大长度限制'
);
(
'eureka.service.url'
,
'default'
,
'http://localhost:8080/eureka/'
,
'Eureka服务Url,多个service以英文逗号分隔'
),
(
'namespace.lock.switch'
,
'default'
,
'false'
,
'一次发布只能有一个人修改开关'
),
(
'item.value.length.limit'
,
'default'
,
'20000'
,
'item value最大长度限制'
),
(
'config-service.cache.enabled'
,
'default'
,
'false'
,
'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!'
),
(
'item.key.length.limit'
,
'default'
,
'128'
,
'item key 最大长度限制'
);
#
Sample
Data
#
------------------------------------------------------------
INSERT
INTO
`App`
(
`AppId`
,
`Name`
,
`OrgId`
,
`OrgName`
,
`OwnerName`
,
`OwnerEmail`
)
VALUES
(
'SampleApp'
,
'Sample App'
,
'TEST1'
,
'样例部门1'
,
'apollo'
,
'apollo@acme.com'
);
(
'SampleApp'
,
'Sample App'
,
'TEST1'
,
'样例部门1'
,
'apollo'
,
'apollo@acme.com'
);
INSERT
INTO
`AppNamespace`
(
`Name`
,
`AppId`
,
`Format`
,
`IsPublic`
,
`Comment`
)
VALUES
(
'application'
,
'SampleApp'
,
'properties'
,
0
,
'default app namespace'
);
(
'application'
,
'SampleApp'
,
'properties'
,
0
,
'default app namespace'
);
INSERT
INTO
`Cluster`
(
`Name`
,
`AppId`
)
VALUES
(
'default'
,
'SampleApp'
);
(
'default'
,
'SampleApp'
);
INSERT
INTO
`Namespace`
(
`Id`
,
`AppId`
,
`ClusterName`
,
`NamespaceName`
)
VALUES
(
1
,
'SampleApp'
,
'default'
,
'application'
);
(
1
,
'SampleApp'
,
'default'
,
'application'
);
INSERT
INTO
`Item`
(
`NamespaceId`
,
`Key`
,
`Value`
,
`Comment`
,
`LineNum`
)
VALUES
(
1
,
'timeout'
,
'100'
,
'sample timeout配置'
,
1
);
(
1
,
'timeout'
,
'100'
,
'sample timeout配置'
,
1
);
INSERT
INTO
`Release`
(
`ReleaseKey`
,
`Name`
,
`Comment`
,
`AppId`
,
`ClusterName`
,
`NamespaceName`
,
`Configurations`
)
VALUES
(
'20161009155425-d3a0749c6e20bc15'
,
'20161009155424-release'
,
'Sample发布'
,
'SampleApp'
,
'default'
,
'application'
,
'{
\"
timeout
\"
:
\"
100
\"
}'
);
(
'20161009155425-d3a0749c6e20bc15'
,
'20161009155424-release'
,
'Sample发布'
,
'SampleApp'
,
'default'
,
'application'
,
'{
\"
timeout
\"
:
\"
100
\"
}'
);
INSERT
INTO
`ReleaseHistory`
(
`AppId`
,
`ClusterName`
,
`NamespaceName`
,
`BranchName`
,
`ReleaseId`
,
`PreviousReleaseId`
,
`Operation`
,
`OperationContext`
,
`DataChange_CreatedBy`
,
`DataChange_LastModifiedBy`
)
VALUES
...
...
scripts/docker-quick-start/sql/apolloportaldb.sql
View file @
e25fe0ce
...
...
@@ -307,16 +307,16 @@ CREATE TABLE `Authorities` (
#
------------------------------------------------------------
INSERT
INTO
`ServerConfig`
(
`Key`
,
`Value`
,
`Comment`
)
VALUES
(
'apollo.portal.envs'
,
'dev'
,
'可支持的环境列表'
),
(
'organizations'
,
'[{
\"
orgId
\"
:
\"
TEST1
\"
,
\"
orgName
\"
:
\"
样例部门1
\"
},{
\"
orgId
\"
:
\"
TEST2
\"
,
\"
orgName
\"
:
\"
样例部门2
\"
}]'
,
'部门列表'
),
(
'superAdmin'
,
'apollo'
,
'Portal超级管理员'
),
(
'api.readTimeout'
,
'10000'
,
'http接口read timeout'
),
(
'consumer.token.salt'
,
'someSalt'
,
'consumer token salt'
),
(
'admin.createPrivateNamespace.switch'
,
'false'
,
'是否允许项目管理员创建私有namespace'
);
(
'apollo.portal.envs'
,
'dev'
,
'可支持的环境列表'
),
(
'organizations'
,
'[{
\"
orgId
\"
:
\"
TEST1
\"
,
\"
orgName
\"
:
\"
样例部门1
\"
},{
\"
orgId
\"
:
\"
TEST2
\"
,
\"
orgName
\"
:
\"
样例部门2
\"
}]'
,
'部门列表'
),
(
'superAdmin'
,
'apollo'
,
'Portal超级管理员'
),
(
'api.readTimeout'
,
'10000'
,
'http接口read timeout'
),
(
'consumer.token.salt'
,
'someSalt'
,
'consumer token salt'
),
(
'admin.createPrivateNamespace.switch'
,
'false'
,
'是否允许项目管理员创建私有namespace'
);
INSERT
INTO
`Users`
(
`Username`
,
`Password`
,
`Email`
,
`Enabled`
)
VALUES
(
'apollo'
,
'$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS'
,
'apollo@acme.com'
,
1
);
(
'apollo'
,
'$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS'
,
'apollo@acme.com'
,
1
);
INSERT
INTO
`Authorities`
(
`Username`
,
`Authority`
)
VALUES
(
'apollo'
,
'ROLE_user'
);
...
...
@@ -324,39 +324,39 @@ INSERT INTO `Authorities` (`Username`, `Authority`) VALUES ('apollo', 'ROLE_user
#
------------------------------------------------------------
INSERT
INTO
`App`
(
`AppId`
,
`Name`
,
`OrgId`
,
`OrgName`
,
`OwnerName`
,
`OwnerEmail`
)
VALUES
(
'SampleApp'
,
'Sample App'
,
'TEST1'
,
'样例部门1'
,
'apollo'
,
'apollo@acme.com'
);
(
'SampleApp'
,
'Sample App'
,
'TEST1'
,
'样例部门1'
,
'apollo'
,
'apollo@acme.com'
);
INSERT
INTO
`AppNamespace`
(
`Name`
,
`AppId`
,
`Format`
,
`IsPublic`
,
`Comment`
)
VALUES
(
'application'
,
'SampleApp'
,
'properties'
,
0
,
'default app namespace'
);
(
'application'
,
'SampleApp'
,
'properties'
,
0
,
'default app namespace'
);
INSERT
INTO
`Permission`
(
`Id`
,
`PermissionType`
,
`TargetId`
)
VALUES
(
1
,
'CreateCluster'
,
'SampleApp'
),
(
2
,
'CreateNamespace'
,
'SampleApp'
),
(
3
,
'AssignRole'
,
'SampleApp'
),
(
4
,
'ModifyNamespace'
,
'SampleApp+application'
),
(
5
,
'ReleaseNamespace'
,
'SampleApp+application'
);
(
1
,
'CreateCluster'
,
'SampleApp'
),
(
2
,
'CreateNamespace'
,
'SampleApp'
),
(
3
,
'AssignRole'
,
'SampleApp'
),
(
4
,
'ModifyNamespace'
,
'SampleApp+application'
),
(
5
,
'ReleaseNamespace'
,
'SampleApp+application'
);
INSERT
INTO
`Role`
(
`Id`
,
`RoleName`
)
VALUES
(
1
,
'Master+SampleApp'
),
(
2
,
'ModifyNamespace+SampleApp+application'
),
(
3
,
'ReleaseNamespace+SampleApp+application'
);
(
1
,
'Master+SampleApp'
),
(
2
,
'ModifyNamespace+SampleApp+application'
),
(
3
,
'ReleaseNamespace+SampleApp+application'
);
INSERT
INTO
`RolePermission`
(
`RoleId`
,
`PermissionId`
)
VALUES
(
1
,
1
),
(
1
,
2
),
(
1
,
3
),
(
2
,
4
),
(
3
,
5
);
(
1
,
1
),
(
1
,
2
),
(
1
,
3
),
(
2
,
4
),
(
3
,
5
);
INSERT
INTO
`UserRole`
(
`UserId`
,
`RoleId`
)
VALUES
(
'apollo'
,
1
),
(
'apollo'
,
2
),
(
'apollo'
,
3
);
(
'apollo'
,
1
),
(
'apollo'
,
2
),
(
'apollo'
,
3
);
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */
;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */
;
...
...
scripts/sql/apolloconfigdb.sql
View file @
e25fe0ce
...
...
@@ -364,11 +364,11 @@ CREATE TABLE `ServerConfig` (
#
------------------------------------------------------------
INSERT
INTO
`ServerConfig`
(
`Key`
,
`Cluster`
,
`Value`
,
`Comment`
)
VALUES
(
'eureka.service.url'
,
'default'
,
'http://localhost:8080/eureka/'
,
'Eureka服务Url,多个service以英文逗号分隔'
),
(
'namespace.lock.switch'
,
'default'
,
'false'
,
'一次发布只能有一个人修改开关'
),
(
'item.key.length.limit'
,
'default'
,
'128'
,
'item key 最大长度限制'
),
(
'item.value.length.limit'
,
'default'
,
'20000'
,
'item value最大长度限制'
),
(
'config-service.cache.enabled'
,
'default'
,
'false'
,
'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!'
);
(
'eureka.service.url'
,
'default'
,
'http://localhost:8080/eureka/'
,
'Eureka服务Url,多个service以英文逗号分隔'
),
(
'namespace.lock.switch'
,
'default'
,
'false'
,
'一次发布只能有一个人修改开关'
),
(
'item.key.length.limit'
,
'default'
,
'128'
,
'item key 最大长度限制'
),
(
'item.value.length.limit'
,
'default'
,
'20000'
,
'item value最大长度限制'
),
(
'config-service.cache.enabled'
,
'default'
,
'false'
,
'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!'
);
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */
;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */
;
...
...
scripts/sql/apolloportaldb.sql
View file @
e25fe0ce
...
...
@@ -307,16 +307,16 @@ CREATE TABLE `Authorities` (
#
------------------------------------------------------------
INSERT
INTO
`ServerConfig`
(
`Key`
,
`Value`
,
`Comment`
)
VALUES
(
'apollo.portal.envs'
,
'dev'
,
'可支持的环境列表'
),
(
'organizations'
,
'[{
\"
orgId
\"
:
\"
TEST1
\"
,
\"
orgName
\"
:
\"
样例部门1
\"
},{
\"
orgId
\"
:
\"
TEST2
\"
,
\"
orgName
\"
:
\"
样例部门2
\"
}]'
,
'部门列表'
),
(
'superAdmin'
,
'apollo'
,
'Portal超级管理员'
),
(
'api.readTimeout'
,
'10000'
,
'http接口read timeout'
),
(
'consumer.token.salt'
,
'someSalt'
,
'consumer token salt'
),
(
'admin.createPrivateNamespace.switch'
,
'false'
,
'是否允许项目管理员创建私有namespace'
);
(
'apollo.portal.envs'
,
'dev'
,
'可支持的环境列表'
),
(
'organizations'
,
'[{
\"
orgId
\"
:
\"
TEST1
\"
,
\"
orgName
\"
:
\"
样例部门1
\"
},{
\"
orgId
\"
:
\"
TEST2
\"
,
\"
orgName
\"
:
\"
样例部门2
\"
}]'
,
'部门列表'
),
(
'superAdmin'
,
'apollo'
,
'Portal超级管理员'
),
(
'api.readTimeout'
,
'10000'
,
'http接口read timeout'
),
(
'consumer.token.salt'
,
'someSalt'
,
'consumer token salt'
),
(
'admin.createPrivateNamespace.switch'
,
'false'
,
'是否允许项目管理员创建私有namespace'
);
INSERT
INTO
`Users`
(
`Username`
,
`Password`
,
`Email`
,
`Enabled`
)
VALUES
(
'apollo'
,
'$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS'
,
'apollo@acme.com'
,
1
);
(
'apollo'
,
'$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS'
,
'apollo@acme.com'
,
1
);
INSERT
INTO
`Authorities`
(
`Username`
,
`Authority`
)
VALUES
(
'apollo'
,
'ROLE_user'
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment