Commit 6b0ac1b4 authored by Jason Song's avatar Jason Song

Merge pull request #105 from yiming187/audit_update

Add audit for services
parents 92a8a0fd 43653a62
...@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.ctrip.apollo.biz.entity.App; import com.ctrip.apollo.biz.entity.App;
import com.ctrip.apollo.biz.service.AdminService; import com.ctrip.apollo.biz.service.AdminService;
import com.ctrip.apollo.biz.service.AppService; import com.ctrip.apollo.biz.service.AppService;
import com.ctrip.apollo.common.controller.ActiveUser;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
import com.ctrip.apollo.core.dto.AppDTO; import com.ctrip.apollo.core.dto.AppDTO;
import com.ctrip.apollo.core.exception.NotFoundException; import com.ctrip.apollo.core.exception.NotFoundException;
...@@ -30,18 +32,19 @@ public class AppController { ...@@ -30,18 +32,19 @@ public class AppController {
private AdminService adminService; private AdminService adminService;
@RequestMapping(path = "/apps", method = RequestMethod.POST) @RequestMapping(path = "/apps", method = RequestMethod.POST)
public ResponseEntity<AppDTO> create(@RequestBody AppDTO dto) { public ResponseEntity<AppDTO> create(@RequestBody AppDTO dto, @ActiveUser UserDetails user) {
App entity = BeanUtils.transfrom(App.class, dto); App entity = BeanUtils.transfrom(App.class, dto);
entity.setDataChangeCreatedBy(user.getUsername());
entity = adminService.createNewApp(entity); entity = adminService.createNewApp(entity);
dto = BeanUtils.transfrom(AppDTO.class, entity); dto = BeanUtils.transfrom(AppDTO.class, entity);
return ResponseEntity.status(HttpStatus.CREATED).body(dto); return ResponseEntity.status(HttpStatus.CREATED).body(dto);
} }
@RequestMapping(path = "/apps/{appId}", method = RequestMethod.DELETE) @RequestMapping(path = "/apps/{appId}", method = RequestMethod.DELETE)
public void delete(@PathVariable("appId") String appId) { public void delete(@PathVariable("appId") String appId, @ActiveUser UserDetails user) {
App entity = appService.findOne(appId); App entity = appService.findOne(appId);
if (entity == null) throw new NotFoundException("app not found for appId " + appId); if (entity == null) throw new NotFoundException("app not found for appId " + appId);
appService.delete(entity.getId()); appService.delete(entity.getId(), user.getUsername());
} }
@RequestMapping("/apps") @RequestMapping("/apps")
...@@ -64,13 +67,15 @@ public class AppController { ...@@ -64,13 +67,15 @@ public class AppController {
} }
@RequestMapping(path = "/apps/{appId}", method = RequestMethod.PUT) @RequestMapping(path = "/apps/{appId}", method = RequestMethod.PUT)
public AppDTO update(@PathVariable("appId") String appId, @RequestBody AppDTO dto) { public AppDTO update(@PathVariable("appId") String appId, @RequestBody AppDTO dto,
@ActiveUser UserDetails user) {
if (!appId.equals(dto.getAppId())) { if (!appId.equals(dto.getAppId())) {
throw new IllegalArgumentException(String throw new IllegalArgumentException(String
.format("Path variable %s is not equals to object field %s", appId, dto.getAppId())); .format("Path variable %s is not equals to object field %s", appId, dto.getAppId()));
} }
App entity = appService.findOne(appId); App entity = appService.findOne(appId);
if (entity == null) throw new NotFoundException("app not found for appId " + appId); if (entity == null) throw new NotFoundException("app not found for appId " + appId);
entity.setDataChangeLastModifiedBy(user.getUsername());
entity = appService.update(BeanUtils.transfrom(App.class, dto)); entity = appService.update(BeanUtils.transfrom(App.class, dto));
return BeanUtils.transfrom(AppDTO.class, entity); return BeanUtils.transfrom(AppDTO.class, entity);
} }
......
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.ctrip.apollo.biz.entity.Cluster; import com.ctrip.apollo.biz.entity.Cluster;
import com.ctrip.apollo.biz.service.ClusterService; import com.ctrip.apollo.biz.service.ClusterService;
import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.biz.service.ViewService;
import com.ctrip.apollo.common.controller.ActiveUser;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
import com.ctrip.apollo.core.dto.ClusterDTO; import com.ctrip.apollo.core.dto.ClusterDTO;
import com.ctrip.apollo.core.exception.NotFoundException; import com.ctrip.apollo.core.exception.NotFoundException;
...@@ -29,8 +31,9 @@ public class ClusterController { ...@@ -29,8 +31,9 @@ public class ClusterController {
@RequestMapping(path = "/apps/{appId}/clusters", method = RequestMethod.POST) @RequestMapping(path = "/apps/{appId}/clusters", method = RequestMethod.POST)
public ResponseEntity<ClusterDTO> create(@PathVariable("appId") String appId, public ResponseEntity<ClusterDTO> create(@PathVariable("appId") String appId,
@RequestBody ClusterDTO dto) { @RequestBody ClusterDTO dto, @ActiveUser UserDetails user) {
Cluster entity = BeanUtils.transfrom(Cluster.class, dto); Cluster entity = BeanUtils.transfrom(Cluster.class, dto);
entity.setDataChangeCreatedBy(user.getUsername());
entity = clusterService.save(entity); entity = clusterService.save(entity);
dto = BeanUtils.transfrom(ClusterDTO.class, entity); dto = BeanUtils.transfrom(ClusterDTO.class, entity);
return ResponseEntity.status(HttpStatus.CREATED).body(dto); return ResponseEntity.status(HttpStatus.CREATED).body(dto);
...@@ -38,11 +41,11 @@ public class ClusterController { ...@@ -38,11 +41,11 @@ public class ClusterController {
@RequestMapping(path = "/apps/{appId}/clusters/{clusterName}", method = RequestMethod.DELETE) @RequestMapping(path = "/apps/{appId}/clusters/{clusterName}", method = RequestMethod.DELETE)
public void delete(@PathVariable("appId") String appId, public void delete(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName) { @PathVariable("clusterName") String clusterName, @ActiveUser UserDetails user) {
Cluster entity = clusterService.findOne(appId, clusterName); Cluster entity = clusterService.findOne(appId, clusterName);
if (entity == null) if (entity == null)
throw new NotFoundException("cluster not found for clusterName " + clusterName); throw new NotFoundException("cluster not found for clusterName " + clusterName);
clusterService.delete(entity.getId()); clusterService.delete(entity.getId(), user.getUsername());
} }
@RequestMapping("/apps/{appId}/clusters") @RequestMapping("/apps/{appId}/clusters")
...@@ -55,18 +58,21 @@ public class ClusterController { ...@@ -55,18 +58,21 @@ public class ClusterController {
public ClusterDTO get(@PathVariable("appId") String appId, public ClusterDTO get(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName) { @PathVariable("clusterName") String clusterName) {
Cluster cluster = clusterService.findOne(appId, clusterName); Cluster cluster = clusterService.findOne(appId, clusterName);
if (cluster == null) throw new NotFoundException("cluster not found for name " + clusterName);
return BeanUtils.transfrom(ClusterDTO.class, cluster); return BeanUtils.transfrom(ClusterDTO.class, cluster);
} }
@RequestMapping(path = "/apps/{appId}/clusters/{clusterName}", method = RequestMethod.PUT) @RequestMapping(path = "/apps/{appId}/clusters/{clusterName}", method = RequestMethod.PUT)
public ClusterDTO update(@PathVariable("appId") String appId, public ClusterDTO update(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName, @RequestBody ClusterDTO dto) { @PathVariable("clusterName") String clusterName, @RequestBody ClusterDTO dto,
@ActiveUser UserDetails user) {
if (!clusterName.equals(dto.getName())) { if (!clusterName.equals(dto.getName())) {
throw new IllegalArgumentException(String throw new IllegalArgumentException(String
.format("Path variable %s is not equals to object field %s", clusterName, dto.getName())); .format("Path variable %s is not equals to object field %s", clusterName, dto.getName()));
} }
Cluster entity = clusterService.findOne(appId, clusterName); Cluster entity = clusterService.findOne(appId, clusterName);
if (entity == null) throw new NotFoundException("cluster not found for name " + clusterName); if (entity == null) throw new NotFoundException("cluster not found for name " + clusterName);
entity.setDataChangeLastModifiedBy(user.getUsername());
entity = clusterService.update(BeanUtils.transfrom(Cluster.class, dto)); entity = clusterService.update(BeanUtils.transfrom(Cluster.class, dto));
return BeanUtils.transfrom(ClusterDTO.class, entity); return BeanUtils.transfrom(ClusterDTO.class, entity);
} }
......
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.ctrip.apollo.biz.entity.Item; import com.ctrip.apollo.biz.entity.Item;
import com.ctrip.apollo.biz.service.ItemService; import com.ctrip.apollo.biz.service.ItemService;
import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.biz.service.ViewService;
import com.ctrip.apollo.common.controller.ActiveUser;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
import com.ctrip.apollo.core.dto.ItemDTO; import com.ctrip.apollo.core.dto.ItemDTO;
import com.ctrip.apollo.core.exception.NotFoundException; import com.ctrip.apollo.core.exception.NotFoundException;
...@@ -28,18 +30,19 @@ public class ItemController { ...@@ -28,18 +30,19 @@ public class ItemController {
private ItemService itemService; private ItemService itemService;
@RequestMapping(path = "/items/", method = RequestMethod.POST) @RequestMapping(path = "/items/", method = RequestMethod.POST)
public ResponseEntity<ItemDTO> create(@RequestBody ItemDTO dto) { public ResponseEntity<ItemDTO> create(@RequestBody ItemDTO dto, @ActiveUser UserDetails user) {
Item entity = BeanUtils.transfrom(Item.class, dto); Item entity = BeanUtils.transfrom(Item.class, dto);
entity.setDataChangeCreatedBy(user.getUsername());
entity = itemService.save(entity); entity = itemService.save(entity);
dto = BeanUtils.transfrom(ItemDTO.class, entity); dto = BeanUtils.transfrom(ItemDTO.class, entity);
return ResponseEntity.status(HttpStatus.CREATED).body(dto); return ResponseEntity.status(HttpStatus.CREATED).body(dto);
} }
@RequestMapping(path = "/items/{itemId}", method = RequestMethod.DELETE) @RequestMapping(path = "/items/{itemId}", method = RequestMethod.DELETE)
public void delete(@PathVariable("itemId") long itemId) { public void delete(@PathVariable("itemId") long itemId, @ActiveUser UserDetails user) {
Item entity = itemService.findOne(itemId); Item entity = itemService.findOne(itemId);
if (entity == null) throw new NotFoundException("item not found for itemId " + itemId); if (entity == null) throw new NotFoundException("item not found for itemId " + itemId);
itemService.delete(entity.getId()); itemService.delete(entity.getId(), user.getUsername());
} }
@RequestMapping("/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items") @RequestMapping("/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items")
...@@ -53,13 +56,16 @@ public class ItemController { ...@@ -53,13 +56,16 @@ public class ItemController {
@RequestMapping("/items/{itemId}") @RequestMapping("/items/{itemId}")
public ItemDTO get(@PathVariable("itemId") long itemId) { public ItemDTO get(@PathVariable("itemId") long itemId) {
Item item = itemService.findOne(itemId); Item item = itemService.findOne(itemId);
if (item == null) throw new NotFoundException("item not found for itemId " + itemId);
return BeanUtils.transfrom(ItemDTO.class, item); return BeanUtils.transfrom(ItemDTO.class, item);
} }
@RequestMapping(path = "/item/{itemId}", method = RequestMethod.PUT) @RequestMapping(path = "/item/{itemId}", method = RequestMethod.PUT)
public ItemDTO update(@PathVariable("itemId") long itemId, @RequestBody ItemDTO dto) { public ItemDTO update(@PathVariable("itemId") long itemId, @RequestBody ItemDTO dto,
@ActiveUser UserDetails user) {
Item entity = itemService.findOne(itemId); Item entity = itemService.findOne(itemId);
if (entity == null) throw new NotFoundException("item not found for itemId " + itemId); if (entity == null) throw new NotFoundException("item not found for itemId " + itemId);
entity.setDataChangeLastModifiedBy(user.getUsername());
entity = itemService.update(BeanUtils.transfrom(Item.class, dto)); entity = itemService.update(BeanUtils.transfrom(Item.class, dto));
return BeanUtils.transfrom(ItemDTO.class, entity); return BeanUtils.transfrom(ItemDTO.class, entity);
} }
......
...@@ -3,12 +3,14 @@ package com.ctrip.apollo.adminservice.controller; ...@@ -3,12 +3,14 @@ package com.ctrip.apollo.adminservice.controller;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ctrip.apollo.biz.service.ItemSetService; import com.ctrip.apollo.biz.service.ItemSetService;
import com.ctrip.apollo.common.controller.ActiveUser;
import com.ctrip.apollo.core.dto.ItemChangeSets; import com.ctrip.apollo.core.dto.ItemChangeSets;
@RestController @RestController
...@@ -18,8 +20,8 @@ public class ItemSetController { ...@@ -18,8 +20,8 @@ public class ItemSetController {
private ItemSetService itemSetService; private ItemSetService itemSetService;
@RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/itemset", method = RequestMethod.POST) @RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/itemset", method = RequestMethod.POST)
public ResponseEntity<Void> create(@RequestBody ItemChangeSets changeSet) { public ResponseEntity<Void> create(@RequestBody ItemChangeSets changeSet, @ActiveUser UserDetails user) {
itemSetService.updateSet(changeSet); itemSetService.updateSet(changeSet, user.getUsername());
return ResponseEntity.status(HttpStatus.OK).build(); return ResponseEntity.status(HttpStatus.OK).build();
} }
} }
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.ctrip.apollo.biz.entity.Namespace; import com.ctrip.apollo.biz.entity.Namespace;
import com.ctrip.apollo.biz.service.NamespaceService; import com.ctrip.apollo.biz.service.NamespaceService;
import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.biz.service.ViewService;
import com.ctrip.apollo.common.controller.ActiveUser;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
import com.ctrip.apollo.core.dto.NamespaceDTO; import com.ctrip.apollo.core.dto.NamespaceDTO;
import com.ctrip.apollo.core.exception.NotFoundException; import com.ctrip.apollo.core.exception.NotFoundException;
...@@ -29,7 +31,8 @@ public class NamespaceController { ...@@ -29,7 +31,8 @@ public class NamespaceController {
@RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces", method = RequestMethod.POST) @RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces", method = RequestMethod.POST)
public ResponseEntity<NamespaceDTO> create(@PathVariable("appId") String appId, public ResponseEntity<NamespaceDTO> create(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName, @RequestBody NamespaceDTO dto) { @PathVariable("clusterName") String clusterName, @RequestBody NamespaceDTO dto,
@ActiveUser UserDetails user) {
if (!appId.equals(dto.getAppId())) { if (!appId.equals(dto.getAppId())) {
throw new IllegalArgumentException(String throw new IllegalArgumentException(String
.format("Path variable %s is not equals to object field %s", appId, dto.getAppId())); .format("Path variable %s is not equals to object field %s", appId, dto.getAppId()));
...@@ -39,6 +42,7 @@ public class NamespaceController { ...@@ -39,6 +42,7 @@ public class NamespaceController {
"Path variable %s is not equals to object field %s", clusterName, dto.getClusterName())); "Path variable %s is not equals to object field %s", clusterName, dto.getClusterName()));
} }
Namespace entity = BeanUtils.transfrom(Namespace.class, dto); Namespace entity = BeanUtils.transfrom(Namespace.class, dto);
entity.setDataChangeCreatedBy(user.getUsername());
entity = namespaceService.save(entity); entity = namespaceService.save(entity);
dto = BeanUtils.transfrom(NamespaceDTO.class, entity); dto = BeanUtils.transfrom(NamespaceDTO.class, entity);
return ResponseEntity.status(HttpStatus.CREATED).body(dto); return ResponseEntity.status(HttpStatus.CREATED).body(dto);
...@@ -47,11 +51,11 @@ public class NamespaceController { ...@@ -47,11 +51,11 @@ public class NamespaceController {
@RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}", method = RequestMethod.DELETE) @RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}", method = RequestMethod.DELETE)
public void delete(@PathVariable("appId") String appId, public void delete(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName, @PathVariable("clusterName") String clusterName,
@PathVariable("namespaceName") String namespaceName) { @PathVariable("namespaceName") String namespaceName, @ActiveUser UserDetails user) {
Namespace entity = namespaceService.findOne(appId, clusterName, namespaceName); Namespace entity = namespaceService.findOne(appId, clusterName, namespaceName);
if (entity == null) throw new NotFoundException( if (entity == null) throw new NotFoundException(
String.format("namespace not found for %s %s %s", appId, clusterName, namespaceName)); String.format("namespace not found for %s %s %s", appId, clusterName, namespaceName));
namespaceService.delete(entity.getId()); namespaceService.delete(entity.getId(), user.getUsername());
} }
@RequestMapping("/apps/{appId}/clusters/{clusterName}/namespaces") @RequestMapping("/apps/{appId}/clusters/{clusterName}/namespaces")
...@@ -82,7 +86,8 @@ public class NamespaceController { ...@@ -82,7 +86,8 @@ public class NamespaceController {
@RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}", method = RequestMethod.PUT) @RequestMapping(path = "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}", method = RequestMethod.PUT)
public NamespaceDTO update(@PathVariable("appId") String appId, public NamespaceDTO update(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName, @PathVariable("clusterName") String clusterName,
@PathVariable("namespaceName") String namespaceName, @RequestBody NamespaceDTO dto) { @PathVariable("namespaceName") String namespaceName, @RequestBody NamespaceDTO dto,
@ActiveUser UserDetails user) {
if (!appId.equals(dto.getAppId())) { if (!appId.equals(dto.getAppId())) {
throw new IllegalArgumentException(String throw new IllegalArgumentException(String
.format("Path variable %s is not equals to object field %s", appId, dto.getAppId())); .format("Path variable %s is not equals to object field %s", appId, dto.getAppId()));
...@@ -99,6 +104,7 @@ public class NamespaceController { ...@@ -99,6 +104,7 @@ public class NamespaceController {
Namespace entity = namespaceService.findOne(appId, clusterName, namespaceName); Namespace entity = namespaceService.findOne(appId, clusterName, namespaceName);
if (entity == null) throw new NotFoundException( if (entity == null) throw new NotFoundException(
String.format("namespace not found for %s %s %s", appId, clusterName, namespaceName)); String.format("namespace not found for %s %s %s", appId, clusterName, namespaceName));
entity.setDataChangeLastModifiedBy(user.getUsername());
entity = namespaceService.update(BeanUtils.transfrom(Namespace.class, dto)); entity = namespaceService.update(BeanUtils.transfrom(Namespace.class, dto));
return BeanUtils.transfrom(NamespaceDTO.class, entity); return BeanUtils.transfrom(NamespaceDTO.class, entity);
} }
......
...@@ -3,6 +3,7 @@ package com.ctrip.apollo.adminservice.controller; ...@@ -3,6 +3,7 @@ package com.ctrip.apollo.adminservice.controller;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
...@@ -13,6 +14,7 @@ import com.ctrip.apollo.biz.entity.Release; ...@@ -13,6 +14,7 @@ import com.ctrip.apollo.biz.entity.Release;
import com.ctrip.apollo.biz.service.ConfigService; import com.ctrip.apollo.biz.service.ConfigService;
import com.ctrip.apollo.biz.service.ReleaseService; import com.ctrip.apollo.biz.service.ReleaseService;
import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.biz.service.ViewService;
import com.ctrip.apollo.common.controller.ActiveUser;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
import com.ctrip.apollo.core.dto.ReleaseDTO; import com.ctrip.apollo.core.dto.ReleaseDTO;
import com.ctrip.apollo.core.exception.NotFoundException; import com.ctrip.apollo.core.exception.NotFoundException;
...@@ -47,12 +49,12 @@ public class ReleaseController { ...@@ -47,12 +49,12 @@ public class ReleaseController {
@RequestMapping("/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/latest") @RequestMapping("/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/latest")
public ReleaseDTO getLatest(@PathVariable("appId") String appId, public ReleaseDTO getLatest(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName, @PathVariable("clusterName") String clusterName,
@PathVariable("namespaceName") String namespaceName) { @PathVariable("namespaceName") String namespaceName) {
Release release = configService.findRelease(appId, clusterName, namespaceName); Release release = configService.findRelease(appId, clusterName, namespaceName);
if (release == null) { if (release == null) {
throw new NotFoundException( throw new NotFoundException(String.format("latest release not found for %s %s %s", appId,
String.format("latest release not found for %s %s %s", appId, clusterName, namespaceName)); clusterName, namespaceName));
} else { } else {
return BeanUtils.transfrom(ReleaseDTO.class, release); return BeanUtils.transfrom(ReleaseDTO.class, release);
} }
...@@ -62,8 +64,10 @@ public class ReleaseController { ...@@ -62,8 +64,10 @@ public class ReleaseController {
public ReleaseDTO buildRelease(@PathVariable("appId") String appId, public ReleaseDTO buildRelease(@PathVariable("appId") String appId,
@PathVariable("clusterName") String clusterName, @PathVariable("clusterName") String clusterName,
@PathVariable("namespaceName") String namespaceName, @RequestParam("name") String name, @PathVariable("namespaceName") String namespaceName, @RequestParam("name") String name,
@RequestParam(name = "comment", required = false) String comment) { @RequestParam(name = "comment", required = false) String comment,
Release release = releaseService.buildRelease(name, comment, appId, clusterName, namespaceName); @ActiveUser UserDetails user) {
Release release = releaseService.buildRelease(name, comment, appId, clusterName, namespaceName,
user.getUsername());
return BeanUtils.transfrom(ReleaseDTO.class, release); return BeanUtils.transfrom(ReleaseDTO.class, release);
} }
} }
...@@ -15,7 +15,7 @@ import com.ctrip.apollo.AdminServiceTestConfiguration; ...@@ -15,7 +15,7 @@ import com.ctrip.apollo.AdminServiceTestConfiguration;
@WebIntegrationTest(randomPort = true) @WebIntegrationTest(randomPort = true)
public abstract class AbstractControllerTest { public abstract class AbstractControllerTest {
RestTemplate restTemplate = new TestRestTemplate(); RestTemplate restTemplate = new TestRestTemplate("user", "");
@Value("${local.server.port}") @Value("${local.server.port}")
int port; int port;
......
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.TestRestTemplate;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql;
...@@ -44,7 +45,7 @@ public class ItemSetControllerTest extends AbstractControllerTest { ...@@ -44,7 +45,7 @@ public class ItemSetControllerTest extends AbstractControllerTest {
Assert.assertEquals("application", namespace.getNamespaceName()); Assert.assertEquals("application", namespace.getNamespaceName());
ItemChangeSets itemSet = new ItemChangeSets(); ItemChangeSets itemSet = new ItemChangeSets();
itemSet.setModifyBy("created"); restTemplate = new TestRestTemplate("created", "");
int createdSize = 3; int createdSize = 3;
for (int i = 0; i < createdSize; i++) { for (int i = 0; i < createdSize; i++) {
...@@ -91,8 +92,8 @@ public class ItemSetControllerTest extends AbstractControllerTest { ...@@ -91,8 +92,8 @@ public class ItemSetControllerTest extends AbstractControllerTest {
Assert.assertEquals("application", namespace.getNamespaceName()); Assert.assertEquals("application", namespace.getNamespaceName());
ItemChangeSets createChangeSet = new ItemChangeSets(); ItemChangeSets createChangeSet = new ItemChangeSets();
createChangeSet.setModifyBy("created"); restTemplate = new TestRestTemplate("created", "");
int createdSize = 3; int createdSize = 3;
for (int i = 0; i < createdSize; i++) { for (int i = 0; i < createdSize; i++) {
ItemDTO item = new ItemDTO(); ItemDTO item = new ItemDTO();
...@@ -115,8 +116,8 @@ public class ItemSetControllerTest extends AbstractControllerTest { ...@@ -115,8 +116,8 @@ public class ItemSetControllerTest extends AbstractControllerTest {
ItemDTO[].class); ItemDTO[].class);
ItemChangeSets udpateChangeSet = new ItemChangeSets(); ItemChangeSets udpateChangeSet = new ItemChangeSets();
udpateChangeSet.setModifyBy("updated"); restTemplate = new TestRestTemplate("updated", "");
int updatedSize = 2; int updatedSize = 2;
for (int i = 0; i < updatedSize; i++) { for (int i = 0; i < updatedSize; i++) {
items[i].setValue("updated_value_" + i); items[i].setValue("updated_value_" + i);
...@@ -160,8 +161,8 @@ public class ItemSetControllerTest extends AbstractControllerTest { ...@@ -160,8 +161,8 @@ public class ItemSetControllerTest extends AbstractControllerTest {
Assert.assertEquals("application", namespace.getNamespaceName()); Assert.assertEquals("application", namespace.getNamespaceName());
ItemChangeSets createChangeSet = new ItemChangeSets(); ItemChangeSets createChangeSet = new ItemChangeSets();
createChangeSet.setModifyBy("created"); restTemplate = new TestRestTemplate("created", "");
int createdSize = 3; int createdSize = 3;
for (int i = 0; i < createdSize; i++) { for (int i = 0; i < createdSize; i++) {
ItemDTO item = new ItemDTO(); ItemDTO item = new ItemDTO();
...@@ -184,8 +185,8 @@ public class ItemSetControllerTest extends AbstractControllerTest { ...@@ -184,8 +185,8 @@ public class ItemSetControllerTest extends AbstractControllerTest {
ItemDTO[].class); ItemDTO[].class);
ItemChangeSets deleteChangeSet = new ItemChangeSets(); ItemChangeSets deleteChangeSet = new ItemChangeSets();
deleteChangeSet.setModifyBy("deleted"); restTemplate = new TestRestTemplate("deleted", "");
int deletedSize = 1; int deletedSize = 1;
for (int i = 0; i < deletedSize; i++) { for (int i = 0; i < deletedSize; i++) {
items[i].setValue("deleted_value_" + i); items[i].setValue("deleted_value_" + i);
......
package com.ctrip.apollo.adminservice.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@Order(99)
public class TestWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic();
http.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("").roles("USER");
auth.inMemoryAuthentication().withUser("apollo").password("").roles("USER", "ADMIN");
auth.inMemoryAuthentication().withUser("created").password("").roles("TEST");
auth.inMemoryAuthentication().withUser("updated").password("").roles("TEST");
auth.inMemoryAuthentication().withUser("deleted").password("").roles("TEST");
}
}
...@@ -56,4 +56,9 @@ public class App extends BaseEntity { ...@@ -56,4 +56,9 @@ public class App extends BaseEntity {
public void setOwnerName(String ownerName) { public void setOwnerName(String ownerName) {
this.ownerName = ownerName; this.ownerName = ownerName;
} }
public String toString() {
return toStringHelper().add("name", name).add("appId", appId).add("ownerName", ownerName)
.add("ownerEmail", ownerEmail).toString();
}
} }
...@@ -46,4 +46,8 @@ public class AppNamespace extends BaseEntity { ...@@ -46,4 +46,8 @@ public class AppNamespace extends BaseEntity {
this.name = name; this.name = name;
} }
public String toString() {
return toStringHelper().add("name", name).add("appId", appId).add("comment", comment)
.toString();
}
} }
package com.ctrip.apollo.biz.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
@Entity
@Table(name = "Audit")
@SQLDelete(sql = "Update Audit set isDeleted = 1 where id = ?")
@Where(clause = "isDeleted = 0")
public class Audit extends BaseEntity {
public enum OP {
INSERT, UPDATE, DELETE
}
@Column(name = "EntityName", nullable = false)
private String entityName;
@Column(name = "EntityId")
private Long entityId;
@Column(name = "OpName", nullable = false)
private String opName;
@Column(name = "Comment")
private String comment;
public String getComment() {
return comment;
}
public Long getEntityId() {
return entityId;
}
public String getEntityName() {
return entityName;
}
public String getOpName() {
return opName;
}
public void setComment(String comment) {
this.comment = comment;
}
public void setEntityId(Long entityId) {
this.entityId = entityId;
}
public void setEntityName(String entityName) {
this.entityName = entityName;
}
public void setOpName(String opName) {
this.opName = opName;
}
public String toString() {
return toStringHelper().add("entityName", entityName).add("entityId", entityId)
.add("opName", opName).add("comment", comment).toString();
}
}
...@@ -12,6 +12,9 @@ import javax.persistence.PrePersist; ...@@ -12,6 +12,9 @@ import javax.persistence.PrePersist;
import javax.persistence.PreRemove; import javax.persistence.PreRemove;
import javax.persistence.PreUpdate; import javax.persistence.PreUpdate;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
@MappedSuperclass @MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity { public abstract class BaseEntity {
...@@ -24,10 +27,10 @@ public abstract class BaseEntity { ...@@ -24,10 +27,10 @@ public abstract class BaseEntity {
@Column(name = "IsDeleted", columnDefinition = "Bit default '0'") @Column(name = "IsDeleted", columnDefinition = "Bit default '0'")
protected boolean isDeleted = false; protected boolean isDeleted = false;
@Column(name = "DataChange_CreatedBy") @Column(name = "DataChange_CreatedBy", nullable = false)
private String dataChangeCreatedBy; private String dataChangeCreatedBy;
@Column(name = "DataChange_CreatedTime") @Column(name = "DataChange_CreatedTime", nullable = false)
private Date dataChangeCreatedTime; private Date dataChangeCreatedTime;
@Column(name = "DataChange_LastModifiedBy") @Column(name = "DataChange_LastModifiedBy")
...@@ -85,18 +88,29 @@ public abstract class BaseEntity { ...@@ -85,18 +88,29 @@ public abstract class BaseEntity {
} }
@PrePersist @PrePersist
private void prePersist() { protected void prePersist() {
if (this.dataChangeCreatedTime == null) dataChangeCreatedTime = new Date(); if (this.dataChangeCreatedTime == null) dataChangeCreatedTime = new Date();
} }
@PreUpdate @PreUpdate
private void preUpdate() { protected void preUpdate() {
this.dataChangeLastModifiedTime = new Date(); this.dataChangeLastModifiedTime = new Date();
} }
@PreRemove @PreRemove
private void preRemove() { protected void preRemove() {
this.dataChangeLastModifiedTime = new Date(); this.dataChangeLastModifiedTime = new Date();
} }
protected ToStringHelper toStringHelper() {
return MoreObjects.toStringHelper(this).omitNullValues().add("id", id)
.add("dataChangeCreatedBy", dataChangeCreatedBy)
.add("dataChangeCreatedTime", dataChangeCreatedTime)
.add("dataChangeLastModifiedBy", dataChangeLastModifiedBy)
.add("dataChangeLastModifiedTime", dataChangeLastModifiedTime);
}
public String toString(){
return toStringHelper().toString();
}
} }
...@@ -38,4 +38,7 @@ public class Cluster extends BaseEntity { ...@@ -38,4 +38,7 @@ public class Cluster extends BaseEntity {
this.name = name; this.name = name;
} }
public String toString() {
return toStringHelper().add("name", name).add("appId", appId).toString();
}
} }
...@@ -67,4 +67,9 @@ public class Item extends BaseEntity { ...@@ -67,4 +67,9 @@ public class Item extends BaseEntity {
public void setLineNum(Integer lineNum) { public void setLineNum(Integer lineNum) {
this.lineNum = lineNum; this.lineNum = lineNum;
} }
public String toString() {
return toStringHelper().add("namespaceId", namespaceId).add("key", key).add("value", value)
.add("lineNum", lineNum).add("comment", comment).toString();
}
} }
...@@ -46,4 +46,8 @@ public class Namespace extends BaseEntity { ...@@ -46,4 +46,8 @@ public class Namespace extends BaseEntity {
this.namespaceName = namespaceName; this.namespaceName = namespaceName;
} }
public String toString() {
return toStringHelper().add("appId", appId).add("clusterName", clusterName)
.add("namespaceName", namespaceName).toString();
}
} }
...@@ -45,4 +45,9 @@ public class Privilege extends BaseEntity { ...@@ -45,4 +45,9 @@ public class Privilege extends BaseEntity {
public void setPrivilType(String privilType) { public void setPrivilType(String privilType) {
this.privilType = privilType; this.privilType = privilType;
} }
public String toString() {
return toStringHelper().add("namespaceId", namespaceId).add("privilType", privilType)
.add("name", name).toString();
}
} }
...@@ -84,4 +84,9 @@ public class Release extends BaseEntity { ...@@ -84,4 +84,9 @@ public class Release extends BaseEntity {
this.name = name; this.name = name;
} }
public String toString() {
return toStringHelper().add("name", name).add("appId", appId).add("clusterName", clusterName)
.add("namespaceName", namespaceName).add("configurations", configurations)
.add("comment", comment).toString();
}
} }
package com.ctrip.apollo.biz.repository;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import com.ctrip.apollo.biz.entity.Audit;
public interface AuditRepository extends PagingAndSortingRepository<Audit, Long> {
@Query("SELECT a from Audit a WHERE a.dataChangeCreatedBy = :owner")
List<Audit> findByOwner(@Param("owner") String owner);
@Query("SELECT a from Audit a WHERE a.dataChangeCreatedBy = :owner AND a.entityName =:entity AND a.opName = :op")
List<Audit> findAudits(@Param("owner") String owner, @Param("entity") String entity,
@Param("op") String op);
}
...@@ -6,6 +6,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -6,6 +6,7 @@ import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.App; import com.ctrip.apollo.biz.entity.App;
import com.ctrip.apollo.biz.entity.AppNamespace; import com.ctrip.apollo.biz.entity.AppNamespace;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Cluster; import com.ctrip.apollo.biz.entity.Cluster;
import com.ctrip.apollo.biz.entity.Namespace; import com.ctrip.apollo.biz.entity.Namespace;
import com.ctrip.apollo.biz.repository.AppNamespaceRepository; import com.ctrip.apollo.biz.repository.AppNamespaceRepository;
...@@ -14,9 +15,6 @@ import com.ctrip.apollo.biz.repository.ClusterRepository; ...@@ -14,9 +15,6 @@ import com.ctrip.apollo.biz.repository.ClusterRepository;
import com.ctrip.apollo.biz.repository.NamespaceRepository; import com.ctrip.apollo.biz.repository.NamespaceRepository;
import com.ctrip.apollo.core.ConfigConsts; import com.ctrip.apollo.core.ConfigConsts;
import java.util.Date;
@Service @Service
public class AdminService { public class AdminService {
...@@ -32,10 +30,16 @@ public class AdminService { ...@@ -32,10 +30,16 @@ public class AdminService {
@Autowired @Autowired
private ClusterRepository clusterRepository; private ClusterRepository clusterRepository;
@Autowired
private AuditService auditService;
@Transactional @Transactional
public App createNewApp(App app) { public App createNewApp(App app) {
String createBy = app.getDataChangeCreatedBy(); String createBy = app.getDataChangeCreatedBy();
App createdApp = appRepository.save(app); App createdApp = appRepository.save(app);
auditService.audit(App.class.getSimpleName(), createdApp.getId(), Audit.OP.INSERT, createBy);
String appId = createdApp.getAppId(); String appId = createdApp.getAppId();
createDefaultAppNamespace(appId, createBy); createDefaultAppNamespace(appId, createBy);
...@@ -47,36 +51,39 @@ public class AdminService { ...@@ -47,36 +51,39 @@ public class AdminService {
return app; return app;
} }
private void createDefaultAppNamespace(String appId, String createBy){ private void createDefaultAppNamespace(String appId, String createBy) {
AppNamespace appNs = new AppNamespace(); AppNamespace appNs = new AppNamespace();
appNs.setAppId(appId); appNs.setAppId(appId);
appNs.setName(ConfigConsts.NAMESPACE_APPLICATION); appNs.setName(ConfigConsts.NAMESPACE_APPLICATION);
appNs.setComment("default app namespace"); appNs.setComment("default app namespace");
appNs.setDataChangeCreatedBy(createBy); appNs.setDataChangeCreatedBy(createBy);
appNs.setDataChangeCreatedTime(new Date());
appNs.setDataChangeLastModifiedBy(createBy); appNs.setDataChangeLastModifiedBy(createBy);
appNamespaceRepository.save(appNs); appNamespaceRepository.save(appNs);
auditService.audit(AppNamespace.class.getSimpleName(), appNs.getId(), Audit.OP.INSERT,
createBy);
} }
private void createDefaultCluster(String appId, String createBy){ private void createDefaultCluster(String appId, String createBy) {
Cluster cluster = new Cluster(); Cluster cluster = new Cluster();
cluster.setName(ConfigConsts.CLUSTER_NAME_DEFAULT); cluster.setName(ConfigConsts.CLUSTER_NAME_DEFAULT);
cluster.setAppId(appId); cluster.setAppId(appId);
cluster.setDataChangeCreatedBy(createBy); cluster.setDataChangeCreatedBy(createBy);
cluster.setDataChangeCreatedTime(new Date());
cluster.setDataChangeLastModifiedBy(createBy); cluster.setDataChangeLastModifiedBy(createBy);
clusterRepository.save(cluster); clusterRepository.save(cluster);
auditService.audit(Cluster.class.getSimpleName(), cluster.getId(), Audit.OP.INSERT, createBy);
} }
private void createDefaultNamespace(String appId, String createBy){ private void createDefaultNamespace(String appId, String createBy) {
Namespace ns = new Namespace(); Namespace ns = new Namespace();
ns.setAppId(appId); ns.setAppId(appId);
ns.setClusterName(ConfigConsts.CLUSTER_NAME_DEFAULT); ns.setClusterName(ConfigConsts.CLUSTER_NAME_DEFAULT);
ns.setNamespaceName(ConfigConsts.NAMESPACE_APPLICATION); ns.setNamespaceName(ConfigConsts.NAMESPACE_APPLICATION);
ns.setDataChangeCreatedBy(createBy); ns.setDataChangeCreatedBy(createBy);
ns.setDataChangeCreatedTime(new Date());
ns.setDataChangeLastModifiedBy(createBy); ns.setDataChangeLastModifiedBy(createBy);
namespaceRepository.save(ns); namespaceRepository.save(ns);
auditService.audit(Namespace.class.getSimpleName(), ns.getId(), Audit.OP.INSERT, createBy);
} }
} }
...@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; ...@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.App; import com.ctrip.apollo.biz.entity.App;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.repository.AppRepository; import com.ctrip.apollo.biz.repository.AppRepository;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
...@@ -18,9 +19,14 @@ public class AppService { ...@@ -18,9 +19,14 @@ public class AppService {
@Autowired @Autowired
private AppRepository appRepository; private AppRepository appRepository;
@Autowired
private AuditService auditService;
@Transactional @Transactional
public void delete(long id) { public void delete(long id, String owner) {
appRepository.delete(id); appRepository.delete(id);
auditService.audit(App.class.getSimpleName(), id, Audit.OP.DELETE, owner);
} }
public List<App> findAll(Pageable pageable) { public List<App> findAll(Pageable pageable) {
...@@ -38,13 +44,23 @@ public class AppService { ...@@ -38,13 +44,23 @@ public class AppService {
@Transactional @Transactional
public App save(App entity) { public App save(App entity) {
return appRepository.save(entity); App app = appRepository.save(entity);
auditService.audit(App.class.getSimpleName(), app.getId(), Audit.OP.INSERT,
app.getDataChangeCreatedBy());
return app;
} }
@Transactional @Transactional
public App update(App app) { public App update(App app) {
App managedApp = appRepository.findByAppId(app.getAppId()); App managedApp = appRepository.findByAppId(app.getAppId());
BeanUtils.copyEntityProperties(app, managedApp); BeanUtils.copyEntityProperties(app, managedApp);
return appRepository.save(managedApp); managedApp = appRepository.save(managedApp);
auditService.audit(App.class.getSimpleName(), managedApp.getId(), Audit.OP.UPDATE,
managedApp.getDataChangeLastModifiedBy());
return managedApp;
} }
} }
package com.ctrip.apollo.biz.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.repository.AuditRepository;
@Service
public class AuditService {
@Autowired
private AuditRepository auditRepository;
List<Audit> findByOwner(String owner) {
return auditRepository.findByOwner(owner);
}
List<Audit> find(String owner, String entity, String op) {
return auditRepository.findAudits(owner, entity, op);
}
@Transactional
void audit(String entityName, Long entityId, Audit.OP op, String owner) {
Audit audit = new Audit();
audit.setEntityName(entityName);
audit.setEntityId(entityId);
audit.setOpName(op.name());
audit.setDataChangeCreatedBy(owner);
auditRepository.save(audit);
}
@Transactional
void audit(Audit audit){
auditRepository.save(audit);
}
}
...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Cluster; import com.ctrip.apollo.biz.entity.Cluster;
import com.ctrip.apollo.biz.repository.ClusterRepository; import com.ctrip.apollo.biz.repository.ClusterRepository;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
...@@ -14,18 +15,28 @@ public class ClusterService { ...@@ -14,18 +15,28 @@ public class ClusterService {
@Autowired @Autowired
private ClusterRepository clusterRepository; private ClusterRepository clusterRepository;
@Autowired
private AuditService auditService;
public Cluster findOne(String appId, String name) { public Cluster findOne(String appId, String name) {
return clusterRepository.findByAppIdAndName(appId, name); return clusterRepository.findByAppIdAndName(appId, name);
} }
@Transactional @Transactional
public Cluster save(Cluster entity) { public Cluster save(Cluster entity) {
return clusterRepository.save(entity); Cluster cluster = clusterRepository.save(entity);
auditService.audit(Cluster.class.getSimpleName(), cluster.getId(), Audit.OP.INSERT,
cluster.getDataChangeCreatedBy());
return cluster;
} }
@Transactional @Transactional
public void delete(long id) { public void delete(long id, String owner) {
clusterRepository.delete(id); clusterRepository.delete(id);
auditService.audit(Cluster.class.getSimpleName(), id, Audit.OP.DELETE, owner);
} }
@Transactional @Transactional
...@@ -33,6 +44,11 @@ public class ClusterService { ...@@ -33,6 +44,11 @@ public class ClusterService {
Cluster managedCluster = Cluster managedCluster =
clusterRepository.findByAppIdAndName(cluster.getAppId(), cluster.getName()); clusterRepository.findByAppIdAndName(cluster.getAppId(), cluster.getName());
BeanUtils.copyEntityProperties(cluster, managedCluster); BeanUtils.copyEntityProperties(cluster, managedCluster);
return clusterRepository.save(managedCluster); managedCluster = clusterRepository.save(managedCluster);
auditService.audit(Cluster.class.getSimpleName(), managedCluster.getId(), Audit.OP.UPDATE,
managedCluster.getDataChangeLastModifiedBy());
return managedCluster;
} }
} }
...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Item; import com.ctrip.apollo.biz.entity.Item;
import com.ctrip.apollo.biz.repository.ItemRepository; import com.ctrip.apollo.biz.repository.ItemRepository;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
...@@ -14,9 +15,14 @@ public class ItemService { ...@@ -14,9 +15,14 @@ public class ItemService {
@Autowired @Autowired
private ItemRepository itemRepository; private ItemRepository itemRepository;
@Autowired
private AuditService auditService;
@Transactional @Transactional
public void delete(long id) { public void delete(long id, String owner) {
itemRepository.delete(id); itemRepository.delete(id);
auditService.audit(Item.class.getSimpleName(), id, Audit.OP.DELETE, owner);
} }
public Item findOne(long itemId) { public Item findOne(long itemId) {
...@@ -25,15 +31,25 @@ public class ItemService { ...@@ -25,15 +31,25 @@ public class ItemService {
} }
@Transactional @Transactional
public Item save(Item item) { public Item save(Item entity) {
return itemRepository.save(item); Item item = itemRepository.save(entity);
auditService.audit(Item.class.getSimpleName(), item.getId(), Audit.OP.INSERT,
item.getDataChangeCreatedBy());
return item;
} }
@Transactional @Transactional
public Item update(Item item) { public Item update(Item item) {
Item managedItem = itemRepository.findOne(item.getId()); Item managedItem = itemRepository.findOne(item.getId());
BeanUtils.copyEntityProperties(item, managedItem); BeanUtils.copyEntityProperties(item, managedItem);
return itemRepository.save(managedItem); managedItem = itemRepository.save(managedItem);
auditService.audit(Item.class.getSimpleName(), managedItem.getId(), Audit.OP.UPDATE,
managedItem.getDataChangeLastModifiedBy());
return managedItem;
} }
} }
...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Item; import com.ctrip.apollo.biz.entity.Item;
import com.ctrip.apollo.biz.repository.ItemRepository; import com.ctrip.apollo.biz.repository.ItemRepository;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
...@@ -16,15 +17,19 @@ public class ItemSetService { ...@@ -16,15 +17,19 @@ public class ItemSetService {
@Autowired @Autowired
private ItemRepository itemRepository; private ItemRepository itemRepository;
@Autowired
private AuditService auditService;
@Transactional @Transactional
public void updateSet(ItemChangeSets changeSet) { public void updateSet(ItemChangeSets changeSet, String owner) {
if (changeSet.getCreateItems() != null) { if (changeSet.getCreateItems() != null) {
for (ItemDTO item : changeSet.getCreateItems()) { for (ItemDTO item : changeSet.getCreateItems()) {
Item entity = BeanUtils.transfrom(Item.class, item); Item entity = BeanUtils.transfrom(Item.class, item);
entity.setDataChangeCreatedBy(changeSet.getModifyBy()); entity.setDataChangeCreatedBy(owner);
entity.setDataChangeLastModifiedBy(changeSet.getModifyBy()); entity.setDataChangeLastModifiedBy(owner);
itemRepository.save(entity); itemRepository.save(entity);
} }
auditService.audit("ItemSet", null, Audit.OP.INSERT, owner);
} }
if (changeSet.getUpdateItems() != null) { if (changeSet.getUpdateItems() != null) {
...@@ -32,18 +37,20 @@ public class ItemSetService { ...@@ -32,18 +37,20 @@ public class ItemSetService {
Item entity = BeanUtils.transfrom(Item.class, item); Item entity = BeanUtils.transfrom(Item.class, item);
Item managedItem = itemRepository.findOne(entity.getId()); Item managedItem = itemRepository.findOne(entity.getId());
BeanUtils.copyEntityProperties(entity, managedItem); BeanUtils.copyEntityProperties(entity, managedItem);
managedItem.setDataChangeLastModifiedBy(changeSet.getModifyBy()); managedItem.setDataChangeLastModifiedBy(owner);
itemRepository.save(managedItem); itemRepository.save(managedItem);
} }
auditService.audit("ItemSet", null, Audit.OP.UPDATE, owner);
} }
if (changeSet.getDeleteItems() != null) { if (changeSet.getDeleteItems() != null) {
for (ItemDTO item : changeSet.getDeleteItems()) { for (ItemDTO item : changeSet.getDeleteItems()) {
Item entity = BeanUtils.transfrom(Item.class, item); Item entity = BeanUtils.transfrom(Item.class, item);
entity.setDataChangeLastModifiedBy(changeSet.getModifyBy()); entity.setDataChangeLastModifiedBy(owner);
itemRepository.save(entity); itemRepository.save(entity);
itemRepository.delete(item.getId()); itemRepository.delete(item.getId());
} }
auditService.audit("ItemSet", null, Audit.OP.DELETE, owner);
} }
} }
} }
...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Namespace; import com.ctrip.apollo.biz.entity.Namespace;
import com.ctrip.apollo.biz.repository.NamespaceRepository; import com.ctrip.apollo.biz.repository.NamespaceRepository;
import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.common.utils.BeanUtils;
...@@ -14,9 +15,14 @@ public class NamespaceService { ...@@ -14,9 +15,14 @@ public class NamespaceService {
@Autowired @Autowired
private NamespaceRepository namespaceRepository; private NamespaceRepository namespaceRepository;
@Autowired
private AuditService auditService;
@Transactional @Transactional
public void delete(long id) { public void delete(long id, String owner) {
namespaceRepository.delete(id); namespaceRepository.delete(id);
auditService.audit(Namespace.class.getSimpleName(), id, Audit.OP.DELETE, owner);
} }
public Namespace findOne(Long namespaceId) { public Namespace findOne(Long namespaceId) {
...@@ -30,7 +36,12 @@ public class NamespaceService { ...@@ -30,7 +36,12 @@ public class NamespaceService {
@Transactional @Transactional
public Namespace save(Namespace entity) { public Namespace save(Namespace entity) {
return namespaceRepository.save(entity); Namespace namespace = namespaceRepository.save(entity);
auditService.audit(Namespace.class.getSimpleName(), namespace.getId(), Audit.OP.INSERT,
namespace.getDataChangeCreatedBy());
return namespace;
} }
@Transactional @Transactional
...@@ -38,6 +49,11 @@ public class NamespaceService { ...@@ -38,6 +49,11 @@ public class NamespaceService {
Namespace managedNamespace = namespaceRepository.findByAppIdAndClusterNameAndNamespaceName( Namespace managedNamespace = namespaceRepository.findByAppIdAndClusterNameAndNamespaceName(
namespace.getAppId(), namespace.getClusterName(), namespace.getNamespaceName()); namespace.getAppId(), namespace.getClusterName(), namespace.getNamespaceName());
BeanUtils.copyEntityProperties(namespace, managedNamespace); BeanUtils.copyEntityProperties(namespace, managedNamespace);
return namespaceRepository.save(managedNamespace); managedNamespace = namespaceRepository.save(managedNamespace);
auditService.audit(Namespace.class.getSimpleName(), managedNamespace.getId(), Audit.OP.UPDATE,
managedNamespace.getDataChangeLastModifiedBy());
return managedNamespace;
} }
} }
package com.ctrip.apollo.biz.service; package com.ctrip.apollo.biz.service;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Privilege; import com.ctrip.apollo.biz.entity.Privilege;
import com.ctrip.apollo.biz.repository.PrivilegeRepository; import com.ctrip.apollo.biz.repository.PrivilegeRepository;
...@@ -19,6 +20,9 @@ public class PrivilegeService { ...@@ -19,6 +20,9 @@ public class PrivilegeService {
@Autowired @Autowired
private PrivilegeRepository privilRepo; private PrivilegeRepository privilRepo;
@Autowired
private AuditService auditService;
@Transactional @Transactional
public Privilege addPrivilege(long namespaceId, String name, PrivilType privilType) { public Privilege addPrivilege(long namespaceId, String name, PrivilType privilType) {
Privilege privil = Privilege privil =
...@@ -29,6 +33,8 @@ public class PrivilegeService { ...@@ -29,6 +33,8 @@ public class PrivilegeService {
privil.setPrivilType(privilType.name()); privil.setPrivilType(privilType.name());
privil.setName(name); privil.setName(name);
privilRepo.save(privil); privilRepo.save(privil);
auditService.audit(Privilege.class.getSimpleName(), privil.getId(), Audit.OP.INSERT, name);
} }
return privil; return privil;
} }
...@@ -47,6 +53,10 @@ public class PrivilegeService { ...@@ -47,6 +53,10 @@ public class PrivilegeService {
public void removePrivilege(long namespaceId, String name, PrivilType privilType) { public void removePrivilege(long namespaceId, String name, PrivilType privilType) {
Privilege privil = Privilege privil =
privilRepo.findByNamespaceIdAndNameAndPrivilType(namespaceId, name, privilType.name()); privilRepo.findByNamespaceIdAndNameAndPrivilType(namespaceId, name, privilType.name());
if (privil != null) privilRepo.delete(privil); if (privil != null) {
privilRepo.delete(privil);
auditService.audit(Privilege.class.getSimpleName(), privil.getId(), Audit.OP.DELETE, name);
}
} }
} }
...@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Item; import com.ctrip.apollo.biz.entity.Item;
import com.ctrip.apollo.biz.entity.Namespace; import com.ctrip.apollo.biz.entity.Namespace;
import com.ctrip.apollo.biz.entity.Release; import com.ctrip.apollo.biz.entity.Release;
...@@ -34,6 +35,9 @@ public class ReleaseService { ...@@ -34,6 +35,9 @@ public class ReleaseService {
@Autowired @Autowired
private ItemRepository itemRepository; private ItemRepository itemRepository;
@Autowired
private AuditService auditService;
private Gson gson = new Gson(); private Gson gson = new Gson();
public Release findOne(long releaseId) { public Release findOne(long releaseId) {
...@@ -43,7 +47,7 @@ public class ReleaseService { ...@@ -43,7 +47,7 @@ public class ReleaseService {
@Transactional @Transactional
public Release buildRelease(String name, String comment, String appId, String clusterName, public Release buildRelease(String name, String comment, String appId, String clusterName,
String namespaceName) { String namespaceName, String owner) {
Namespace namespace = namespaceRepository.findByAppIdAndClusterNameAndNamespaceName(appId, Namespace namespace = namespaceRepository.findByAppIdAndClusterNameAndNamespaceName(appId,
clusterName, namespaceName); clusterName, namespaceName);
if (namespace == null) { if (namespace == null) {
...@@ -61,15 +65,19 @@ public class ReleaseService { ...@@ -61,15 +65,19 @@ public class ReleaseService {
Release release = new Release(); Release release = new Release();
release.setDataChangeCreatedTime(new Date()); release.setDataChangeCreatedTime(new Date());
release.setDataChangeCreatedBy(name); release.setDataChangeCreatedBy(owner);
release.setDataChangeLastModifiedBy(name);
release.setName(name); release.setName(name);
release.setComment(comment); release.setComment(comment);
release.setAppId(appId); release.setAppId(appId);
release.setClusterName(clusterName); release.setClusterName(clusterName);
release.setNamespaceName(namespaceName); release.setNamespaceName(namespaceName);
release.setConfigurations(gson.toJson(configurations)); release.setConfigurations(gson.toJson(configurations));
return releaseRepository.save(release); release = releaseRepository.save(release);
auditService.audit(Release.class.getSimpleName(), release.getId(), Audit.OP.INSERT,
release.getDataChangeCreatedBy());
return release;
} }
} }
...@@ -14,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -14,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional;
import com.ctrip.apollo.biz.BizTestConfiguration; import com.ctrip.apollo.biz.BizTestConfiguration;
import com.ctrip.apollo.biz.entity.App; import com.ctrip.apollo.biz.entity.App;
import com.ctrip.apollo.biz.entity.Audit;
import com.ctrip.apollo.biz.entity.Cluster; import com.ctrip.apollo.biz.entity.Cluster;
import com.ctrip.apollo.biz.entity.Namespace; import com.ctrip.apollo.biz.entity.Namespace;
...@@ -29,6 +30,9 @@ public class AdminServiceTest { ...@@ -29,6 +30,9 @@ public class AdminServiceTest {
@Autowired @Autowired
private ViewService viewService; private ViewService viewService;
@Autowired
private AuditService auditService;
@Test @Test
public void testCreateNewApp() { public void testCreateNewApp() {
String appId = "someAppId"; String appId = "someAppId";
...@@ -52,6 +56,9 @@ public class AdminServiceTest { ...@@ -52,6 +56,9 @@ public class AdminServiceTest {
List<Namespace> namespaces = viewService.findNamespaces(appId, clusters.get(0).getName()); List<Namespace> namespaces = viewService.findNamespaces(appId, clusters.get(0).getName());
Assert.assertEquals(1, namespaces.size()); Assert.assertEquals(1, namespaces.size());
Assert.assertEquals("application", namespaces.get(0).getNamespaceName()); Assert.assertEquals("application", namespaces.get(0).getNamespaceName());
List<Audit> audits = auditService.findByOwner(owner);
Assert.assertEquals(4, audits.size());
} }
} }
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId> <artifactId>spring-boot-starter-actuator</artifactId>
......
package com.ctrip.apollo.common.controller;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@Target({ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@AuthenticationPrincipal
public @interface ActiveUser {
}
...@@ -15,11 +15,11 @@ public class WebMvcConfig extends WebMvcConfigurerAdapter { ...@@ -15,11 +15,11 @@ public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override @Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
PageableHandlerMethodArgumentResolver pageResolver =
new PageableHandlerMethodArgumentResolver();
pageResolver.setFallbackPageable(new PageRequest(0, 10));
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); argumentResolvers.add(pageResolver);
resolver.setFallbackPageable(new PageRequest(0, 10));
argumentResolvers.add(resolver);
} }
@Override @Override
......
package com.ctrip.apollo.common.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic();
http.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("").roles("USER").and()
.withUser("apollo").password("").roles("USER", "ADMIN");
}
}
...@@ -8,7 +8,6 @@ import java.util.List; ...@@ -8,7 +8,6 @@ import java.util.List;
*/ */
public class ItemChangeSets { public class ItemChangeSets {
private String modifyBy;
private List<ItemDTO> createItems = new LinkedList<>(); private List<ItemDTO> createItems = new LinkedList<>();
private List<ItemDTO> updateItems = new LinkedList<>(); private List<ItemDTO> updateItems = new LinkedList<>();
private List<ItemDTO> deleteItems = new LinkedList<>(); private List<ItemDTO> deleteItems = new LinkedList<>();
...@@ -49,12 +48,4 @@ public class ItemChangeSets { ...@@ -49,12 +48,4 @@ public class ItemChangeSets {
this.deleteItems = deleteItems; this.deleteItems = deleteItems;
} }
public String getModifyBy() {
return modifyBy;
}
public void setModifyBy(String modifyBy) {
this.modifyBy = modifyBy;
}
} }
...@@ -147,7 +147,6 @@ public class ConfigService { ...@@ -147,7 +147,6 @@ public class ConfigService {
ItemChangeSets changeSets = resolver.resolve(namespaceId, configText, ItemChangeSets changeSets = resolver.resolve(namespaceId, configText,
itemAPI.findItems(appId, env, clusterName, namespaceName)); itemAPI.findItems(appId, env, clusterName, namespaceName));
try { try {
changeSets.setModifyBy(model.getModifyBy());
enrichChangeSetBaseInfo(changeSets); enrichChangeSetBaseInfo(changeSets);
itemAPI.updateItems(appId, env, clusterName, namespaceName, changeSets); itemAPI.updateItems(appId, env, clusterName, namespaceName, changeSets);
} catch (Exception e) { } catch (Exception e) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment