Merge branch 'master' of git.inpt.fr:tocard-inc/enseeiht/projet-web
This commit is contained in:
commit
a1deb49b99
|
@ -10,3 +10,6 @@ end_of_line = lf
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.yml]
|
||||||
|
indent_size = 2
|
||||||
|
|
|
@ -34,6 +34,7 @@ services:
|
||||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
||||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
||||||
volumes:
|
volumes:
|
||||||
|
- ./mariadb-init:/docker-entrypoint-initdb.d/ # seed volume
|
||||||
- ./mariadb-volume/:/var/lib/mysql/ # data storage
|
- ./mariadb-volume/:/var/lib/mysql/ # data storage
|
||||||
ports:
|
ports:
|
||||||
- "3306:3306"
|
- "3306:3306"
|
||||||
|
|
107
docker/mariadb-init/pixels.sql
Normal file
107
docker/mariadb-init/pixels.sql
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
CREATE TABLE Pixel (
|
||||||
|
id bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
price int(11) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
INSERT INTO Pixel(id, price) VALUES
|
||||||
|
(1,1),
|
||||||
|
(2,1),
|
||||||
|
(3,1),
|
||||||
|
(4,1),
|
||||||
|
(5,1),
|
||||||
|
(6,1),
|
||||||
|
(7,1),
|
||||||
|
(8,1),
|
||||||
|
(9,1),
|
||||||
|
(10,1),
|
||||||
|
(11,1),
|
||||||
|
(12,1),
|
||||||
|
(13,1),
|
||||||
|
(14,1),
|
||||||
|
(15,1),
|
||||||
|
(16,1),
|
||||||
|
(17,1),
|
||||||
|
(18,1),
|
||||||
|
(19,1),
|
||||||
|
(20,1),
|
||||||
|
(21,1),
|
||||||
|
(22,1),
|
||||||
|
(23,1),
|
||||||
|
(24,1),
|
||||||
|
(25,1),
|
||||||
|
(26,1),
|
||||||
|
(27,1),
|
||||||
|
(28,1),
|
||||||
|
(29,1),
|
||||||
|
(30,1),
|
||||||
|
(31,1),
|
||||||
|
(32,1),
|
||||||
|
(33,1),
|
||||||
|
(34,1),
|
||||||
|
(35,1),
|
||||||
|
(36,1),
|
||||||
|
(37,1),
|
||||||
|
(38,1),
|
||||||
|
(39,1),
|
||||||
|
(40,1),
|
||||||
|
(41,1),
|
||||||
|
(42,1),
|
||||||
|
(43,1),
|
||||||
|
(44,1),
|
||||||
|
(45,1),
|
||||||
|
(46,1),
|
||||||
|
(47,1),
|
||||||
|
(48,1),
|
||||||
|
(49,1),
|
||||||
|
(50,1),
|
||||||
|
(51,1),
|
||||||
|
(52,1),
|
||||||
|
(53,1),
|
||||||
|
(54,1),
|
||||||
|
(55,1),
|
||||||
|
(56,1),
|
||||||
|
(57,1),
|
||||||
|
(58,1),
|
||||||
|
(59,1),
|
||||||
|
(60,1),
|
||||||
|
(61,1),
|
||||||
|
(62,1),
|
||||||
|
(63,1),
|
||||||
|
(64,1),
|
||||||
|
(65,1),
|
||||||
|
(66,1),
|
||||||
|
(67,1),
|
||||||
|
(68,1),
|
||||||
|
(69,1),
|
||||||
|
(70,1),
|
||||||
|
(71,1),
|
||||||
|
(72,1),
|
||||||
|
(73,1),
|
||||||
|
(74,1),
|
||||||
|
(75,1),
|
||||||
|
(76,1),
|
||||||
|
(77,1),
|
||||||
|
(78,1),
|
||||||
|
(79,1),
|
||||||
|
(80,1),
|
||||||
|
(81,1),
|
||||||
|
(82,1),
|
||||||
|
(83,1),
|
||||||
|
(84,1),
|
||||||
|
(85,1),
|
||||||
|
(86,1),
|
||||||
|
(87,1),
|
||||||
|
(88,1),
|
||||||
|
(89,1),
|
||||||
|
(90,1),
|
||||||
|
(91,1),
|
||||||
|
(92,1),
|
||||||
|
(93,1),
|
||||||
|
(94,1),
|
||||||
|
(95,1),
|
||||||
|
(96,1),
|
||||||
|
(97,1),
|
||||||
|
(98,1),
|
||||||
|
(99,1),
|
||||||
|
(100,1);
|
|
@ -1,31 +0,0 @@
|
||||||
package com.pixels.beans;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
|
||||||
import javax.validation.constraints.NotBlank;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Entity
|
|
||||||
@NoArgsConstructor
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@NamedQuery(name = "Groupe.list", query = "SELECT g FROM Groupe g")
|
|
||||||
public class Groupe implements Serializable {
|
|
||||||
|
|
||||||
@Id // clé primaire
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
// nom du groupe
|
|
||||||
@NonNull
|
|
||||||
@NotBlank
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@OneToOne // le wallet commun à tous les membres du groupe
|
|
||||||
private Wallet wallet;
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
package com.pixels.beans;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Entity
|
|
||||||
@NoArgsConstructor
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@NamedQuery(name = "Permission.list", query = "SELECT pe FROM Permission pe")
|
|
||||||
public class Permission implements Serializable {
|
|
||||||
|
|
||||||
@Id // clé primaire
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
// type de la permission
|
|
||||||
@NonNull
|
|
||||||
@NotNull
|
|
||||||
private Integer type;
|
|
||||||
}
|
|
|
@ -48,11 +48,11 @@ public class Pixel implements Serializable {
|
||||||
@OneToMany(mappedBy = "pixel")
|
@OneToMany(mappedBy = "pixel")
|
||||||
private List<Transaction> transactions;
|
private List<Transaction> transactions;
|
||||||
|
|
||||||
Color getColor() {
|
public Color getColor() {
|
||||||
return new Color(color);
|
return new Color(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setColor(Color color) {
|
public void setColor(Color color) {
|
||||||
this.color = color.getRGB();
|
this.color = color.getRGB();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
package com.pixels.beans;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Entity
|
|
||||||
@NoArgsConstructor
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@NamedQuery(name = "Role.list", query = "SELECT r FROM Role r")
|
|
||||||
public class Role implements Serializable {
|
|
||||||
|
|
||||||
@Id // clé primaire du code
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
// type du role
|
|
||||||
@NonNull
|
|
||||||
@NotNull
|
|
||||||
private Integer type;
|
|
||||||
}
|
|
|
@ -8,7 +8,6 @@ import java.awt.Color;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -16,7 +15,6 @@ import java.util.Date;
|
||||||
@Data
|
@Data
|
||||||
@Entity
|
@Entity
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@RequiredArgsConstructor
|
|
||||||
@NamedQuery(name = "Transaction.list", query = "SELECT t FROM Transaction t order by t.time desc")
|
@NamedQuery(name = "Transaction.list", query = "SELECT t FROM Transaction t order by t.time desc")
|
||||||
public class Transaction implements Serializable {
|
public class Transaction implements Serializable {
|
||||||
|
|
||||||
|
@ -24,7 +22,7 @@ public class Transaction implements Serializable {
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
// prix de la transaction*
|
// prix de la transaction
|
||||||
@NonNull
|
@NonNull
|
||||||
@NotNull
|
@NotNull
|
||||||
private Integer price;
|
private Integer price;
|
||||||
|
@ -39,17 +37,27 @@ public class Transaction implements Serializable {
|
||||||
@NotNull
|
@NotNull
|
||||||
private Date time;
|
private Date time;
|
||||||
|
|
||||||
@ManyToOne // wallet acheteur
|
// wallet acheteur
|
||||||
private Wallet wallet;
|
@ManyToOne
|
||||||
|
private User buyer;
|
||||||
|
|
||||||
@ManyToOne // pixel acheté
|
// pixel acheté
|
||||||
|
@ManyToOne
|
||||||
private Pixel pixel;
|
private Pixel pixel;
|
||||||
|
|
||||||
Color getColor() {
|
public Color getColor() {
|
||||||
return new Color(color);
|
return new Color(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setColor(Color color) {
|
public void setColor(Color color) {
|
||||||
this.color = color.getRGB();
|
this.color = color.getRGB();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Transaction(Date time, Pixel pixel) {
|
||||||
|
this.time = time;
|
||||||
|
this.pixel = pixel;
|
||||||
|
this.price = pixel.getPrice();
|
||||||
|
this.color = pixel.getColor().getRGB();
|
||||||
|
this.buyer = pixel.getOwner();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.pixels.beans;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
import com.pixels.utils.Hash;
|
import com.pixels.utils.Hash;
|
||||||
|
|
||||||
|
@ -39,11 +40,13 @@ public class User implements Serializable {
|
||||||
@NotBlank
|
@NotBlank
|
||||||
private String hashPassword;
|
private String hashPassword;
|
||||||
|
|
||||||
@OneToOne // portefeuille
|
// portefeuille
|
||||||
private Wallet wallet;
|
@OneToMany
|
||||||
|
private List<Pixel> pixels;
|
||||||
|
|
||||||
@ManyToOne // permission
|
// le solde de l'utilisateur
|
||||||
private Permission permission;
|
@NotNull
|
||||||
|
private Integer balance = 0;
|
||||||
|
|
||||||
// pixels possédés
|
// pixels possédés
|
||||||
@OneToMany(mappedBy = "owner")
|
@OneToMany(mappedBy = "owner")
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
package com.pixels.beans;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
|
||||||
import javax.validation.constraints.NotBlank;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Entity
|
|
||||||
@NoArgsConstructor
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@NamedQuery(name = "Wallet.list", query = "SELECT w FROM Wallet w")
|
|
||||||
public class Wallet implements Serializable {
|
|
||||||
|
|
||||||
@Id // clé primaire du code
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
// solde du wallet
|
|
||||||
@NonNull
|
|
||||||
@NotBlank
|
|
||||||
private Integer balance;
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "wallet") // transactions associées au wallet
|
|
||||||
private List<Transaction> transactions;
|
|
||||||
}
|
|
|
@ -5,9 +5,8 @@ import javax.persistence.EntityManager;
|
||||||
import javax.persistence.PersistenceContext;
|
import javax.persistence.PersistenceContext;
|
||||||
import javax.persistence.TypedQuery;
|
import javax.persistence.TypedQuery;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
import javax.ws.rs.DELETE;
|
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.NotFoundException;
|
||||||
import javax.ws.rs.PUT;
|
import javax.ws.rs.PUT;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
|
@ -38,16 +37,11 @@ public class PixelService {
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
public String single(@PathParam("id") Long id) {
|
public String single(@PathParam("id") Long id) {
|
||||||
Pixel pixel = em.find(Pixel.class, id);
|
Pixel pixel = em.find(Pixel.class, id);
|
||||||
|
if (pixel == null) {
|
||||||
|
throw new NotFoundException();
|
||||||
|
} else {
|
||||||
return gson.toJson(pixel);
|
return gson.toJson(pixel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@POST
|
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
|
||||||
public String add(String json) {
|
|
||||||
Pixel pixel = gson.fromJson(json, Pixel.class);
|
|
||||||
em.persist(pixel);
|
|
||||||
return gson.toJson(pixel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@PUT
|
@PUT
|
||||||
|
@ -60,13 +54,4 @@ public class PixelService {
|
||||||
em.merge(pixel);
|
em.merge(pixel);
|
||||||
return gson.toJson(pixel);
|
return gson.toJson(pixel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@DELETE
|
|
||||||
@Path("{id}")
|
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
|
||||||
public String remove(@PathParam("id") Long id) {
|
|
||||||
Pixel pixel = em.find(Pixel.class, id);
|
|
||||||
em.remove(pixel);
|
|
||||||
return gson.toJson(pixel);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
80
src/main/java/com/pixels/services/UserService.java
Normal file
80
src/main/java/com/pixels/services/UserService.java
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
package com.pixels.services;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.ejb.Singleton;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.PersistenceContext;
|
||||||
|
import javax.persistence.TypedQuery;
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.NotFoundException;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.pixels.beans.Pixel;
|
||||||
|
import com.pixels.beans.Transaction;
|
||||||
|
import com.pixels.beans.User;
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
@Path("/user")
|
||||||
|
public class UserService {
|
||||||
|
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager em;
|
||||||
|
|
||||||
|
Gson gson = new Gson();
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public String list() {
|
||||||
|
TypedQuery<User> query = em.createNamedQuery("User.list", User.class);
|
||||||
|
return gson.toJson(query.getResultList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{id}")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public String single(@PathParam("id") Long id) {
|
||||||
|
User user = em.find(User.class, id);
|
||||||
|
if (user == null) {
|
||||||
|
throw new NotFoundException();
|
||||||
|
} else {
|
||||||
|
return gson.toJson(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{id_user}/buy/{id_pixel}")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public String buy_pixel(@PathParam("id") Long id_pixel, @PathParam("id") Long id_user, String json) {
|
||||||
|
// on récupère les informations du changement
|
||||||
|
Pixel pixel_new_infos = gson.fromJson(json, Pixel.class);
|
||||||
|
|
||||||
|
// on récupère le pixel de la db via son id
|
||||||
|
Pixel pixel = em.find(Pixel.class, id_pixel);
|
||||||
|
|
||||||
|
// on récupère le nouveau proprio
|
||||||
|
User user = em.find(User.class, id_user);
|
||||||
|
|
||||||
|
// on update le pixel
|
||||||
|
pixel.setOwner(user);
|
||||||
|
pixel.setColor(pixel_new_infos.getColor());
|
||||||
|
pixel.setDescription(pixel_new_infos.getDescription());
|
||||||
|
pixel.setPrice(pixel.getPrice() + 1);
|
||||||
|
|
||||||
|
// on ajoute la transaction
|
||||||
|
Date now = new Date(System.currentTimeMillis());
|
||||||
|
Transaction new_transaction = new Transaction(now, pixel);
|
||||||
|
em.persist(new_transaction);
|
||||||
|
|
||||||
|
// on update le pixel dans la db
|
||||||
|
em.merge(pixel);
|
||||||
|
|
||||||
|
return gson.toJson(pixel);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue