1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| @Transactional(rollbackFor = Exception.class) @Override public void updateShortLink(ShortLinkUpdateReqDTO requestParam) { verificationWhitelist(requestParam.getOriginUrl()); LambdaQueryWrapper<ShortLinkDO> queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class) .eq(ShortLinkDO::getGid, requestParam.getOriginGid()) .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl()) .eq(ShortLinkDO::getDelFlag, 0) .eq(ShortLinkDO::getEnableStatus, 0); ShortLinkDO hasShortLinkDO = baseMapper.selectOne(queryWrapper); if (hasShortLinkDO == null) { throw new ClientException("短链接记录不存在"); } if (Objects.equals(hasShortLinkDO.getGid(), requestParam.getGid())) { LambdaUpdateWrapper<ShortLinkDO> updateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class) .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl()) .eq(ShortLinkDO::getGid, requestParam.getGid()) .eq(ShortLinkDO::getDelFlag, 0) .eq(ShortLinkDO::getEnableStatus, 0) .set(Objects.equals(requestParam.getValidDateType(), VailDateTypeEnum.PERMANENT.getType()), ShortLinkDO::getValidDate, null); ShortLinkDO shortLinkDO = ShortLinkDO.builder() .domain(hasShortLinkDO.getDomain()) .shortUri(hasShortLinkDO.getShortUri()) .favicon(Objects.equals(requestParam.getOriginUrl(), hasShortLinkDO.getOriginUrl()) ? hasShortLinkDO.getFavicon() : getFavicon(requestParam.getOriginUrl())) .createdType(hasShortLinkDO.getCreatedType()) .gid(requestParam.getGid()) .originUrl(requestParam.getOriginUrl()) .describe(requestParam.getDescribe()) .validDateType(requestParam.getValidDateType()) .validDate(requestParam.getValidDate()) .build(); baseMapper.update(shortLinkDO, updateWrapper); } else { RReadWriteLock readWriteLock = redissonClient.getReadWriteLock(String.format(LOCK_GID_UPDATE_KEY, requestParam.getFullShortUrl())); RLock rLock = readWriteLock.writeLock(); rLock.lock(); try { LambdaUpdateWrapper<ShortLinkDO> linkUpdateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class) .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl()) .eq(ShortLinkDO::getGid, hasShortLinkDO.getGid()) .eq(ShortLinkDO::getDelFlag, 0) .eq(ShortLinkDO::getDelTime, 0L) .eq(ShortLinkDO::getEnableStatus, 0); ShortLinkDO delShortLinkDO = ShortLinkDO.builder() .delTime(System.currentTimeMillis()) .build(); delShortLinkDO.setDelFlag(1); baseMapper.update(delShortLinkDO, linkUpdateWrapper); ShortLinkDO shortLinkDO = ShortLinkDO.builder() .domain(createShortLinkDefaultDomain) .originUrl(requestParam.getOriginUrl()) .gid(requestParam.getGid()) .createdType(hasShortLinkDO.getCreatedType()) .validDateType(requestParam.getValidDateType()) .validDate(requestParam.getValidDate()) .describe(requestParam.getDescribe()) .shortUri(hasShortLinkDO.getShortUri()) .enableStatus(hasShortLinkDO.getEnableStatus()) .totalPv(hasShortLinkDO.getTotalPv()) .totalUv(hasShortLinkDO.getTotalUv()) .totalUip(hasShortLinkDO.getTotalUip()) .fullShortUrl(hasShortLinkDO.getFullShortUrl()) .favicon(Objects.equals(requestParam.getOriginUrl(), hasShortLinkDO.getOriginUrl()) ? hasShortLinkDO.getFavicon() : getFavicon(requestParam.getOriginUrl())) .delTime(0L) .build(); baseMapper.insert(shortLinkDO); LambdaQueryWrapper<ShortLinkGotoDO> linkGotoQueryWrapper = Wrappers.lambdaQuery(ShortLinkGotoDO.class) .eq(ShortLinkGotoDO::getFullShortUrl, requestParam.getFullShortUrl()) .eq(ShortLinkGotoDO::getGid, hasShortLinkDO.getGid()); ShortLinkGotoDO shortLinkGotoDO = shortLinkGotoMapper.selectOne(linkGotoQueryWrapper); shortLinkGotoMapper.delete(linkGotoQueryWrapper); shortLinkGotoDO.setGid(requestParam.getGid()); shortLinkGotoMapper.insert(shortLinkGotoDO); } finally { rLock.unlock(); } } if (!Objects.equals(hasShortLinkDO.getValidDateType(), requestParam.getValidDateType()) || !Objects.equals(hasShortLinkDO.getValidDate(), requestParam.getValidDate()) || !Objects.equals(hasShortLinkDO.getOriginUrl(), requestParam.getOriginUrl())) { stringRedisTemplate.delete(String.format(GOTO_SHORT_LINK_KEY, requestParam.getFullShortUrl())); Date currentDate = new Date(); if (hasShortLinkDO.getValidDate() != null && hasShortLinkDO.getValidDate().before(currentDate)) { if (Objects.equals(requestParam.getValidDateType(), VailDateTypeEnum.PERMANENT.getType()) || requestParam.getValidDate().after(currentDate)) { stringRedisTemplate.delete(String.format(GOTO_IS_NULL_SHORT_LINK_KEY, requestParam.getFullShortUrl())); } } } }
|