挑战目标: MockNative Camp前端
今天要来实作更新会员资料API,我的习惯是将request跟response都使用Object class,这样可以直接做NonNull的检查以及避免接收到不相关的资料或者是不想要某些栏位被外部更动,像是会员状态、金币等等的栏位是不允许被呼叫API更改的。
PatchReq.java 是存放可以被update的栏位,这种用法是我之前在写Python的习惯,在Python中我会使用marshmallow,更好的是假设有的栏位没有带,则会不会出现在dict中,而Java Object宣吿後呼叫时没有带的参数会是null如果是boolean则会是false。
我这里有两种选择
通常都是要跟前端沟通,但前端就是我(泪,所以我们使用第二种方式。
PatchReq.java
package com.mock.nativecamp.payload.user;
import lombok.Data;
@Data
public class PatchReq {
private String name;
private String email;
private String password;
private String birthday;
private String gender;
private String credit_token;
private String profilePic;
private boolean news;
private String userNationality;
private String userResidence;
private boolean genderNotify;
private boolean birthdayNotify;
private boolean userNationalityNotify;
private boolean userResidenceNotify;
private String timezone;
}
UsersController.java 新增patch接口
@PatchMapping(path = "/patch/{userId}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public Object patchUser(@PathVariable("userId") String userId, @RequestBody PatchReq patchReq) {
return usersService.updateUser(userId, patchReq);
}
在实作时有发现一个问提,在model中宣告id,在UsersRepository中要新增findById会撞到一定要用
Option<Users> findById(String id);
所以我改变了model的命名,
Users.java
package com.mock.nativecamp.model;
import com.mock.nativecamp.payload.user.PatchReq;
import com.mock.nativecamp.payload.user.SignupReq;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "Users")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users {
@Id
private String userId;
private String name;
private String email;
private String password;
private String status;
private String coin;
private String timezone;
private String payMethod;
private String nextPayCheck;
private String ssoId;
private String gender;
private String creditToken;
private String profilePic;
private boolean news;
private String birthday;
private String userNationality;
private String userResidence;
private boolean genderNotify;
private boolean birthdayNotify;
private boolean userNationalityNotify;
private boolean userResidenceNotify;
public Users signUser(SignupReq signupReq) {
Users user = new Users();
user.setName(signupReq.getName());
user.setEmail(signupReq.getEmail());
user.setPassword(signupReq.getPassword());
user.setBirthday(signupReq.getBirthday());
user.setGender(signupReq.getGender());
user.setCreditToken(signupReq.getCredit_token());
return user;
}
public Users updateUser(Users user, PatchReq patchReq) {
user.setName(patchReq.getName());
user.setEmail(patchReq.getEmail());
user.setPassword(patchReq.getPassword());
user.setBirthday(patchReq.getBirthday());
user.setGender(patchReq.getGender());
user.setCreditToken(patchReq.getCredit_token());
user.setProfilePic(patchReq.getProfilePic());
user.setNews(patchReq.getNews());
user.setUserNationality(patchReq.getUserNationality());
user.setUserNationalityNotify(patchReq.getUserNationalityNotify());
user.setUserResidence(patchReq.getUserNationality());
user.setUserNationalityNotify(patchReq.getUserNationalityNotify());
user.setGenderNotify(patchReq.getGenderNotify());
user.setBirthdayNotify(patchReq.getBirthdayNotify());
user.setTimezone(patchReq.getTimezone());
return user;
}
}
UsersRepository.java
package com.mock.nativecamp.repository;
import com.mock.nativecamp.model.Users;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UsersRepository extends MongoRepository<Users, String> {
Users findByUserId(String id);
}
UsersService.java
package com.mock.nativecamp.service;
import com.mock.nativecamp.model.Users;
import com.mock.nativecamp.payload.user.PatchReq;
import com.mock.nativecamp.payload.user.SignupReq;
import com.mock.nativecamp.repository.UsersRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Slf4j
@Service
public class UsersService {
@Autowired
private UsersRepository usersRepository;
public Object signupUser(SignupReq signupReq) {
Users user = new Users().signUser(signupReq);
usersRepository.save(user);
return new ResponseEntity(HttpStatus.ACCEPTED);
}
public Object getAllUsers() {
return usersRepository.findAll();
}
public Object getUser(String id) {
return usersRepository.findByUserId(id);
}
public Object updateUser(String userId, PatchReq patchReq) {
Users user = usersRepository.findByUserId(userId);
user.updateUser(user, patchReq);
usersRepository.save(user);
return new ResponseEntity(HttpStatus.ACCEPTED);
}
}
因为修改了model,所以我将db资料清空後来重新测试一次
新增会员
查询会员
更新会员
再次查询会员
跟预期的一样,一定要全带不然会把其他的也给更新。
今天我们要实作一个华氏摄氏的温度转换器,首先先来设计他的介面 import javax.swing....
看完这篇文章你会得到的成果图 前言 我们接下来的讨论,会基於读者已经先读过我 day5 文章 的架构...
什麽是回测? 在金融领域,回测通过测试交易策略,并根据历史资料的表现来核查其可行性。换句话说,它使用...
基本语法笔记 四舍五入: Math.round(); 无条件进位: Math.ceil(); 无条件...
接下来让我们开始来实际安装TiDB。 TiDB在4.0版本之後推出了Tiup这个安装工具。功能十分齐...