记得上下班打卡 | git大法好,push需谨慎

Commit 999482d4 authored by Tice's avatar Tice

更新接口

parent 5b84e00d
...@@ -4,7 +4,7 @@ public class MerchantRedisConst { ...@@ -4,7 +4,7 @@ public class MerchantRedisConst {
public static final String PREFIX = "merchant:"; public static final String PREFIX = "merchant:";
// 场地详情 // 场地详情
public static final String INFO_FIELD = PREFIX.concat("info:field:"); public static final String INFO_FIELD = PREFIX.concat("info:fields:");
// 个人全部的场地申请 // 个人全部的场地申请
public static final String INFO_FIELD_APPLIES = PREFIX.concat("info:field_applies:"); public static final String INFO_FIELD_APPLIES = PREFIX.concat("info:field_applies:");
......
...@@ -5,7 +5,9 @@ import com.liquidnet.service.merchant.dto.param.MerchantFieldsApplyParam; ...@@ -5,7 +5,9 @@ import com.liquidnet.service.merchant.dto.param.MerchantFieldsApplyParam;
import com.liquidnet.service.merchant.dto.vo.MerchantFieldsVo; import com.liquidnet.service.merchant.dto.vo.MerchantFieldsVo;
public interface IMerchantFieldsAppliesService { public interface IMerchantFieldsAppliesService {
PagedResult<MerchantFieldsVo> search(String name); PagedResult<MerchantFieldsVo> search(String name, int page, int size);
String apply(MerchantFieldsApplyParam parameter); String apply(String uid, MerchantFieldsApplyParam parameter);
void editIsCheck(String uid, String fieldId, int isCheck);
} }
...@@ -141,7 +141,8 @@ public class MQConst { ...@@ -141,7 +141,8 @@ public class MQConst {
} }
public enum MerchantQueue { public enum MerchantQueue {
SQL_MERCHANT_FIELD("merchant:stream:rk.sql.field", "group.sql.field", "场地相关") // SQL_MERCHANT_FIELD("merchant:stream:rk.sql.field", "group.sql.field", "场地相关")
SQL_MERCHANT_FIELD("kylin:stream:rk.performance.lack", "group.performance.lack", "场地相关")
; ;
private final String key; private final String key;
......
# use prod_ln_scene;
# 创建集合
db.createCollection("MerchantFieldsVo");
# 创建索引
db.MerchantFieldsVo.createIndex({fieldId:"hashed"});
db.MerchantFieldsVo.createIndex({isOnline:"hashed"});
db.MerchantFieldsVo.createIndex({uid:"hashed"});
\ No newline at end of file
package com.liquidnet.service.merchant.config;
import com.liquidnet.common.web.config.WebMvcConfig;
import com.liquidnet.common.web.filter.GlobalAuthorityInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@Configuration
public class MerchantWebMvcConfig extends WebMvcConfig {
@Autowired
GlobalAuthorityInterceptor globalAuthorityInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(globalAuthorityInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
...@@ -2,20 +2,22 @@ package com.liquidnet.service.merchant.controller; ...@@ -2,20 +2,22 @@ package com.liquidnet.service.merchant.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.merchant.dto.param.MerchantFieldsApplyParam; import com.liquidnet.service.merchant.dto.param.MerchantFieldsApplyParam;
import com.liquidnet.service.merchant.dto.vo.MerchantFieldsVo;
import com.liquidnet.service.merchant.service.IMerchantFieldsAppliesService; import com.liquidnet.service.merchant.service.IMerchantFieldsAppliesService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
/** /**
* <p> * <p>
...@@ -36,13 +38,32 @@ public class MerchantFieldsController { ...@@ -36,13 +38,32 @@ public class MerchantFieldsController {
@Autowired @Autowired
IMerchantFieldsAppliesService merchantFieldsAppliesService; IMerchantFieldsAppliesService merchantFieldsAppliesService;
@ApiOperationSupport(order = 1) @ApiOperationSupport(order = 10)
@ApiOperation(value = "场地搜索")
@GetMapping("search")
public ResponseDto<PagedResult<MerchantFieldsVo>> list(@RequestParam(required = true) String name,
@RequestParam(defaultValue = "1", required = false) int page,
@RequestParam(defaultValue = "10", required = false) int size) {
return ResponseDto.success(merchantFieldsAppliesService.search(name, page, size));
}
@ApiOperationSupport(order = 11)
@ApiOperation(value = "申请场地") @ApiOperation(value = "申请场地")
@PostMapping("apply") @PostMapping("apply")
public ResponseDto<Object> apply(@Valid @RequestBody MerchantFieldsApplyParam parameter) { public ResponseDto<Object> apply(@Valid @RequestBody MerchantFieldsApplyParam parameter) {
return ResponseDto.success(merchantFieldsAppliesService.apply(parameter)); String currentUid = CurrentUtil.getCurrentUid();
return ResponseDto.success(merchantFieldsAppliesService.apply(currentUid, parameter));
} }
@ApiOperationSupport(order = 12)
@ApiOperation(value = "更改场地是否审核演出")
@PostMapping("editIsCheck")
public ResponseDto<Object> editIsCheck(@RequestParam(required = true) String fieldId, @RequestParam(required = false) @Size(min = 0, max = 1) int isCheck){
String currentUid = CurrentUtil.getCurrentUid();
merchantFieldsAppliesService.editIsCheck(currentUid, fieldId, isCheck);
return ResponseDto.success();
}
} }
...@@ -13,16 +13,25 @@ import com.liquidnet.service.merchant.dto.vo.MerchantFieldsAppliesVo; ...@@ -13,16 +13,25 @@ import com.liquidnet.service.merchant.dto.vo.MerchantFieldsAppliesVo;
import com.liquidnet.service.merchant.dto.vo.MerchantFieldsVo; import com.liquidnet.service.merchant.dto.vo.MerchantFieldsVo;
import com.liquidnet.service.merchant.service.IMerchantFieldsAppliesService; import com.liquidnet.service.merchant.service.IMerchantFieldsAppliesService;
import com.liquidnet.service.merchant.service.MerchantRdmService; import com.liquidnet.service.merchant.service.MerchantRdmService;
import com.liquidnet.service.merchant.util.ObjectUtil;
import com.liquidnet.service.merchant.util.QueueUtil; import com.liquidnet.service.merchant.util.QueueUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.regex.Pattern;
@Slf4j @Slf4j
@Service @Service
...@@ -31,25 +40,44 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS ...@@ -31,25 +40,44 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS
@Autowired @Autowired
MerchantRdmService merchantRdmService; MerchantRdmService merchantRdmService;
@Autowired
private MongoTemplate mongoTemplate;
@Autowired @Autowired
QueueUtil queueUtils; QueueUtil queueUtils;
@Override @Override
public PagedResult<MerchantFieldsVo> search(String name) { public PagedResult<MerchantFieldsVo> search(String name, int page, int size) {
return null; Query query = new Query();
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
query.addCriteria(Criteria.where("isOnline").is(1));
long count = mongoTemplate.count(query, MerchantFieldsVo.class, MerchantFieldsVo.class.getSimpleName());
PagedResult<MerchantFieldsVo> pagedResult = ObjectUtil.getMerchantFieldsVoPagedResult();
if (count > 0) {
query.fields().include("fieldId").include("isOnline").include("claimStatus").include("name");
Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "createdAt"));
query.with(pageable);
List<MerchantFieldsVo> fieldsVoList = mongoTemplate.find(query, MerchantFieldsVo.class, MerchantFieldsVo.class.getSimpleName());
pagedResult.setList(fieldsVoList).setTotal(count, size);
}
return pagedResult;
} }
@Override @Override
public String apply(MerchantFieldsApplyParam parameter) { public String apply(String uid, MerchantFieldsApplyParam parameter) {
String currentUid = CurrentUtil.getCurrentUid();
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
LinkedList<String> toMqSqls = CollectionUtil.linkedListString(); LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
LinkedList<Object[]> fieldUpdateObjs = CollectionUtil.linkedListObjectArr(); LinkedList<Object[]> fieldUpdateObjs = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> fieldApplyInsertObjs = CollectionUtil.linkedListObjectArr(); LinkedList<Object[]> fieldApplyInsertObjs = CollectionUtil.linkedListObjectArr();
long s = System.currentTimeMillis();
// 若认领,查询验证场地 // 若认领,查询验证场地
MerchantFieldsVo fieldsVo = null; MerchantFieldsVo fieldsVo = null;
if (!parameter.getFieldId().isEmpty()) { if (!parameter.getFieldId().isEmpty()) {
...@@ -62,18 +90,10 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS ...@@ -62,18 +90,10 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS
ErrorMapping.ErrorMessage errorMessage = ErrorMapping.get("13002"); ErrorMapping.ErrorMessage errorMessage = ErrorMapping.get("13002");
throw new LiquidnetServiceException(errorMessage.getCode(), errorMessage.getMessage()); throw new LiquidnetServiceException(errorMessage.getCode(), errorMessage.getMessage());
} }
// vo 更改场地状态
fieldsVo.setClaimStatus(2);
fieldsVo.setUpdatedAt(now);
// redis
merchantRdmService.setFieldsVoByFieldId(fieldsVo.getFieldId(), fieldsVo);
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
} }
// vos 申请场地 上限 // 申请场地 vos 上限
List<MerchantFieldsAppliesVo> fieldsAppliesVos = merchantRdmService.getFieldsAppliesVosByUid(currentUid); List<MerchantFieldsAppliesVo> fieldsAppliesVos = merchantRdmService.getFieldsAppliesVosByUid(uid);
if (!CollectionUtils.isEmpty(fieldsAppliesVos)) { if (!CollectionUtils.isEmpty(fieldsAppliesVos)) {
if (fieldsAppliesVos.size() >= 10) { if (fieldsAppliesVos.size() >= 10) {
ErrorMapping.ErrorMessage errorMessage = ErrorMapping.get("13003"); ErrorMapping.ErrorMessage errorMessage = ErrorMapping.get("13003");
...@@ -81,32 +101,44 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS ...@@ -81,32 +101,44 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS
} }
} }
// 申请场地vo long s = System.currentTimeMillis();
if (null != fieldsVo) {
// 场地 vo 更改场地状态
fieldsVo.setClaimStatus(2);
fieldsVo.setUpdatedAt(now);
// 场地 redis
merchantRdmService.setFieldsVoByFieldId(fieldsVo.getFieldId(), fieldsVo);
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
}
// 申请场地 vo
MerchantFieldsAppliesVo fieldsAppliesVo = MerchantFieldsAppliesVo.getNew(); MerchantFieldsAppliesVo fieldsAppliesVo = MerchantFieldsAppliesVo.getNew();
BeanUtils.copyProperties(parameter, fieldsAppliesVo); BeanUtils.copyProperties(parameter, fieldsAppliesVo);
fieldsAppliesVo.setFieldApplyId(IDGenerator.nextSnowId()); fieldsAppliesVo.setFieldApplyId(IDGenerator.nextSnowId());
fieldsAppliesVo.setApplyStatus(0); fieldsAppliesVo.setApplyStatus(0);
if (!fieldsAppliesVo.getFieldId().isEmpty()) { if (null != fieldsVo) {
fieldsAppliesVo.setApplyType("claim"); fieldsAppliesVo.setApplyType("claim");
} else { } else {
fieldsAppliesVo.setApplyType("create"); fieldsAppliesVo.setApplyType("create");
} }
fieldsAppliesVo.setReject(""); fieldsAppliesVo.setReject("");
fieldsAppliesVo.setUid(currentUid); fieldsAppliesVo.setUid(uid);
fieldsAppliesVo.setCreatedAt(now); fieldsAppliesVo.setCreatedAt(now);
// redis // 申请场地 redis
s = System.currentTimeMillis(); s = System.currentTimeMillis();
merchantRdmService.addFieldsAppliesVoByUid(currentUid, fieldsAppliesVos, fieldsAppliesVo); merchantRdmService.addFieldsAppliesVoByUid(uid, fieldsAppliesVos, fieldsAppliesVo);
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s); log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
// sql mapping
if (null != fieldsVo) { if (null != fieldsVo) {
// 场地 sql
toMqSqls.add(SqlMapping.get("merchant_fields.update_claim_status")); toMqSqls.add(SqlMapping.get("merchant_fields.update_claim_status"));
fieldUpdateObjs.add(new Object[]{ fieldUpdateObjs.add(new Object[]{
fieldsVo.getClaimStatus(), fieldsVo.getUpdatedAt(), fieldsVo.getFieldId() fieldsVo.getClaimStatus(), fieldsVo.getUpdatedAt(), fieldsVo.getFieldId()
}); });
} }
// 申请场地 sql
toMqSqls.add(SqlMapping.get("merchant_field_applies.insert")); toMqSqls.add(SqlMapping.get("merchant_field_applies.insert"));
fieldApplyInsertObjs.add(new Object[]{ fieldApplyInsertObjs.add(new Object[]{
fieldsAppliesVo.getFieldApplyId(), fieldsAppliesVo.getApplyStatus(), fieldsAppliesVo.getApplyType(), fieldsAppliesVo.getReject(), fieldsAppliesVo.getUid(), fieldsAppliesVo.getFieldId(), fieldsAppliesVo.getFieldApplyId(), fieldsAppliesVo.getApplyStatus(), fieldsAppliesVo.getApplyType(), fieldsAppliesVo.getReject(), fieldsAppliesVo.getUid(), fieldsAppliesVo.getFieldId(),
...@@ -116,6 +148,7 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS ...@@ -116,6 +148,7 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS
fieldsAppliesVo.getLegalName(), fieldsAppliesVo.getLegalIdentity(), fieldsAppliesVo.getLegalIdentityObverse(), fieldsAppliesVo.getLegalIdentityReverse(), fieldsAppliesVo.getCreatedAt() fieldsAppliesVo.getLegalName(), fieldsAppliesVo.getLegalIdentity(), fieldsAppliesVo.getLegalIdentityObverse(), fieldsAppliesVo.getLegalIdentityReverse(), fieldsAppliesVo.getCreatedAt()
}); });
// mq
s = System.currentTimeMillis(); s = System.currentTimeMillis();
if (null != fieldsVo) { if (null != fieldsVo) {
queueUtils.sendMsgByRedis( queueUtils.sendMsgByRedis(
...@@ -130,7 +163,48 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS ...@@ -130,7 +163,48 @@ public class MerchantFieldsAppliesServiceImpl implements IMerchantFieldsAppliesS
} }
log.debug("#MQ耗时:{}ms", System.currentTimeMillis() - s); log.debug("#MQ耗时:{}ms", System.currentTimeMillis() - s);
return fieldsAppliesVo.getFieldApplyId();
}
@Override
public void editIsCheck(String uid, String fieldId, int isCheck) {
LocalDateTime now = LocalDateTime.now();
MerchantFieldsVo fieldsVo = merchantRdmService.getFieldsVoByFieldId(fieldId);
if (null == fieldsVo || !fieldsVo.getUid().equals(uid)) {
ErrorMapping.ErrorMessage errorMessage = ErrorMapping.get("13001");
throw new LiquidnetServiceException(errorMessage.getCode(), errorMessage.getMessage());
}
// 场地 vo 更改是否自动审核
fieldsVo.setIsCheck(isCheck > 0 ? 1 : 0);
fieldsVo.setUpdatedAt(now);
// 场地 redis
long s = System.currentTimeMillis();
merchantRdmService.setFieldsVoByFieldId(fieldsVo.getFieldId(), fieldsVo);
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
return fieldsAppliesVo.getFieldId(); // 场地 mongo
Query query = Query.query(Criteria.where("fieldId").is(fieldsVo.getFieldId()));
Update update = Update.update("isCheck", fieldsVo.getIsCheck()).set("updateAt", fieldsVo.getUpdatedAt());
mongoTemplate.updateFirst(query, update, MerchantFieldsVo.class, MerchantFieldsVo.class.getSimpleName());
// 场地 sql
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
LinkedList<Object[]> fieldUpdateObjs = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("merchant_fields.update_is_check"));
fieldUpdateObjs.add(new Object[]{
fieldsVo.getIsCheck(), fieldsVo.getUpdatedAt(), fieldsVo.getFieldId()
});
// mq
s = System.currentTimeMillis();
queueUtils.sendMsgByRedis(
MQConst.MerchantQueue.SQL_MERCHANT_FIELD.getKey(),
SqlMapping.gets(toMqSqls, fieldUpdateObjs)
);
log.debug("#MQ耗时:{}ms", System.currentTimeMillis() - s);
} }
} }
package com.liquidnet.service.merchant.util; package com.liquidnet.service.merchant.util;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.merchant.dto.vo.MerchantFieldsAppliesVo; import com.liquidnet.service.merchant.dto.vo.MerchantFieldsAppliesVo;
import com.liquidnet.service.merchant.dto.vo.MerchantFieldsVo;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -8,12 +10,20 @@ import java.util.ArrayList; ...@@ -8,12 +10,20 @@ import java.util.ArrayList;
public class ObjectUtil { public class ObjectUtil {
private static final ArrayList<MerchantFieldsAppliesVo> merchantFieldsAppliesVoArrayList = new ArrayList<>(); private static final ArrayList<MerchantFieldsAppliesVo> merchantFieldsAppliesVoArrayList = new ArrayList<>();
private static final PagedResult<MerchantFieldsVo> merchantFieldsVoPagedResult = new PagedResult<>();
private static final BasicDBObject basicDBObject = new BasicDBObject(); private static final BasicDBObject basicDBObject = new BasicDBObject();
public static ArrayList<MerchantFieldsAppliesVo> getMerchantFieldsAppliesVoArrayList() { public static ArrayList<MerchantFieldsAppliesVo> getMerchantFieldsAppliesVoArrayList() {
return (ArrayList<MerchantFieldsAppliesVo>) merchantFieldsAppliesVoArrayList.clone(); return (ArrayList<MerchantFieldsAppliesVo>) merchantFieldsAppliesVoArrayList.clone();
} }
public static PagedResult<MerchantFieldsVo> getMerchantFieldsVoPagedResult() {
return merchantFieldsVoPagedResult.clone();
}
public static BasicDBObject cloneBasicDBObject() { public static BasicDBObject cloneBasicDBObject() {
return (BasicDBObject) basicDBObject.clone(); return (BasicDBObject) basicDBObject.clone();
} }
......
# --------------------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------------------
merchant_fields.update_claim_status=UPDATE merchant_fields SET claim_status = ?, updated_at = ? WHERE field_id = ? merchant_fields.update_claim_status=UPDATE merchant_fields SET claim_status = ?, updated_at = ? WHERE field_id = ?
merchant_fields.update_is_check=UPDATE merchant_fields SET is_check = ?, updated_at = ? WHERE field_id = ?
# --------------------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------------------
merchant_field_applies.insert=INSERT INTO merchant_field_applies (field_apply_id, apply_status, apply_type, reject, uid, field_id, name, logo, background, description, built_date, province_id, province_name, city_id, city_name, district_id, district_name, address, longitude, latitude, contact_name, contact_email, company_name, license_code, license_img, legal_name, legal_identity, legal_identity_obverse, legal_identity_reverse, created_at) VALUE (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) merchant_field_applies.insert=INSERT INTO merchant_field_applies (field_apply_id, apply_status, apply_type, reject, uid, field_id, name, logo, background, description, built_date, province_id, province_name, city_id, city_name, district_id, district_name, address, longitude, latitude, contact_name, contact_email, company_name, license_code, license_img, legal_name, legal_identity, legal_identity_obverse, legal_identity_reverse, created_at) VALUE (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
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