From c007f0ca1785db093d48f4846cda82fe8e955765 Mon Sep 17 00:00:00 2001
From: kimi <kimi42345@gmail.com>
Date: 星期三, 27 五月 2020 09:59:29 +0800
Subject: [PATCH] merage

---
 src/main/java/com/highdatas/mdm/controller/SysViewController.java |  246 +++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 197 insertions(+), 49 deletions(-)

diff --git a/src/main/java/com/highdatas/mdm/controller/SysViewController.java b/src/main/java/com/highdatas/mdm/controller/SysViewController.java
index 9797310..c606a77 100644
--- a/src/main/java/com/highdatas/mdm/controller/SysViewController.java
+++ b/src/main/java/com/highdatas/mdm/controller/SysViewController.java
@@ -1,18 +1,15 @@
 package com.highdatas.mdm.controller;
 
 
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.highdatas.mdm.entity.*;
 import com.highdatas.mdm.mapper.TableInfoMapper;
-import com.highdatas.mdm.mapper.UserMapper;
 import com.highdatas.mdm.pojo.CodeMsg;
 import com.highdatas.mdm.pojo.Result;
 import com.highdatas.mdm.pojo.ViewMapFieldItem;
 import com.highdatas.mdm.service.*;
-import com.highdatas.mdm.util.AESUtil;
 import com.highdatas.mdm.util.Constant;
 import com.highdatas.mdm.util.DbUtils;
 import lombok.SneakyThrows;
@@ -29,7 +26,7 @@
  * <p>
  *  鍓嶇鎺у埗鍣�
  * </p>
- *
+ * @desctiption 瑙嗗浘鎺ュ彛
  * @author kimi
  * @since 2020-04-15
  */
@@ -45,8 +42,6 @@
     @Autowired
     ISysMenuService menuService;
     @Autowired
-    UserMapper mapper;
-    @Autowired
     IMasterAuthorService masterAuthorService;
     @Autowired
     MasterDataService masterDataService;
@@ -59,51 +54,37 @@
     @Autowired
     ISysViewLogicmapService logicmapService;
 
-    @SneakyThrows
-    @RequestMapping(value = "/test",  method = RequestMethod.GET)
-    public Result test(HttpServletRequest request) throws Exception {
-        List<Map<String, Object>> test = mapper.test();
-        String keys = "ismytestkeys";
-        byte[] secretKey = AESUtil.getSecretKey(keys);
-        String content = JSONArray.toJSONString(test);
-        long start = System.currentTimeMillis();
-        byte[] bytes = content.getBytes("utf-8");
-        int length = bytes.length;
-        System.out.println(length  + "K");
-        String s = AESUtil.aesPKCS7PaddingEncrypt(content, secretKey.toString());
-        long end = System.currentTimeMillis();
-        float time = (end - start) ;
-        System.out.println(time + "s");
-        return Result.success(s);
-    }
-
-    @RequestMapping(value = "/test1",  method = RequestMethod.GET)
-    public Result test1(HttpServletRequest request) throws InterruptedException {
-        Thread.sleep(3000);
-        return Result.success(null);
-    }
-
+    /**
+     *
+     * @description:  By鐢ㄦ埛鑾峰彇瑙嗗浘list
+     * @param userId  鐢ㄦ埛id
+     * @return: 瑙嗗浘list
+     *
+     */
     @RequestMapping(value = "/all/{userId}",  method = RequestMethod.GET)
     public Result getAll(@PathVariable String userId, HttpServletRequest request) {
-        //TODO
+        //ByuserId 鑾峰彇瑙嗗浘鍒楄〃
         Wrapper<SysView> eq = new EntityWrapper<SysView>().eq(Constant.USERID, userId);
         List<SysView> records = viewService.selectList(eq);
         for (SysView record : records) {
             String id = record.getId();
-            String baseMaintainStr = record.getBaseMaintain();
-
             Maintain baseMaintain = viewService.getBaseMaintain(record);
+            //鏍¢獙鍩哄噯鐗堟湰鏄惁瀛樺湪
             if (baseMaintain == null) {
                 continue;
             }
+            //鑾峰彇 鐗堟湰鍙凤紝琛ㄥ悕杩斿洖鍓嶇
             record.setBaseTableName(baseMaintain.getTableName());
             record.setBaseVersion(baseMaintain.getVersion());
             String menuId = record.getMenuId();
             SysMenu sysMenu = menuService.selectById(menuId);
+            //鏍¢獙涓婚鏄惁瀛樺湪
             if (sysMenu == null) {
                 continue;
             }
+            //鑾峰彇涓婚鍚嶇О杩斿洖鍓嶇
             record.setMenuName(sysMenu.getName());
+            //鑾峰彇鍏宠仈涓婚
             List<SysViewJoin> sysViewJoins = sysViewJoinService.selectList(new EntityWrapper<SysViewJoin>().eq(Constant.PARENT_ID, id));
             List<String> menuIds = sysViewJoins.stream()
                     .map(sysViewJoin -> sysViewJoin.getMenuId())
@@ -112,6 +93,7 @@
                 List<SysMenu> sysMenus = menuService.selectBatchIds(menuIds);
                 Collections.reverse(sysMenus);
                 String subMenuName = sysMenus.stream().map(subMenu -> subMenu.getName()).collect(Collectors.joining(Constant.SEMICOLON));
+                //鑾峰彇鍏宠仈涓婚鐨勫悕绉扮粍鍚堝悗杩斿洖缁欏墠绔�
                 record.setSubMenuName(subMenuName);
             }
 
@@ -119,32 +101,61 @@
         return Result.success(records);
     }
 
+    /**
+     *
+     * @description:  鏇存柊瑙嗗浘鏁版嵁
+     * @param id 瑙嗗浘id
+     * @return: 鏄惁鏇存柊鎴愬姛
+     *
+     */
     @RequestMapping(value = "/refreshData/{id}",  method = RequestMethod.GET)
     public Result createView(@RequestParam String id, @RequestParam Boolean active) {
+        //鑾峰彇瑙嗗浘淇℃伅
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
+        //浠庢柊鍒涘缓瑙嗗浘
         viewService.createView(sysView.getId());
         return Result.success(sysView);
     }
 
+    /**
+     *
+     * @description:  淇濆瓨鍏宠仈瀛楁淇℃伅
+     * @param id 瑙嗗浘id
+     * @param mapField 鍏宠仈瀛楁
+     * @return: 鏄惁淇濆瓨鎴愬姛
+     *
+     */
     @RequestMapping(value = "/saveMapField/{id}",  method = RequestMethod.GET)
     public Result saveMapField(@RequestParam String id, @RequestParam String mapField) {
+        //鑾峰彇瑙嗗浘淇℃伅
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
+        //淇濆瓨鍏宠仈瀛楁
         sysView.setMappingField(mapField).updateById();
         return Result.success(sysView);
     }
 
+    /**
+     *
+     * @description:  鍒涘缓瑙嗗浘
+     * @param id 瑙嗗浘id
+     * @return: 鏄惁鍒涘缓鎴愬姛
+     *
+     */
+
     @RequestMapping(value = "/createView/{id}",  method = RequestMethod.GET)
     public Result createView(@PathVariable String id) {
+        //鑾峰彇瑙嗗浘淇℃伅
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
+        //鍒涘缓瑙嗗浘
         boolean view = viewService.createView(sysView.getId());
         if (view) {
             return Result.success(null);
@@ -154,20 +165,39 @@
 
     }
 
-
+    /**
+     *
+     * @description:  鏇存柊瑙嗗浘婵�娲荤姸鎬�
+     * @param id 瑙嗗浘id
+     * @return: 鏄惁鏇存柊鎴愬姛
+     *
+     */
     @RequestMapping(value = "/active/{id}",  method = RequestMethod.GET)
     public Result active(@PathVariable String id, @RequestParam Boolean active) {
+        //鑾峰彇瑙嗗浘淇℃伅
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
+        //鏇存柊婵�娲荤姸鎬�
         sysView.setActive(active).updateById();
         return Result.success(sysView);
     }
 
+    /**
+     *
+     * @description:  鑾峰彇瑙嗗浘鏁版嵁
+     * @param id 瑙嗗浘id
+     * @param pageNo 椤垫暟
+     * @return: 瑙嗗浘鏈悗鎹�
+     *
+     */
+
     @RequestMapping(value = "/getViewData/{id}/page/{pageNo}",  method = RequestMethod.GET)
     public Result getViewData(@PathVariable String id, @PathVariable Integer pageNo, HttpServletRequest request) {
+        //pageSize 锛屾瘡椤垫暟鎹噺
         String pageSizeStr = request.getParameter("pageSize");
+        //鑾峰彇瑙嗗浘鏁版嵁
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
@@ -176,13 +206,22 @@
         if (!StringUtils.isEmpty(pageSizeStr)) {
             pageSize = Integer.valueOf(pageSizeStr);
         }
-
+        //鍒嗛〉鑾峰彇瑙嗗浘鏁版嵁
         return viewService.getViewData(sysView, pageNo, pageSize);
 
     }
 
+    /**
+     *
+     * @description:  鑾峰彇瑙嗗浘涓�瀵逛竴杞崲鐨刴ap鏁版嵁
+     * @param id 瑙嗗浘id
+     * @param pageNo 椤垫暟
+     * @return: map鏁版嵁
+     *
+     */
     @RequestMapping(value = "/getMapData/{id}/page/{pageNo}",  method = RequestMethod.GET)
     public Result getMapData(@PathVariable String id, @PathVariable Integer pageNo, @RequestParam String changedField, HttpServletRequest request) {
+        //pageSize 姣忛〉鏁版嵁
         String pageSizeStr = request.getParameter("pageSize");
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
@@ -192,25 +231,47 @@
         if (!StringUtils.isEmpty(pageSizeStr)) {
             pageSize = Integer.valueOf(pageSizeStr);
         }
+        //鑾峰彇maping鐨勬暟鎹�
         return viewService.getMapData(sysView, changedField, pageNo, pageSize);
 
     }
 
+    /**
+     *
+     * @description:  閫氳繃鐢ㄦ埛鑾峰彇鏈夋潈闄愮殑瀛楁
+     * @param userId 鐢ㄦ埛id
+     * @param needUpdate 鏄惁闇�瑕佷粠鏂拌幏鍙栦竴閬嶆暟鎹�
+     * @param maintainId 鐗堟湰id
+     * @return: 瀛楁鍒楄〃
+     *
+     */
+
     @RequestMapping(value = "/field/{userId}", method = RequestMethod.GET)
     public Result<List<SysField>> fieldList(@PathVariable String userId, @RequestParam boolean needUpdate,  @RequestParam String maintainId, HttpServletRequest request) {
+        //璇锋眰澶撮噷鑾峰彇鐢ㄦ埛淇℃伅
         TUser user = DbUtils.getUserById(userId);
         if (user == null) {
             return Result.error(CodeMsg.USER_NOT_MATHED);
         }
+
         if (needUpdate) {
+            //浠庢柊鑾峰彇涓�閬嶆渶鏂扮殑鐗堟湰瀛楁
             Maintain nowVersion = maintainService.getNowVersion(maintainId);
             List<SysField> field = masterAuthorService.getField(user, nowVersion.getId());
             return Result.success(field) ;
         }
+        //鏍规嵁鏉冮檺鑾峰彇瀛楁
         List<SysField> field = masterAuthorService.getField(user, maintainId);
         return Result.success(field) ;
     }
 
+    /**
+     *
+     * @description:  鑾峰彇瑙嗗浘涓�瀵逛竴杞崲鐨刴ap鏁版嵁
+     * @param id 瑙嗗浘id
+     * @return: map鏁版嵁
+     *
+     */
     @RequestMapping(value = "/mapFieldList/{id}",  method = RequestMethod.GET)
     public Result active(@PathVariable String id) {
         SysView sysView = viewService.selectById(id);
@@ -222,6 +283,13 @@
         return Result.success(mapField);
     }
 
+    /**
+     *
+     * @description:  鑾峰彇瑙嗗浘鏁版嵁
+     * @param id 瑙嗗浘id
+     * @return: 瑙嗗浘鏁版嵁
+     *
+     */
     @RequestMapping(value = "/get/{id}",  method = RequestMethod.GET)
     public Result get(@PathVariable String id) {
         SysView sysView = viewService.selectById(id);
@@ -229,6 +297,7 @@
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
         String menuId = sysView.getMenuId();
+        //鑾峰彇涓婚鐨勭埗绾т富棰橀摼
         LinkedHashSet<String> parentIdSet = new LinkedHashSet<>();
         parentIdSet.add(menuId);
         LinkedHashSet<String> byParentId = menuService.getByParentId(parentIdSet);
@@ -236,8 +305,10 @@
         Collections.reverse(strings);
         String collect = strings.stream().collect(Collectors.joining(Constant.SEMICOLON));
         sysView.setMenuName(collect);
+        //鑾峰彇鍏宠仈涓婚
         List<SysViewJoin> sysViewJoins = sysViewJoinService.selectList(new EntityWrapper<SysViewJoin>().eq(Constant.PARENT_ID, id));
         for (SysViewJoin sysViewJoin : sysViewJoins) {
+            //鑾峰彇鍏宠仈涓婚鐨勭埗绾т富棰橀摼
             parentIdSet.clear();
             parentIdSet.add(sysViewJoin.getMenuId());
             LinkedHashSet<String> subParent = menuService.getByParentId(parentIdSet);
@@ -252,17 +323,27 @@
         sysView.setLogicmapList(sysViewLogicmaps);
         return Result.success(sysView);
     }
-
+    /**
+     *
+     * @description:  鑾峰彇鍙敤瑙嗗浘
+     * @param userId 鐢ㄦ埛id
+     * @return: 瑙嗗浘鏁�
+     *
+     */
     @RequestMapping(value = "/getCnt/{userId}",  method = RequestMethod.GET)
     public Result cnt(@PathVariable String userId, HttpServletRequest request) {
+        //鑾峰彇鐢ㄦ埛淇℃伅
         TUser user = DbUtils.getUserById(userId);
         if (user == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
         Wrapper<SysView> userWrapper = new EntityWrapper<SysView>().eq("user_id", userId);
+        //鑾峰彇瑙嗗浘鎬绘暟
         int totalCnt = viewService.selectCount(userWrapper);
+        //鍙敤瑙嗗浘鏁�
         userWrapper.eq("active", true);
         int activeCnt = viewService.selectCount(userWrapper);
+        //宸叉敞鍐岃鍥炬暟
         userWrapper.eq("subscribe", true);
         int subscribeCnt = viewService.selectCount(userWrapper);
         JSONObject object = new JSONObject();
@@ -272,37 +353,62 @@
         return Result.success(object);
     }
 
-
+    /**
+     *
+     * @description:  鍒涘缓瑙嗗浘
+     * @param userId 鐢ㄦ埛id
+     * @return: 瑙嗗浘鏁版嵁
+     *
+     */
     @RequestMapping(value = "/create/{userId}",  method = RequestMethod.GET)
     public Result add(@PathVariable String userId, HttpServletRequest request) {
         SysView sysView = new SysView();
+        //璁剧疆瑙嗗浘鍒濆鏁版嵁
         sysView.setId(DbUtils.getUUID())
                 .setUserId(userId)
                 .setCreateTime(new Date())
                 .setStatus(ViewStatus.edit)
                 .setEmptyData(true)
                 .insert();
+        //鐢熸垚骞朵繚瀛榤apping琛� 琛ㄥ悕
         viewService.getMappingTableName(sysView);
         return Result.success(sysView);
     }
 
+    /**
+     *
+     * @description:  鍒犻櫎涓�瀵逛竴mapping
+     * @param id 瑙嗗浘id
+     * @return: map鏁版嵁
+     *
+     */
     @SneakyThrows
     @RequestMapping(value = "/deleteMap/{id}",  method = RequestMethod.GET)
     public Result deleteMap(@PathVariable String id, @RequestParam String changedField) {
+        //鑾峰彇瑙嗗浘鏁版嵁
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
-
+        //鍒犻櫎mapping瀛楁
         viewService.deleteMapField(sysView, changedField);
         logicmapService.delete(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, id).eq(Constant.FIELD, changedField));
         List<SysViewLogicmap> sysViewLogicmaps = logicmapService.selectList(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, sysView.getId()));
         sysView.setLogicmapList(sysViewLogicmaps);
         return Result.success(sysView);
     }
+    /**
+     *
+     * @description:  鍒犻櫎鍏宠仈涓婚鏁版嵁
+     * @param id 瑙嗗浘鍏宠仈涓婚id
+     * @return: 鏄惁鍒犻櫎鎴愬姛
+     *
+     */
+
     @SneakyThrows
     @RequestMapping(value = "/delete/detail/{id}",  method = RequestMethod.GET)
     public Result deleteDetail(@PathVariable String id) {
+        //鑾峰彇鍏宠仈涓婚鏁版嵁
         SysViewJoin sysViewJoin = sysViewJoinService.selectById(id);
         if (sysViewJoin == null) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
@@ -310,18 +416,21 @@
         String parentId = sysViewJoin.getParentId();
         SysView sysView = viewService.selectById(parentId);
         String userId = sysView.getUserId();
+        //鑾峰彇鐢ㄦ埛淇℃伅
         TUser user = DbUtils.getUserById(userId);
 
+        //鑾峰彇鍏宠仈涓婚淇℃伅
         Maintain joinMaintain = viewService.getJoinMaintain(sysViewJoin);
         List<String> subFieldList = viewService.getSubFieldList(sysViewJoin, user);
         boolean delete = false;
 
         for (String subField: subFieldList) {
             String changeFieldName = viewService.changeFieldName(joinMaintain.getTableName(), subField);
-            logicService.delete(new EntityWrapper<SysViewLogic>()
+            logicmapService.delete(new EntityWrapper<SysViewLogicmap>()
                     .eq(Constant.PARENT_ID, sysView.getId())
                     .eq(Constant.FIELD, changeFieldName)
             );
+            //鍒犻櫎1瀵�1mapping 琛ㄥ唴鏁版嵁
             delete = viewService.deleteMapField(sysView, changeFieldName);
         }
         if (delete) {
@@ -330,7 +439,13 @@
             return  Result.error(CodeMsg.DELETE_ERROR);
         }
     }
-
+    /**
+     *
+     * @description:  鍒犻櫎瑙嗗浘
+     * @param id 瑙嗗浘id
+     * @return: 鏄惁鍒犻櫎
+     *
+     */
 
     @SneakyThrows
     @RequestMapping(value = "/delete/{id}",  method = RequestMethod.GET)
@@ -338,16 +453,27 @@
         return viewService.deleteView(id);
     }
 
+    /**
+     *
+     * @description:  閫氳繃鐢ㄦ埛鑾峰彇鏌愪富棰樹笅鐨勭増鏈唱椋�
+     * @param userId 鐢ㄦ埛id
+     * @param menuId 涓婚
+     * @return: map鏁版嵁
+     *
+     */
     @RequestMapping(value = "/maintainList/{userId}", method = RequestMethod.GET)
     public Result add(@PathVariable String userId, @RequestParam String menuId, HttpServletRequest request) {
+        //鑾峰彇鐢ㄦ埛淇℃伅
         TUser user = DbUtils.getUserById(userId);
         if (user == null) {
             return Result.error(CodeMsg.USER_NOT_MATHED);
         }
+        //鑾峰彇琛ㄥ悕
         String tableNameByMenu = menuMappingService.getTableNameByMenu(menuId);
         if (StringUtils.isEmpty(tableNameByMenu)) {
             return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
         }
+        //鑾峰彇鐗堟湰list
         LinkedHashSet<Maintain> maintainSet = masterAuthorService.getMaintainSet(tableNameByMenu, user);
         ArrayList<Maintain> maintains = new ArrayList<>(maintainSet);
         for (Maintain maintain : maintains) {
@@ -360,24 +486,35 @@
         maintains.add(0, max);
         return Result.success(maintains);
     }
-
+    /**
+     *
+     * @description: 鏇存柊瑙嗗浘
+     * @return: 瑙嗗浘鏁版嵁
+     *
+     */
     @RequestMapping(value = "/update",  method = RequestMethod.POST)
     public Result add(@RequestBody SysView view) {
+        //鏍¢獙蹇呬紶瀛楁
         if (StringUtils.isEmpty(view.getId())) {
             return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
         }
         if (StringUtils.isEmpty(view.getMenuId()) || StringUtils.isEmpty(view.getBaseMaintain()) ) {
             return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
         }
-        List<SysViewLogicmap> logicmapList = view.getLogicmapList();
-
-        logicmapService.delete(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, view.getId()));
-
-        for (SysViewLogicmap logicmap : logicmapList) {
-            logicmap.setId(DbUtils.getUUID()).setParentId(view.getId()).insert();
+        if (StringUtils.isEmpty(view.getViewTableName())) {
+            viewService.getViewTableName(view);
         }
+        List<SysViewLogicmap> logicmapList = view.getLogicmapList();
+        //delete 涔嬪墠鍏宠仈鐨勯�昏緫杞崲 鏁版嵁
+        logicmapService.delete(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, view.getId()));
+        if (logicmapList != null) {
+            for (SysViewLogicmap logicmap : logicmapList) {
+                logicmap.setId(DbUtils.getUUID()).setParentId(view.getId()).insert();
+            }
+        }
+
         view.setEmptyData(false).setStatus(ViewStatus.edit);
-        //delete
+        //delete 涔嬪墠鍏宠仈涓婚鏁版嵁
         sysViewJoinService.delete(new EntityWrapper<SysViewJoin>().eq(Constant.PARENT_ID, view.getId()));
 
         List<SysViewJoin> viewJoinList = view.getViewJoinList();
@@ -392,19 +529,30 @@
         view.updateById();
         return Result.success(view);
     }
+    /**
+     *
+     * @description:  涓嬭浇瑙嗗浘涓�瀵逛竴杞崲鐨刴ap鏁版嵁
+     * @param id 瑙嗗浘id
+     * @param menuId 涓婚id
+     * @param field 瀛楁
+     * @return: map鏁版嵁
+     *
+     */
     @SneakyThrows
     @RequestMapping(value = "/download/{id}",  method = RequestMethod.GET)
     public void download(@PathVariable String id,  @RequestParam String menuId, @RequestParam String field, HttpServletResponse response) {
-
+        //鑾峰彇瑙嗗浘淇℃伅
         SysView sysView = viewService.selectById(id);
         if (sysView == null) {
             return;
         }
         String userId = sysView.getUserId();
+        //鑾峰彇鐢ㄦ埛淇℃伅
         TUser user = DbUtils.getUserById(userId);
         if (user == null) {
             return;
         }
+        //涓嬭浇鏌愪釜涓婚涓嬬殑瀛楁鍏宠仈鐨�1瀵�1 mapping鏁版嵁
         viewService.downlodMap(sysView,user, response, field, menuId);
     }
 }

--
Gitblit v1.8.0