Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app(backend)/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>6.4.4.Final</version>
</dependency>

<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.knockoutzone.backend.controller;

import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.knockoutzone.backend.entity.User;
import com.knockoutzone.backend.service.UserService;

import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {

private final UserService userService;

@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return ResponseEntity.ok(userService.createUser(user));
}

@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}

@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}

@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
return ResponseEntity.ok(userService.updateUser(id, user));
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,32 @@
package com.knockoutzone.backend.entity;

import java.time.LocalDate;

import com.knockoutzone.backend.entity.enums.*;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.envers.Audited;

import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.knockoutzone.backend.entity.enums.EventMode;
import com.knockoutzone.backend.entity.enums.Platform;
import com.knockoutzone.backend.entity.enums.ScheduleType;
import com.knockoutzone.backend.entity.enums.TournamentStatus;
import com.knockoutzone.backend.entity.enums.TournamentType;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
Expand All @@ -23,6 +43,11 @@ public class Tournament extends AuditingEntity {
private Long id;
private String name;

@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "host_id", nullable = false)
private User host;

@Column(length = 1000)
private String description;
private String location;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.knockoutzone.backend.entity;


import org.hibernate.envers.Audited;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.OneToMany;
import jakarta.persistence.CascadeType;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonManagedReference;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;


@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Audited(withModifiedFlag = true)
@Table(name="users")
public class User extends AuditingEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String username;

private String email;

@JsonIgnore
private String password;

private String firstName;

private String lastName;

private String phoneNumber;

private String profilePictureUrl;

private Boolean isEmailVerified;

private Boolean isActive;

@OneToMany(mappedBy = "host", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private List<Tournament> tournamentsHosted = new ArrayList<>();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.knockoutzone.backend.entity.enums;

public enum EventMode {
ONLINE,
OFFLINE,
HYBRID
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.knockoutzone.backend.entity.enums;

public enum Platform {
PC,
CONSOLE,
MOBILE,
CROSS_PLATFORM,
OTHER
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.knockoutzone.backend.entity.enums;

public enum ScheduleType {
FIXED_TIME,
FLEXIBLE_TIME,
ADMIN_SCHEDULED,
PLAYER_COORDINATED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.knockoutzone.backend.entity.enums;

public enum TournamentStatus {
UPCOMING,
ONGOING,
COMPLETED,
CANCELLED,
POSTPONED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.knockoutzone.backend.entity.enums;

public enum TournamentType {
SOLO,
TEAM
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.knockoutzone.backend.repository;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.knockoutzone.backend.entity.User;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

Optional<User> findByEmail(String email);

Optional<User> findByUsername(String username);

Boolean existsByEmail(String email);

Boolean existsByUsername(String username);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.knockoutzone.backend.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.knockoutzone.backend.entity.User;
import com.knockoutzone.backend.repository.UserRepository;

import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class UserService {

private final UserRepository userRepository;

public User createUser(User user) {
return userRepository.save(user);
}

public User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException("User not found with id: " + id));
}

public List<User> getAllUsers() {
return userRepository.findAll();
}

public User updateUser(Long id, User updatedUser) {
User existingUser = getUserById(id);
existingUser.setUsername(updatedUser.getUsername());
existingUser.setEmail(updatedUser.getEmail());
existingUser.setFirstName(updatedUser.getFirstName());
existingUser.setLastName(updatedUser.getLastName());
existingUser.setPhoneNumber(updatedUser.getPhoneNumber());
existingUser.setProfilePictureUrl(updatedUser.getProfilePictureUrl());
existingUser.setIsActive(updatedUser.getIsActive());

return userRepository.save(existingUser);
}

public void deleteUser(Long id) {
if (!userRepository.existsById(id)) {
throw new EntityNotFoundException("User not found with id: " + id);
}
userRepository.deleteById(id);
}

public boolean existsByEmail(String email) {
return userRepository.existsByEmail(email);
}

public boolean existsByUsername(String username) {
return userRepository.existsByUsername(username);
}
}