diff --git a/pom.xml b/pom.xml index 1fa71fd..fd90308 100644 --- a/pom.xml +++ b/pom.xml @@ -128,6 +128,7 @@ 1.0.10 + diff --git a/src/main/java/com/baiyee/adcallback/api/callback/TripartitePartyCallbackApi.java b/src/main/java/com/baiyee/adcallback/api/callback/TripartitePartyCallbackApi.java new file mode 100644 index 0000000..8082cce --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/callback/TripartitePartyCallbackApi.java @@ -0,0 +1,103 @@ +package com.baiyee.adcallback.api.callback; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.baiyee.adcallback.api.common.CommonResponse; +import com.baiyee.adcallback.api.dto.To8ToParamDTO; +import com.baiyee.adcallback.api.vo.JuliangMobileMonitorCallbackRequestNewV1VO; +import com.baiyee.adcallback.service.AdOriginalityManageService; +import com.baiyee.adcallback.tools.CheckPlatPointParamsUtil; +import com.google.common.collect.ImmutableMap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * @author Enzo + * @date 三方检测链接 + */ +@RestController +@RequestMapping(value = ("/api")) +@Slf4j +public class TripartitePartyCallbackApi { + + private final AdOriginalityManageService originalityManageService; + + public TripartitePartyCallbackApi(AdOriginalityManageService originalityManageService) { + this.originalityManageService = originalityManageService; + } + + + @RequestMapping(value = "/jl/cooperate/monitor") + public CommonResponse jlMonitorUrlCallbackReqUrlV1( + @RequestParam(value = "aid", defaultValue = "") String aid, + @RequestParam(value = "aid_name", defaultValue = "") String aidName, + @RequestParam(value = "cid", defaultValue = "") String cid, + @RequestParam(value = "cid_name", defaultValue = "") String cidName, + @RequestParam(value = "campaign_id", defaultValue = "") String campaignId, + @RequestParam(value = "campaign_name", defaultValue = "") String campaignName, + @RequestParam(value = "ctype", defaultValue = "") String ctype, + @RequestParam(value = "CSITE", defaultValue = "") String csite, + @RequestParam(value = "idfa_md5", defaultValue = "") String idfaMD5, + @RequestParam(value = "oaid_md5", defaultValue = "") String oaidMD5, + @RequestParam(value = "CONVERT_ID", defaultValue = "") String convertId, + @RequestParam(value = "REQUEST_ID", defaultValue = "") String requestId, + @RequestParam(value = "track_id", defaultValue = "") String trackId, + @RequestParam(value = "OS", defaultValue = "") String os, + @RequestParam(value = "UA", defaultValue = "") String ua, + @RequestParam(value = "GEO", defaultValue = "") String geo, + @RequestParam(value = "TS", defaultValue = "") String ts, + @RequestParam(value = "MODEL", defaultValue = "") String model, + @RequestParam(value = "IMEI", defaultValue = "") String imei, + @RequestParam(value = "IDFA", defaultValue = "") String idfa, + @RequestParam(value = "OAID", defaultValue = "") String oaid, + @RequestParam(value = "MAC", defaultValue = "") String mac, + @RequestParam(value = "CALLBACK_PARAM", defaultValue = "") String callbackParam, + @RequestParam(value = "callback_url", defaultValue = "") String callbackUrl, + @RequestParam(value = "ADVERTISER_ID", defaultValue = "") String advertiserId, + @RequestParam(value = "tag", defaultValue = "") String tag, + @RequestParam(value = "vpoint", defaultValue = "") Integer vpoint) { + // 映射 + JuliangMobileMonitorCallbackRequestNewV1VO vo = new JuliangMobileMonitorCallbackRequestNewV1VO( + aid, aidName, cid, cidName, campaignId, campaignName, ctype, + csite, convertId, requestId, trackId, os, ua, geo, ts, model, + imei, idfa, idfaMD5, oaid, oaidMD5, mac, callbackParam, callbackUrl, advertiserId + ); + + // 映射 - Base 参数 + if (CharSequenceUtil.isBlank(tag) && ObjectUtil.isNull(vpoint)) { + vo.setTag("jl-cooperate-2048"); + vo.setVpoint(2048); + } + if (vo.getOs().equalsIgnoreCase("OS")) { + + log.error("======================== the ta error as {} ========================", vo.getTag()); + } + + if (CheckPlatPointParamsUtil.checkJLThirdParam(vo.getOs(), vo.getImei(), vo.getIdfa(), vo.getMac())) { + originalityManageService.handleCooperateSave(vo); + } + + return CommonResponse.createBySuccess(); + } + + + @PostMapping(value = "/jl/reception") + public ResponseEntity> getTag(@RequestBody String body) { + /* There may be other partners who will use the bean transfer method in the future*/ + To8ToParamDTO dto = JSONUtil.toBean(body, To8ToParamDTO.class); + Map map = ImmutableMap.of("code", 1, "message", "fail"); + if (CheckPlatPointParamsUtil.checkReceiveParam + (dto.getImei(), dto.getImeiMd5(), dto.getIdfa(), dto.getIdfaMd5(), dto.getOaid(), dto.getOaidMd5())) { + return new ResponseEntity<>(Boolean.TRUE.equals(originalityManageService.handleTo8ToParam(dto)) + ? ImmutableMap.of("code", 0, "message", "success") : map, HttpStatus.OK); + } + return new ResponseEntity<>(map, HttpStatus.OK); + } + +} diff --git a/src/main/java/com/baiyee/adcallback/api/constants/SpecialCheckParmConstant.java b/src/main/java/com/baiyee/adcallback/api/constants/SpecialCheckParmConstant.java index 1e3778d..366c9ce 100644 --- a/src/main/java/com/baiyee/adcallback/api/constants/SpecialCheckParmConstant.java +++ b/src/main/java/com/baiyee/adcallback/api/constants/SpecialCheckParmConstant.java @@ -15,4 +15,6 @@ public class SpecialCheckParmConstant { public static final String ZERO_JL_IDFA_MD5 = "9f89c84a559f573636a47ff8daed0d33"; + + } diff --git a/src/main/java/com/baiyee/adcallback/api/dto/ConvertDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/ConvertDTO.java new file mode 100644 index 0000000..9bc5ec8 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/ConvertDTO.java @@ -0,0 +1,43 @@ +package com.baiyee.adcallback.api.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Enzo + * @date : 2023/10/12 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ConvertDTO { + + + private String accountId; + + private String callbackChannelCode; + + private String channelCode; + + private String creativeId; + + private String crowdPackageId; + + private String ipCity; + + private String media; + + private String msgdgt; + + private String nonce; + + private String packageUpdateTime; + + private String pushMark; + + private String pushTypes; + + private String unitId; + +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/PlateFormDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/PlateFormDTO.java index efd7968..82247ad 100644 --- a/src/main/java/com/baiyee/adcallback/api/dto/PlateFormDTO.java +++ b/src/main/java/com/baiyee/adcallback/api/dto/PlateFormDTO.java @@ -14,6 +14,8 @@ public class PlateFormDTO { private String tag; + + public PlateFormDTO() { } diff --git a/src/main/java/com/baiyee/adcallback/config/pojo/PlatformTransmitDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/PlatformTransmitDTO.java similarity index 63% rename from src/main/java/com/baiyee/adcallback/config/pojo/PlatformTransmitDTO.java rename to src/main/java/com/baiyee/adcallback/api/dto/PlatformTransmitDTO.java index 3984265..18a2fbf 100644 --- a/src/main/java/com/baiyee/adcallback/config/pojo/PlatformTransmitDTO.java +++ b/src/main/java/com/baiyee/adcallback/api/dto/PlatformTransmitDTO.java @@ -1,7 +1,5 @@ -package com.baiyee.adcallback.config.pojo; +package com.baiyee.adcallback.api.dto; -import com.baiyee.adcallback.api.dto.PlateFormDTO; -import com.baiyee.adcallback.api.dto.RepeatFormDTO; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/baiyee/adcallback/api/dto/To8ToParamDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/To8ToParamDTO.java new file mode 100644 index 0000000..c72bbfe --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/To8ToParamDTO.java @@ -0,0 +1,66 @@ +package com.baiyee.adcallback.api.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Enzo + * @date : 2023/10/12 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class To8ToParamDTO { + + + + private String accountId; + + private String callbackChannelCode; + + private String channelCode; + + private String creativeId; + + private String crowdPackageId; + + private String deviceIdType; + + private String idfa; + + private String idfaMd5; + + private String imei; + + private String imeiMd5; + + private String ip; + + private String ipCity; + + private String media; + + private String monitType; + + private String msgdgt; + + private String nonce; + + private String oaid; + + private String oaidMd5; + + private String packageUpdateTime; + + private String planId; + + private String pushMark; + + private String pushTypes; + + private Long ts; + + private String unitId; + +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/TripartiteDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/TripartiteDTO.java new file mode 100644 index 0000000..bd8822e --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/TripartiteDTO.java @@ -0,0 +1,34 @@ +package com.baiyee.adcallback.api.dto; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2023/10/13 + */ +@Data +public class TripartiteDTO { + + private String imei; + + public TripartiteDTO(String imei, String oaid) { + this.imei = imei; + this.oaid = oaid; + } + + private String oaid; + + + private Integer sourceType; + + + + public TripartiteDTO() { + } + + public TripartiteDTO(String imei, String oaid, Integer sourceType) { + this.imei = imei; + this.oaid = oaid; + this.sourceType = sourceType; + } +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/TripartitePlatformDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/TripartitePlatformDTO.java new file mode 100644 index 0000000..b7ab767 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/TripartitePlatformDTO.java @@ -0,0 +1,18 @@ +package com.baiyee.adcallback.api.dto; + +import lombok.Builder; +import lombok.Data; + +/** + * @author Enzo + * @date : 2023/10/13 + */ +@Data +@Builder +public class TripartitePlatformDTO { + + private String nid; + + private Integer type; + +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/TripartiteTransmitDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/TripartiteTransmitDTO.java new file mode 100644 index 0000000..53ccd34 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/TripartiteTransmitDTO.java @@ -0,0 +1,18 @@ +package com.baiyee.adcallback.api.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author Enzo + * @date : 2022/10/14 + */ +@Data +public class TripartiteTransmitDTO { + + + private String authToken; + + private List list; +} diff --git a/src/main/java/com/baiyee/adcallback/config/WebMvcConfig.java b/src/main/java/com/baiyee/adcallback/config/WebMvcConfig.java new file mode 100644 index 0000000..8986aff --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/config/WebMvcConfig.java @@ -0,0 +1,27 @@ +package com.baiyee.adcallback.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author Enzo + * @date : 2023/10/12 + */ +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + + /** + * 接口地址忽略大小写 + * @param configurer + */ + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + AntPathMatcher matcher = new AntPathMatcher(); + matcher.setCaseSensitive(false); + configurer.setPathMatcher(matcher); + } + +} diff --git a/src/main/java/com/baiyee/adcallback/repository/TbJlTripartiteDataEntityRepository.java b/src/main/java/com/baiyee/adcallback/repository/TbJlTripartiteDataEntityRepository.java new file mode 100644 index 0000000..53968a0 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/repository/TbJlTripartiteDataEntityRepository.java @@ -0,0 +1,35 @@ +package com.baiyee.adcallback.repository; + +import cn.hutool.core.date.DateTime; +import com.baiyee.adcallback.api.dto.TripartiteDTO; +import com.baiyee.adcallback.repository.entity.TbJlTripartiteDataEntity; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author Enzo + * @date 2023-10-12 + */ +@Repository +public interface TbJlTripartiteDataEntityRepository extends BaseRepository { + + + /** + * 查询数据 + * + * @param imeiStrFirst + * @param imeiSecond + * @param startDate + * @param endDate + * @return + */ + @Query("select new com.baiyee.adcallback.api.dto.TripartiteDTO(imei as imei,oaid as oaid, sourceType as sourceType) from " + + " TbJlTripartiteDataEntity where imei != :imeiStrFirst and imei != :imeiSecond and gmtCreate >= :startDate and gmtCreate < :endDate") + List queryPlateFormDTO(@Param("imeiStrFirst") String imeiStrFirst, @Param("imeiSecond") String imeiSecond, @Param("startDate") DateTime startDate, @Param("endDate") DateTime endDate); + + + +} diff --git a/src/main/java/com/baiyee/adcallback/repository/entity/TbJlTripartiteDataEntity.java b/src/main/java/com/baiyee/adcallback/repository/entity/TbJlTripartiteDataEntity.java new file mode 100644 index 0000000..1195006 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/repository/entity/TbJlTripartiteDataEntity.java @@ -0,0 +1,104 @@ +package com.baiyee.adcallback.repository.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.*; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.util.Date; + + +/** + * @author Enzo + * @date + */ +@Getter +@Setter +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "tb_jl_tripartite_data", schema = "db_ad") +@EntityListeners(AuditingEntityListener.class) +public class TbJlTripartiteDataEntity { + + + @Id + @Column(name = "id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Column(name = "gmt_create", nullable = false) + private Date gmtCreate; + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Column(name = "gmt_modified", nullable = false) + private Date gmtModify; + + + @Basic + @Column(name = "ts", nullable = false) + private String ts; + + @Basic + @Column(name = "imei", nullable = false) + private String imei; + + + @Basic + @Column(name = "imei_md5", nullable = false) + private String imeiMd5; + + @Basic + @Column(name = "idfa", nullable = false ) + private String idfa; + + @Basic + @Column(name = "idfa_md5", nullable = false) + private String idfaMd5; + + @Basic + @Column(name = "oaid", nullable = false) + private String oaid; + + @Basic + @Column(name = "oaid_md5", nullable = false) + private String oaidMd5; + + @Column(name = "ip", nullable = false) + private String ip; + + + @Basic + @Column(name = "monit_type") + private String monitType; + + @Basic + @Column(name = "account_id") + private Integer accountId; + + @Basic + @Column(name = "plan_id") + private Integer planId; + + @Basic + @Column(name = "device_id_type") + private String deviceIdType; + + @Basic + @Column(name = "source_type") + private Integer sourceType; + + + @Basic + @Column(name = "other_info") + private String otherInfo; + +} diff --git a/src/main/java/com/baiyee/adcallback/service/AdOriginalityManageService.java b/src/main/java/com/baiyee/adcallback/service/AdOriginalityManageService.java index 6dab0bb..30415d1 100644 --- a/src/main/java/com/baiyee/adcallback/service/AdOriginalityManageService.java +++ b/src/main/java/com/baiyee/adcallback/service/AdOriginalityManageService.java @@ -1,5 +1,6 @@ package com.baiyee.adcallback.service; +import com.baiyee.adcallback.api.dto.To8ToParamDTO; import com.baiyee.adcallback.api.vo.*; /** @@ -55,10 +56,21 @@ public interface AdOriginalityManageService { void handleMonitorUrlCallbackDataThenSave4(); - /** * 处理监测数据然后保存回调 - gdt */ void handleMonitorUrlCallbackDataThenSave5(); + /** + * 处理第三方请求 + * @param dto + * @return 保存结果 + */ + Boolean handleTo8ToParam(To8ToParamDTO dto); + + /** + * 插入数据 + * @param vo + */ + void handleCooperateSave(JuliangMobileMonitorCallbackRequestNewV1VO vo); } diff --git a/src/main/java/com/baiyee/adcallback/service/TripartiteService.java b/src/main/java/com/baiyee/adcallback/service/TripartiteService.java new file mode 100644 index 0000000..94d9afb --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/service/TripartiteService.java @@ -0,0 +1,23 @@ +package com.baiyee.adcallback.service; + +import cn.hutool.core.date.DateTime; +import com.baiyee.adcallback.api.dto.TripartiteDTO; + +import java.util.List; + +/** + * @author Enzo + * @date : 2023/10/12 + */ +public interface TripartiteService { + + /** + * + * @param empty + * @param imeiStr + * @param offsetMinute + * @param date + * @return + */ + List queryTripartiteData(String empty, String imeiStr, DateTime offsetMinute, DateTime date); +} diff --git a/src/main/java/com/baiyee/adcallback/service/impl/AdOriginalityManageServiceImpl.java b/src/main/java/com/baiyee/adcallback/service/impl/AdOriginalityManageServiceImpl.java index 74dad4a..0fb2de0 100644 --- a/src/main/java/com/baiyee/adcallback/service/impl/AdOriginalityManageServiceImpl.java +++ b/src/main/java/com/baiyee/adcallback/service/impl/AdOriginalityManageServiceImpl.java @@ -3,14 +3,16 @@ package com.baiyee.adcallback.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baiyee.adcallback.api.constants.VpointEnum; +import com.baiyee.adcallback.api.dto.ConvertDTO; +import com.baiyee.adcallback.api.dto.To8ToParamDTO; import com.baiyee.adcallback.api.vo.*; import com.baiyee.adcallback.config.pojo.convert.*; import com.baiyee.adcallback.repository.*; import com.baiyee.adcallback.repository.entity.*; import com.baiyee.adcallback.service.AdOriginalityManageService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -39,13 +41,17 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic private final TbJLV1BackdataEntityRepository jlv1BackdataEntityRepository; + + private final TbJlTripartiteDataEntityRepository jlThirdDataEntityRepository; + private final TbGdtNewBackdataEntityRepository tbGdtNewBackdataEntityRepository; private final TbKSNewBackdataEntityRepository tbKSNewBackdataEntityRepository; private final TbBDNewBackdataEntityRepository tbBDNewBackdataEntityRepository; - public AdOriginalityManageServiceImpl(TbJlBackdataEntityRepository repository, TbBdBackdataEntityRepository bdBackdataEntityRepository, TbUcBackdataEntityRepository tbUcBackdataEntityRepository, TbKsBackdataEntityRepository ksBackdataEntityRepository, TbVivoBackdataEntityRepository vivoBackdataEntityRepository, TbGdtBackdataEntityRepository gdtBackdataEntityRepository, TbJLV2BackdataEntityRepository jlv2BackdataEntityRepository, TbJLV1BackdataEntityRepository jlv1BackdataEntityRepository, TbGdtNewBackdataEntityRepository tbGdtNewBackdataEntityRepository, TbKSNewBackdataEntityRepository tbKSNewBackdataEntityRepository, TbBDNewBackdataEntityRepository tbBDNewBackdataEntityRepository) { + public AdOriginalityManageServiceImpl(TbJlBackdataEntityRepository repository, TbBdBackdataEntityRepository bdBackdataEntityRepository, TbUcBackdataEntityRepository tbUcBackdataEntityRepository, TbKsBackdataEntityRepository ksBackdataEntityRepository, TbVivoBackdataEntityRepository vivoBackdataEntityRepository, TbGdtBackdataEntityRepository gdtBackdataEntityRepository, TbJLV2BackdataEntityRepository jlv2BackdataEntityRepository, TbJLV1BackdataEntityRepository jlv1BackdataEntityRepository, TbGdtNewBackdataEntityRepository tbGdtNewBackdataEntityRepository, TbKSNewBackdataEntityRepository tbKSNewBackdataEntityRepository, TbBDNewBackdataEntityRepository tbBDNewBackdataEntityRepository, + TbJlTripartiteDataEntityRepository jlThirdDataEntityRepository) { this.repository = repository; this.bdBackdataEntityRepository = bdBackdataEntityRepository; this.tbUcBackdataEntityRepository = tbUcBackdataEntityRepository; @@ -54,6 +60,7 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic this.gdtBackdataEntityRepository = gdtBackdataEntityRepository; this.jlv2BackdataEntityRepository = jlv2BackdataEntityRepository; this.jlv1BackdataEntityRepository = jlv1BackdataEntityRepository; + this.jlThirdDataEntityRepository = jlThirdDataEntityRepository; this.tbGdtNewBackdataEntityRepository = tbGdtNewBackdataEntityRepository; this.tbKSNewBackdataEntityRepository = tbKSNewBackdataEntityRepository; this.tbBDNewBackdataEntityRepository = tbBDNewBackdataEntityRepository; @@ -99,15 +106,15 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic BeanUtil.copyProperties(vo, backDataEntity); // 区分 安卓 还是 IOS ios, android - if (StrUtil.isNotBlank(vo.getDeviceOsType()) && StrUtil.equalsIgnoreCase("android", vo.getDeviceOsType().trim())){ + if (StrUtil.isNotBlank(vo.getDeviceOsType()) && StrUtil.equalsIgnoreCase("android", vo.getDeviceOsType().trim())) { backDataEntity.setImei(vo.getMuid()); - }else { + } else { backDataEntity.setImei(""); } - if (StrUtil.isNotBlank(vo.getDeviceOsType()) && StrUtil.equalsIgnoreCase("ios", vo.getDeviceOsType().trim())){ + if (StrUtil.isNotBlank(vo.getDeviceOsType()) && StrUtil.equalsIgnoreCase("ios", vo.getDeviceOsType().trim())) { backDataEntity.setIdfa(vo.getMuid()); - }else { + } else { backDataEntity.setIdfa(""); } @@ -157,7 +164,7 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic TbJlBackdataEntity backEntity = JlBackdataConvert.covertToEntity(entity); TbJlBackdataEntity save = repository.save(backEntity); - if (ObjectUtil.isNull(save)){ + if (ObjectUtil.isNull(save)) { log.error("============================= [save a data fail save is {} ] =============================", save); } } @@ -168,7 +175,7 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic TbBdBackdataEntity backEntity = BdBackdataConvert.covertToEntity(entity); TbBdBackdataEntity save = bdBackdataEntityRepository.save(backEntity); - if (ObjectUtil.isNull(save)){ + if (ObjectUtil.isNull(save)) { log.error("============================= [save a data fail save is {} ] =============================", save); } } @@ -180,7 +187,7 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic TbUcBackdataEntity backEntity = UcBackdataConvert.covertToEntity(entity); TbUcBackdataEntity save = tbUcBackdataEntityRepository.save(backEntity); - if (ObjectUtil.isNull(save)){ + if (ObjectUtil.isNull(save)) { log.error("============================= [save a data fail save is {} ] =============================", save); } } @@ -191,7 +198,7 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic TbKsBackdataEntity backEntity = KuaiShouBackdataConvert.covertToEntity(entity); TbKsBackdataEntity save = ksBackdataEntityRepository.save(backEntity); - if (ObjectUtil.isNull(save)){ + if (ObjectUtil.isNull(save)) { log.error("============================= [save a data fail save is {} ] =============================", save); } } @@ -202,7 +209,7 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic TbVivoBackdataEntity backEntity = VivoBackdataConvert.covertToEntity(entity); TbVivoBackdataEntity save = vivoBackdataEntityRepository.save(backEntity); - if (ObjectUtil.isNull(save)){ + if (ObjectUtil.isNull(save)) { log.error("============================= [save a data fail save is {} ] =============================", save); } } @@ -214,8 +221,30 @@ public class AdOriginalityManageServiceImpl implements AdOriginalityManageServic TbGdtBackdataEntity backEntity = GdtBackdataConvert.covertToEntity(entity); TbGdtBackdataEntity save = gdtBackdataEntityRepository.save(backEntity); - if (ObjectUtil.isNull(save)){ + if (ObjectUtil.isNull(save)) { log.error("============================= [save a data fail save is {} ] =============================", save); } } + + @Override + public Boolean handleTo8ToParam(To8ToParamDTO dto) { + ConvertDTO convertDTO = new ConvertDTO(); + TbJlTripartiteDataEntity build = new TbJlTripartiteDataEntity(); + // 数据入库 + build.setSourceType(1); + BeanUtil.copyProperties(dto, build); + BeanUtil.copyProperties(dto, convertDTO); + build.setOtherInfo(JSONUtil.toJsonStr(convertDTO)); + TbJlTripartiteDataEntity result = jlThirdDataEntityRepository.save(build); + return ObjectUtil.isNotNull(result) && ObjectUtil.isNotNull(result.getId()); + } + + @Override + public void handleCooperateSave(JuliangMobileMonitorCallbackRequestNewV1VO vo) { + TbJLBackDataV1Entity dataV1Entity = new TbJLBackDataV1Entity(); + // 数据入库 + BeanUtil.copyProperties(vo, dataV1Entity); + + jlv1BackdataEntityRepository.save(dataV1Entity); + } } diff --git a/src/main/java/com/baiyee/adcallback/service/impl/TripartiteServiceImpl.java b/src/main/java/com/baiyee/adcallback/service/impl/TripartiteServiceImpl.java new file mode 100644 index 0000000..c5c1f7d --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/service/impl/TripartiteServiceImpl.java @@ -0,0 +1,27 @@ +package com.baiyee.adcallback.service.impl; + +import cn.hutool.core.date.DateTime; +import com.baiyee.adcallback.api.dto.TripartiteDTO; +import com.baiyee.adcallback.repository.TbJlTripartiteDataEntityRepository; +import com.baiyee.adcallback.service.TripartiteService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.OffsetDateTime; +import java.util.List; + +/** + * @author Enzo + * @date : 2023/10/12 + */ +@Service +@RequiredArgsConstructor +public class TripartiteServiceImpl implements TripartiteService { + + private final TbJlTripartiteDataEntityRepository jlTripartiteDataEntityRepository; + + @Override + public List queryTripartiteData(String empty, String imeiStr, DateTime offsetMinute, DateTime date) { + return jlTripartiteDataEntityRepository.queryPlateFormDTO(empty, imeiStr, offsetMinute, date); + } +} diff --git a/src/main/java/com/baiyee/adcallback/task/NewPlatFormRecordTask.java b/src/main/java/com/baiyee/adcallback/task/NewPlatFormRecordTask.java index 55a8717..7a920c9 100644 --- a/src/main/java/com/baiyee/adcallback/task/NewPlatFormRecordTask.java +++ b/src/main/java/com/baiyee/adcallback/task/NewPlatFormRecordTask.java @@ -13,7 +13,7 @@ import cn.hutool.json.JSONUtil; import com.baiyee.adcallback.api.dto.PlateFormDTO; import com.baiyee.adcallback.api.dto.RepeatFormDTO; import com.baiyee.adcallback.common.enums.DeliveryPlatformEnum; -import com.baiyee.adcallback.config.pojo.PlatformTransmitDTO; +import com.baiyee.adcallback.api.dto.PlatformTransmitDTO; import com.baiyee.adcallback.repository.entity.TbPlatformCompanyEntity; import com.baiyee.adcallback.repository.entity.TbPlatformDeliveryEntity; import com.baiyee.adcallback.service.AdPlatformDeliveryService; diff --git a/src/main/java/com/baiyee/adcallback/task/PlatFormRecordTask.java b/src/main/java/com/baiyee/adcallback/task/PlatFormRecordTask.java index be26d12..eda5562 100644 --- a/src/main/java/com/baiyee/adcallback/task/PlatFormRecordTask.java +++ b/src/main/java/com/baiyee/adcallback/task/PlatFormRecordTask.java @@ -13,7 +13,7 @@ import cn.hutool.json.JSONUtil; import com.baiyee.adcallback.api.dto.PlateFormDTO; import com.baiyee.adcallback.api.dto.RepeatFormDTO; import com.baiyee.adcallback.common.enums.DeliveryPlatformEnum; -import com.baiyee.adcallback.config.pojo.PlatformTransmitDTO; +import com.baiyee.adcallback.api.dto.PlatformTransmitDTO; import com.baiyee.adcallback.repository.entity.TbPlatformCompanyEntity; import com.baiyee.adcallback.repository.entity.TbPlatformDeliveryEntity; import com.baiyee.adcallback.service.AdPlatformDeliveryService; diff --git a/src/main/java/com/baiyee/adcallback/task/TripartiteRecordTask.java b/src/main/java/com/baiyee/adcallback/task/TripartiteRecordTask.java new file mode 100644 index 0000000..6bf6aae --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/task/TripartiteRecordTask.java @@ -0,0 +1,116 @@ +package com.baiyee.adcallback.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baiyee.adcallback.api.constants.SpecialCheckParmConstant; +import com.baiyee.adcallback.api.dto.TripartiteDTO; +import com.baiyee.adcallback.api.dto.TripartitePlatformDTO; +import com.baiyee.adcallback.api.dto.TripartiteTransmitDTO; +import com.baiyee.adcallback.service.TripartiteService; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Set; + +/** + * @author Enzo + * @date : 2023/10/13 + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class TripartiteRecordTask { + + + @Value("${platform.authToken}") + private String authToken; + + @Value("${platform.tripartite-url}") + private String url; + + private DateTime beginTime; + + private final TripartiteService tripartiteService; + + + /** + * 三方投放 + * + */ + @Scheduled(cron = "0 0/15 * * * ? ") + @Transactional(rollbackFor = Exception.class) + public void deliveryPlatform() { + DateTime date = DateUtil.date(); + // 偏移十五分钟 + DateTime offsetMinute = ObjectUtil.isNull(beginTime) ? + DateUtil.offsetMinute(date, -15) : DateUtil.offsetMinute(beginTime, -15); + beginTime = offsetMinute; + log.info("================ the begin time as {} end time as {} ================", offsetMinute, date); + List dtoList = tripartiteService.queryTripartiteData + (CharSequenceUtil.EMPTY, "__IMEI__", offsetMinute, date); + log.info("================ the dto list as {} ================", dtoList.size()); + if (CollUtil.isNotEmpty(dtoList)) { + List list = Lists.newArrayList(); + dtoList.forEach(dto -> { + if (StringUtils.isNotBlank(dto.getImei()) && + !dto.getImei().equalsIgnoreCase(SpecialCheckParmConstant.ZERO_JL_IDFA)) { + TripartitePlatformDTO build = + TripartitePlatformDTO.builder().type(0).nid(dto.getImei()).build(); + list.add(build); + } + if (StringUtils.isNotBlank(dto.getOaid()) && + !dto.getOaid().equalsIgnoreCase(SpecialCheckParmConstant.ZERO_JL_IDFA)) { + TripartitePlatformDTO build = + TripartitePlatformDTO.builder().type(1).nid(dto.getOaid()).build(); + list.add(build); + } + }); + // 去除重复数据 + Set originSet = Sets.newHashSet(list); + // 分批发送 + List> partition = + Lists.partition(Lists.newArrayList(originSet), 500); + int num = 0; + for (List formDTOList : partition) { + TripartiteTransmitDTO dto = new TripartiteTransmitDTO(); + dto.setList(formDTOList); + dto.setAuthToken(authToken); + String post = HttpUtil.post(url, JSONUtil.toJsonStr(dto)); + Object status = new JSONObject(post).get("status"); + if (ObjectUtil.isNotNull(status) && + Integer.parseInt(status.toString()) != 0) { + num++; + } + } + if (num == 0) { + /*// 异步插入数据 + CompletableFuture.runAsync(() -> { + List deliveryStatisticEntityList = + Convert.toList(TbPlatformDeliveryEntity.class, saveDataList); + // 批量保存 + adPlatformDeliveryService.saveAll(deliveryStatisticEntityList); + });*/ + beginTime = date; + } + log.error("================ the new datalist size as {} ================", originSet.size()); + if (CollUtil.isEmpty(dtoList)) { + beginTime = date; + } + } + } +} diff --git a/src/main/java/com/baiyee/adcallback/tools/CheckPlatPointParamsUtil.java b/src/main/java/com/baiyee/adcallback/tools/CheckPlatPointParamsUtil.java index bd294b8..c14c377 100644 --- a/src/main/java/com/baiyee/adcallback/tools/CheckPlatPointParamsUtil.java +++ b/src/main/java/com/baiyee/adcallback/tools/CheckPlatPointParamsUtil.java @@ -1,8 +1,10 @@ package com.baiyee.adcallback.tools; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.StrUtil; import com.baiyee.adcallback.api.constants.SpecialCheckParmConstant; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; /** * 检查各个平台的重点参数的规则 @@ -10,7 +12,8 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class CheckPlatPointParamsUtil { - private CheckPlatPointParamsUtil(){} + private CheckPlatPointParamsUtil() { + } /** * 检测百度相关参数 @@ -18,12 +21,12 @@ public class CheckPlatPointParamsUtil { public static boolean checkBDPlatPointParam(String os, String idfa, String imei, String oaidMD5, String oaid) { // 安卓 - if (StrUtil.equalsIgnoreCase("0", os) && StrUtil.isBlank(imei) && StrUtil.isBlank(oaid) && StrUtil.isBlank(oaidMD5)){ + if (StrUtil.equalsIgnoreCase("0", os) && StrUtil.isBlank(imei) && StrUtil.isBlank(oaid) && StrUtil.isBlank(oaidMD5)) { return Boolean.FALSE; } // ios - if (StrUtil.equalsIgnoreCase("1", os) && StrUtil.isBlank(idfa)){ + if (StrUtil.equalsIgnoreCase("1", os) && StrUtil.isBlank(idfa)) { return Boolean.FALSE; } @@ -37,12 +40,12 @@ public class CheckPlatPointParamsUtil { public static boolean checkKSPlatPointParam(String os, String oaid, String imei, String imeiHash, String idfa, String idfaHash) { // 安卓的 // FIXME: 2023/5/26 0026 imeiHash 目前不是很通用还是不存了 - if (StrUtil.equalsIgnoreCase("0", os) && (StrUtil.isBlank(imei) || StrUtil.isBlank(oaid))){ + if (StrUtil.equalsIgnoreCase("0", os) && (StrUtil.isBlank(imei) || StrUtil.isBlank(oaid))) { return Boolean.FALSE; } // ios - if (StrUtil.equalsIgnoreCase("1", os) && StrUtil.isBlank(idfa)){ + if (StrUtil.equalsIgnoreCase("1", os) && StrUtil.isBlank(idfa)) { return Boolean.FALSE; } @@ -53,15 +56,15 @@ public class CheckPlatPointParamsUtil { /** * 检测广点通的参数 */ - public static boolean checkGDTPlatPointParam(String os, String muid, String oaid){ + public static boolean checkGDTPlatPointParam(String os, String muid, String oaid) { // 安卓的 - if (StrUtil.equalsIgnoreCase("android", os.trim()) && (StrUtil.isBlank(muid) || StrUtil.isBlank(oaid))){ + if (StrUtil.equalsIgnoreCase("android", os.trim()) && (StrUtil.isBlank(muid) || StrUtil.isBlank(oaid))) { return Boolean.FALSE; } // ios - if (StrUtil.equalsIgnoreCase("ios", os.trim()) && StrUtil.isBlank(muid)){ + if (StrUtil.equalsIgnoreCase("ios", os.trim()) && StrUtil.isBlank(muid)) { return Boolean.FALSE; } @@ -73,7 +76,7 @@ public class CheckPlatPointParamsUtil { * * @return 直接返回校验是否通过 */ - public static boolean checkJLPlatPointV2Param(String os1, String imei, String idfa, String idfaMD5, String mac){ + public static boolean checkJLPlatPointV2Param(String os1, String imei, String idfa, String idfaMD5, String mac) { //安卓:0 //IOS:1 @@ -94,7 +97,7 @@ public class CheckPlatPointParamsUtil { (StrUtil.equals(SpecialCheckParmConstant.ZERO_JL_IMEI, imei) || StrUtil.equals(SpecialCheckParmConstant.ZERO_JL_IMEI_MD5, imei) || StrUtil.isBlank(imei)) - ){ + ) { return Boolean.FALSE; } @@ -102,13 +105,13 @@ public class CheckPlatPointParamsUtil { if (os == 1 && (StrUtil.equals(SpecialCheckParmConstant.ZERO_JL_IDFA, idfa) || StrUtil.equals(SpecialCheckParmConstant.ZERO_JL_IDFA_MD5, idfaMD5) || - ( StrUtil.isBlank(idfa) && StrUtil.isBlank(idfaMD5))) - ){ + (StrUtil.isBlank(idfa) && StrUtil.isBlank(idfaMD5))) + ) { return Boolean.FALSE; } // 其他 - if (os == 3 && (StrUtil.isBlank(imei) && StrUtil.isBlank(idfa) && StrUtil.isBlank(idfaMD5) && StrUtil.isBlank(mac))){ + if (os == 3 && (StrUtil.isBlank(imei) && StrUtil.isBlank(idfa) && StrUtil.isBlank(idfaMD5) && StrUtil.isBlank(mac))) { return Boolean.FALSE; } return Boolean.TRUE; @@ -121,10 +124,10 @@ public class CheckPlatPointParamsUtil { * * @return 校验结果 */ - public static boolean checkMainParamForPut(String oaid,String oaidMD5, + public static boolean checkMainParamForPut(String oaid, String oaidMD5, String imei, String imeiMD5, String idfa, String idfaMD5, - String mac){ + String mac) { /* 判断逻辑和思路: main参数可能存在MD5值和原值其中一个为空的情况, 只要有一个存在即可 @@ -138,7 +141,7 @@ public class CheckPlatPointParamsUtil { && (StrUtil.isBlank(imei) || StrUtil.isBlank(imeiMD5)) && (StrUtil.isBlank(idfa) || StrUtil.isBlank(idfaMD5)) && StrUtil.isBlank(mac) - ){ + ) { return Boolean.FALSE; } @@ -146,5 +149,63 @@ public class CheckPlatPointParamsUtil { } + /** + * 检查JL重点参数 + * + * @return 直接返回校验是否通过 + */ + public static boolean checkJLThirdParam(String os1, String imei, String idfa, String mac) { + + //安卓:0 + //IOS:1 + //其他:3 + if (StringUtils.isNotBlank(os1) && ValidationUtil.isInteger(os1)) { + int os = Integer.parseInt(os1); + // 安卓 + if (os == 0 && (StrUtil.equals(SpecialCheckParmConstant.ZERO_JL_IMEI, imei) || + StrUtil.equals(SpecialCheckParmConstant.ZERO_JL_IMEI_MD5, imei) || StrUtil.isBlank(imei))) { + return Boolean.FALSE; + } + + // IOS + if (os == 1 && + (StrUtil.equals(SpecialCheckParmConstant.ZERO_JL_IDFA, idfa) || (StrUtil.isBlank(idfa)))) { + + return Boolean.FALSE; + } + + // 其他 + if (os == 3 && (StrUtil.isBlank(imei) && StrUtil.isBlank(idfa) && StrUtil.isBlank(mac))) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + + public static boolean checkReceiveParam(String imei, String imeiMd5, String idfa, String idfaMd5, String oaid, String oaidMd5) { + // 其他 + if ((CharSequenceUtil.isBlank(imei) && CharSequenceUtil.isBlank(idfa) + && CharSequenceUtil.isBlank(idfaMd5) && CharSequenceUtil.isBlank(imeiMd5)) + && CharSequenceUtil.isBlank(oaid) && CharSequenceUtil.isBlank(oaidMd5)) { + return Boolean.FALSE; + } + if ((CharSequenceUtil.equals(SpecialCheckParmConstant.ZERO_JL_IMEI, imei) || + CharSequenceUtil.equals(SpecialCheckParmConstant.ZERO_JL_IMEI_MD5, imei))) { + return Boolean.FALSE; + } + + if ((CharSequenceUtil.equals(SpecialCheckParmConstant.ZERO_JL_IDFA, idfa) || + CharSequenceUtil.equals(SpecialCheckParmConstant.ZERO_JL_IDFA_MD5, idfaMd5))) { + return Boolean.FALSE; + } + + if ((CharSequenceUtil.equals(SpecialCheckParmConstant.ZERO_JL_IDFA, oaid) || + CharSequenceUtil.equals(SpecialCheckParmConstant.ZERO_JL_IDFA_MD5, oaidMd5))) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e5ca3ef..b9e97a4 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -52,7 +52,7 @@ spring: type: com.alibaba.druid.pool.DruidDataSource # 数据库驱动类名 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://8.130.96.163:3306/db_ad?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + url: jdbc:mysql://39.100.77.21:3306/db_ad?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: y7z7noq2 db1: @@ -60,7 +60,7 @@ spring: type: com.alibaba.druid.pool.DruidDataSource # 数据库驱动类名 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://8.130.96.163:3306/db_ad1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + url: jdbc:mysql://39.100.77.21:3306/db_ad1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: y7z7noq2 # 规则配置 @@ -231,9 +231,11 @@ spring: show-sql: false platform: + workId: 32 authToken: JI8AeA7POKsdGcBC url: http://8.130.96.163:8866/api/taskImei/callback/add - workId: 32 + tripartite-url: http://127.0.0.1:8866/api/taskImei/tripartite/add + tf: source: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 5399a9d..b8f6fca 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -226,6 +226,7 @@ spring: sql-show: false platform: authToken: nqJpVSf3UcrEcVIH + tripartite-url: https://baiyee.vip/api/api/taskImei/tripartite/add url: https://baiyee.vip/api/taskImei/callback/add workId: 32 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b2afbbb..d86f1a6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -23,6 +23,8 @@ spring: allow_unquoted_control_chars: true #允许出现单引号 allow_single_quotes: true + mapper: + accept-case-insensitive-properties: true # 配置 Jpa jpa: diff --git a/src/test/java/com/baiyee/adcallback/AdCallbackApplicationTests.java b/src/test/java/com/baiyee/adcallback/AdCallbackApplicationTests.java index d7fc372..48456f2 100644 --- a/src/test/java/com/baiyee/adcallback/AdCallbackApplicationTests.java +++ b/src/test/java/com/baiyee/adcallback/AdCallbackApplicationTests.java @@ -2,14 +2,9 @@ package com.baiyee.adcallback; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONUtil; import com.baiyee.adcallback.api.constants.SqlConstant; -import com.baiyee.adcallback.api.dto.DmpMonitorJpaDto; -import com.baiyee.adcallback.api.dto.PlateFormDTO; import com.baiyee.adcallback.common.enums.TableEnum; import com.baiyee.adcallback.config.pojo.DeliveryStatisticDTO; -import com.baiyee.adcallback.config.pojo.PlatformTransmitDTO; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; @@ -18,7 +13,6 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Test; import java.util.*; -import java.util.stream.Collectors; @Slf4j public class AdCallbackApplicationTests {