Skip to content

Commit d943af2

Browse files
author
Lorenzo
committed
feat/process-dashboard-metrics
1 parent 81652d9 commit d943af2

File tree

15 files changed

+434
-26
lines changed

15 files changed

+434
-26
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
package com.outfitlab.project.domain.interfaces.repositories;
22
import com.outfitlab.project.domain.model.CombinationAttemptModel;
3+
import com.outfitlab.project.domain.model.PrendaModel;
4+
5+
import java.util.List;
36

47
public interface CombinationAttemptRepository {
58

69
Long save(CombinationAttemptModel attempt);
10+
11+
List<CombinationAttemptModel> findAllByPrenda(Long prendaId);
12+
13+
List<CombinationAttemptModel> findLastNDays(int i);
14+
15+
List<CombinationAttemptModel> findAll();
716
}

src/main/java/com/outfitlab/project/domain/interfaces/repositories/GarmentRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@ void createGarment(
3838

3939
List<OcasionModel> findAllOcasiones();
4040

41+
List<PrendaModel> findAll();
4142
}

src/main/java/com/outfitlab/project/domain/interfaces/repositories/UserRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import com.outfitlab.project.domain.exceptions.UserNotFoundException;
44
import com.outfitlab.project.domain.model.UserModel;
5+
import com.outfitlab.project.domain.model.dto.UserWithBrandsDTO;
56
import jakarta.transaction.Transactional;
7+
import org.springframework.data.domain.Page;
68

9+
import java.util.Collection;
710
import java.util.List;
811
import java.util.Optional;
912

@@ -32,4 +35,10 @@ public interface UserRepository {
3235
UserModel updateUser(String name, String lastname, String email, String password, String confirmPassword, String newImageUrl);
3336

3437
UserModel findById(Long userId) throws UserNotFoundException;
38+
39+
Page<UserWithBrandsDTO> getAllBrandsWithUserRelated(int page);
40+
41+
List<UserWithBrandsDTO> getNotApprovedBrands();
42+
43+
List<UserModel> findAllWithRoleUserAndAdmin();
3544
}

src/main/java/com/outfitlab/project/domain/model/PrendaModel.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ public PrendaModel(String nombre, BrandModel marca, String tipo, String imagenUr
2626
this.ocasiones = ocasiones;
2727
}
2828

29+
30+
public PrendaModel(Long id, String nombre, String imagenUrl, BrandModel marca) {
31+
this.id = id;
32+
this.nombre = nombre;
33+
this.imagenUrl = imagenUrl;
34+
this.marca = marca;
35+
}
36+
2937
public Long getId() {return id;}
3038

3139
public void setId(Long id) {this.id = id;}

src/main/java/com/outfitlab/project/domain/model/UserModel.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public UserModel(String name, String lastName, String email, Role role, boolean
6464
this.brand = brand;
6565
}
6666

67+
public UserModel(Long id, String email) {
68+
this.id = id;
69+
this.email = email;
70+
}
71+
6772
/*
6873
* public String getPassword() {
6974
* return "";
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.outfitlab.project.domain.model.dto;
2+
3+
import java.util.List;
4+
5+
public class PrendaDashboardDTO {
6+
public static record DailyPrueba(int dia, int pruebas) {}
7+
8+
public static record TopPrenda(
9+
Long id,
10+
String nombre,
11+
String color,
12+
String imagenUrl,
13+
int pruebas,
14+
List<DailyPrueba> daily
15+
) {} public static record DiaPrueba(int dia, int pruebas) {}
16+
17+
public static record ColorConversion(String color, int pruebas, int favoritos, double conversion) {}
18+
19+
public static class ComboPopular {
20+
private final String superior;
21+
private final String inferior;
22+
private final String imgSup;
23+
private final String imgInf;
24+
private int pruebas;
25+
private int thumbs;
26+
27+
public ComboPopular(String superior, String inferior, String imgSup, String imgInf, int pruebas, int thumbs) {
28+
this.superior = superior;
29+
this.inferior = inferior;
30+
this.imgSup = imgSup;
31+
this.imgInf = imgInf;
32+
this.pruebas = pruebas;
33+
this.thumbs = thumbs;
34+
}
35+
36+
public String getSuperior() { return superior; }
37+
public String getInferior() { return inferior; }
38+
public String getImgSup() { return imgSup; }
39+
public String getImgInf() { return imgInf; }
40+
41+
public int getPruebas() { return pruebas; }
42+
public void setPruebas(int pruebas) { this.pruebas = pruebas; }
43+
44+
public int getThumbs() { return thumbs; }
45+
public void setThumbs(int thumbs) { this.thumbs = thumbs; }
46+
}
47+
48+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.outfitlab.project.domain.useCases.dashboard;
2+
3+
import com.outfitlab.project.domain.interfaces.repositories.CombinationAttemptRepository;
4+
import com.outfitlab.project.domain.model.dto.PrendaDashboardDTO.DiaPrueba;
5+
import com.outfitlab.project.domain.model.CombinationAttemptModel;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.util.*;
9+
10+
@Service
11+
public class GetActividadPorDias {
12+
13+
private final CombinationAttemptRepository combinationAttemptRepository;
14+
15+
public GetActividadPorDias(CombinationAttemptRepository combinationAttemptRepository) {
16+
this.combinationAttemptRepository = combinationAttemptRepository;
17+
}
18+
19+
public List<DiaPrueba> execute() {
20+
List<CombinationAttemptModel> attempts = combinationAttemptRepository.findLastNDays(30);
21+
int[] daily = new int[30];
22+
for (CombinationAttemptModel a : attempts) {
23+
int day = a.getCreatedAt().getDayOfMonth() - 1;
24+
if (day >= 0 && day < 30) daily[day]++;
25+
}
26+
List<DiaPrueba> res = new ArrayList<>();
27+
for(int i=0;i<30;i++) res.add(new DiaPrueba(i+1,daily[i]));
28+
return res;
29+
}
30+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.outfitlab.project.domain.useCases.dashboard;
2+
3+
import com.outfitlab.project.domain.interfaces.repositories.CombinationAttemptRepository;
4+
import com.outfitlab.project.domain.model.dto.PrendaDashboardDTO.ColorConversion;
5+
import com.outfitlab.project.domain.model.CombinationAttemptModel;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.util.*;
9+
import java.util.stream.Collectors;
10+
11+
@Service
12+
public class GetColorConversion {
13+
14+
private final CombinationAttemptRepository combinationAttemptRepository;
15+
16+
public GetColorConversion(CombinationAttemptRepository combinationAttemptRepository) {
17+
this.combinationAttemptRepository = combinationAttemptRepository;
18+
}
19+
20+
public List<ColorConversion> execute() {
21+
List<CombinationAttemptModel> attempts = combinationAttemptRepository.findAll();
22+
Map<String, Integer> colorMap = new HashMap<>();
23+
24+
for (CombinationAttemptModel a : attempts) {
25+
// Color de la prenda superior
26+
String colorSup = a.getCombination().getPrendaSuperior().getColor().getNombre();
27+
colorMap.put(colorSup, colorMap.getOrDefault(colorSup, 0) + 1);
28+
29+
// Color de la prenda inferior
30+
String colorInf = a.getCombination().getPrendaInferior().getColor().getNombre();
31+
colorMap.put(colorInf, colorMap.getOrDefault(colorInf, 0) + 1);
32+
}
33+
34+
return colorMap.entrySet().stream()
35+
.map(e -> new ColorConversion(
36+
e.getKey(),
37+
e.getValue(),
38+
0, // favoritos siempre 0
39+
0.0 // conversion siempre 0
40+
))
41+
.sorted((a, b) -> Integer.compare(b.pruebas(), a.pruebas()))
42+
.collect(Collectors.toList());
43+
}
44+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.outfitlab.project.domain.useCases.dashboard;
2+
3+
import com.outfitlab.project.domain.interfaces.repositories.CombinationAttemptRepository;
4+
import com.outfitlab.project.domain.model.BrandModel;
5+
import com.outfitlab.project.domain.model.dto.PrendaDashboardDTO.ComboPopular;
6+
import com.outfitlab.project.domain.model.CombinationAttemptModel;
7+
import org.springframework.stereotype.Service;
8+
9+
import java.util.*;
10+
import java.util.stream.Collectors;
11+
12+
@Service
13+
public class GetTopCombos {
14+
15+
private final CombinationAttemptRepository combinationAttemptRepository;
16+
17+
public GetTopCombos(CombinationAttemptRepository combinationAttemptRepository) {
18+
this.combinationAttemptRepository = combinationAttemptRepository;
19+
}
20+
21+
public List<ComboPopular> execute(int topN, String brandCode) {
22+
List<CombinationAttemptModel> attempts = combinationAttemptRepository.findAll();
23+
Map<String, ComboPopular> map = new HashMap<>();
24+
25+
for (CombinationAttemptModel a : attempts) {
26+
BrandModel supMarca = a.getCombination().getPrendaSuperior().getMarca();
27+
BrandModel infMarca = a.getCombination().getPrendaInferior().getMarca();
28+
29+
String supBrand = supMarca != null ? supMarca.getCodigoMarca() : "";
30+
String infBrand = infMarca != null ? infMarca.getCodigoMarca() : "";
31+
32+
// Solo procesar si al menos una prenda coincide con la marca
33+
if (!supBrand.equals(brandCode) && !infBrand.equals(brandCode)) continue;
34+
35+
36+
String key = a.getCombination().getPrendaSuperior().getNombre() + "_" +
37+
a.getCombination().getPrendaInferior().getNombre();
38+
39+
map.putIfAbsent(key, new ComboPopular(
40+
a.getCombination().getPrendaSuperior().getNombre(),
41+
a.getCombination().getPrendaInferior().getNombre(),
42+
a.getCombination().getPrendaSuperior().getImagenUrl(),
43+
a.getCombination().getPrendaInferior().getImagenUrl(),
44+
0, 0
45+
));
46+
47+
ComboPopular c = map.get(key);
48+
c.setPruebas(c.getPruebas() + 1);
49+
c.setThumbs(c.getThumbs() + (a.getUser() != null ? 1 : 0));
50+
}
51+
52+
return map.values().stream()
53+
.sorted((a, b) -> Integer.compare(b.getPruebas(), a.getPruebas()))
54+
.limit(topN)
55+
.collect(Collectors.toList());
56+
}
57+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.outfitlab.project.domain.useCases.dashboard;
2+
3+
import com.outfitlab.project.domain.interfaces.repositories.CombinationAttemptRepository;
4+
import com.outfitlab.project.domain.interfaces.repositories.GarmentRepository;
5+
import com.outfitlab.project.domain.model.dto.PrendaDashboardDTO.TopPrenda;
6+
import com.outfitlab.project.domain.model.dto.PrendaDashboardDTO.DailyPrueba;
7+
import com.outfitlab.project.domain.model.PrendaModel;
8+
import com.outfitlab.project.domain.model.CombinationAttemptModel;
9+
import org.springframework.stereotype.Service;
10+
11+
import java.time.LocalDate;
12+
import java.util.*;
13+
import java.util.stream.Collectors;
14+
15+
@Service
16+
public class GetTopPrendas {
17+
18+
private final GarmentRepository prendaRepository;
19+
private final CombinationAttemptRepository combinationAttemptRepository;
20+
21+
public GetTopPrendas(GarmentRepository prendaRepository,
22+
CombinationAttemptRepository combinationAttemptRepository) {
23+
this.prendaRepository = prendaRepository;
24+
this.combinationAttemptRepository = combinationAttemptRepository;
25+
}
26+
27+
public List<TopPrenda> execute(int topN, String brandCode) {
28+
List<PrendaModel> prendas = prendaRepository.findAll();
29+
Map<Long, TopPrenda> map = new HashMap<>();
30+
31+
LocalDate today = LocalDate.now();
32+
33+
for (PrendaModel p : prendas) {
34+
if (!p.getMarca().getCodigoMarca().equals(brandCode)) continue;
35+
36+
List<CombinationAttemptModel> attempts = combinationAttemptRepository.findAllByPrenda(p.getId());
37+
38+
int pruebas = attempts.size();
39+
40+
// Construir daily para últimos 30 días
41+
List<DailyPrueba> daily = new ArrayList<>();
42+
for (int i = 0; i < 30; i++) {
43+
LocalDate day = today.minusDays(29 - i);
44+
int count = (int) attempts.stream()
45+
.filter(a -> a.getCreatedAt().toLocalDate().isEqual(day))
46+
.count();
47+
daily.add(new DailyPrueba(i + 1, count));
48+
}
49+
50+
map.put(p.getId(), new TopPrenda(
51+
p.getId(),
52+
p.getNombre(),
53+
p.getColor().getNombre(),
54+
p.getImagenUrl(),
55+
pruebas,
56+
daily
57+
));
58+
}
59+
60+
return map.values().stream()
61+
.sorted((a, b) -> Integer.compare(b.pruebas(), a.pruebas()))
62+
.limit(topN)
63+
.collect(Collectors.toList());
64+
}
65+
}

0 commit comments

Comments
 (0)