Como implementar isso no back-end?

E aí, pessoal, tudo bem? Bem, vou ser sincero em dizer que estou desenvolvendo uma nova implementação que jamais fiz antes e, por isso, estou pesquisando bastante e até perguntando em fóruns para os mais experientes. Por exemplo, um projeto simples, onde um cliente possui muitos endereços, mas um endereço pertence a apenas um único cliente.

Vamos aos exemplos: No banco de dados, há dois clientes:

{
  Id: 1,
  Username: "Clark Kent",
  Password: "Admin799"
}

{
  Id: 2,
  Username: "Maite Perroni",
  Password: "Common999"
}

O primeiro cliente, “Clark Kent”, será o administrador do sistema, ou seja, poderá manipular todo o sistema, permitindo adicionar novos clientes, listar todos e apagar. O segundo cliente, “Maite Perroni”, será uma conta comum, ou seja, poderá manipular apenas os seus próprios relacionamentos, entre eles, adicionar um novo endereço, listar todos, atualizar e excluir.

Bem, conforme os exemplos, podemos dizer que os clientes já foram criados e fizeram login em suas respectivas contas, certo? Agora, como eu poderia implementar o caso em que o cliente “Clark Kent” deseja adicionar um novo endereço à sua conta, mas o endereço no banco de dados ficou nulo e não referenciou a conta do cliente que foi adicionado, por exemplo:

Id | Username | Password
1  | ClarkKent | Admin799

Id | Email     | Número | Client_Id
1 | ClarkKent@ | 2932183129 | null

Estou muito confuso com isso, pois minha única lógica e saída realmente é desenvolver um serviço: ClienteAddressService, que terá cada método CRUD. Vamos dar o exemplo do save:

public void createClienteAddress(int clientId, Address address) {
    // Primeiro, vai buscar no repositório para verificar se o clientId existe.
    // Caso exista, vai vincular o address à conta do cliente.
    // Também vai vincular o id do cliente na tabela de Address.
}

Assim, como funcionaria uma criação de ClienteAddressController, por exemplo:

@Route("/clients/addresses")
@Request("/clientId/addressId")
public void createClienteAddress(int clientId, Address address) {}

Sem dizer que após isso, irei implementar segurança e autorização. Está correta a minha lógica? Aceitaria muito ajuda.

Tanto o service e o controller ficou assim, conforme a lógica que tive:

SERVICE:
@Service
@AllArgsConstructor
public class UserAddressService {
    private final UserService userService;
    private final AddressService addressService;

    public void save(UUID userId, Address address) {
        var existUser = userService.getById(userId);

        existUser.getAddresses().add(address);
        address.setUserId(existUser.getId());
        addressService.save(address);
    }

    public Optional<Address> getById(UUID userId, UUID addressId) {
        var existUser = userService.getById(userId);
        var existAddress = addressService.getById(addressId);

        return existUser.getAddresses().stream()
                .filter(id -> id.getId() == existAddress.getId())
                .findFirst();
    }
}

CONTROLLER:

@RestController
@RequestMapping("/users/addresses")
@AllArgsConstructor
public class UserAddressController {
    private final UserAddressService service;

    @PostMapping("/{userId}")
    public ResponseEntity<Address> save(@PathVariable UUID userId, @RequestBody Address address) {
        var savedAddress = service.save(userId, address);

        return ResponseEntity
                .status(HttpStatus.CREATED)
                .body(savedAddress);
    }

    @GetMapping("/{userId/{addressId}")
    public ResponseEntity<Address> getById(@PathVariable UUID userId, UUID addressId) {
        var existAddress = service.getById(userId, addressId);

        return ResponseEntity
                .status(HttpStatus.OK)
                .body(existAddress.get());
    }
}