[Day 9]人不作死就不会死(前端篇)

挑战目标: MockNative Camp前端


今天要来实作更新会员资料API,我的习惯是将request跟response都使用Object class,这样可以直接做NonNull的检查以及避免接收到不相关的资料或者是不想要某些栏位被外部更动,像是会员状态、金币等等的栏位是不允许被呼叫API更改的。

PatchReq.java 是存放可以被update的栏位,这种用法是我之前在写Python的习惯,在Python中我会使用marshmallow,更好的是假设有的栏位没有带,则会不会出现在dict中,而Java Object宣吿後呼叫时没有带的参数会是null如果是boolean则会是false。
我这里有两种选择

  • 只传修改部分,在Java这边去判断每一个是否是Null而boolean则是要检查是否与原有的一样
  • 另一种就是由前端传送所有栏位,如果没有修改也一样,而後端就只要直接接收然後更新。

通常都是要跟前端沟通,但前端就是我(泪,所以我们使用第二种方式。
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资料清空後来重新测试一次
新增会员
https://ithelp.ithome.com.tw/upload/images/20210924/201403586Qqhyzd9fM.png

查询会员
https://ithelp.ithome.com.tw/upload/images/20210924/20140358fypxjIKNLw.png
更新会员
https://ithelp.ithome.com.tw/upload/images/20210924/20140358ngufMKnYNI.png
再次查询会员
https://ithelp.ithome.com.tw/upload/images/20210924/20140358YuFoU2SqU2.png
跟预期的一样,一定要全带不然会把其他的也给更新。


<<:  DAY 9 角角恶魔

>>:  Day9 Topic in Cpp

[Day28] CH13:画出你的藏宝图——事件处理(上)

今天我们要实作一个华氏摄氏的温度转换器,首先先来设计他的介面 import javax.swing....

【没钱买ps,PyQt自己写】Day 11 - 以 Qlabel 在 PyQt 中显示图片 (基於 QImage 使用 OpenCV)

看完这篇文章你会得到的成果图 前言 我们接下来的讨论,会基於读者已经先读过我 day5 文章 的架构...

[Day 14] 回测分析

什麽是回测? 在金融领域,回测通过测试交易策略,并根据历史资料的表现来核查其可行性。换句话说,它使用...

33岁转职者的前端笔记-DAY 21 英寸转公分单位转换器练习笔记

基本语法笔记 四舍五入: Math.round(); 无条件进位: Math.ceil(); 无条件...

Day 11 - 安装(ㄧ)Tiup工具

接下来让我们开始来实际安装TiDB。 TiDB在4.0版本之後推出了Tiup这个安装工具。功能十分齐...