diff --git a/demo/Application.java b/demo/Application.java new file mode 100644 index 0000000..257ecf3 --- /dev/null +++ b/demo/Application.java @@ -0,0 +1,13 @@ +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} \ No newline at end of file diff --git a/demo/DemoApplication.java b/demo/DemoApplication.java new file mode 100644 index 0000000..0358817 --- /dev/null +++ b/demo/DemoApplication.java @@ -0,0 +1,16 @@ +/*package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} + + + */ \ No newline at end of file diff --git a/demo/GreetingController.java b/demo/GreetingController.java new file mode 100644 index 0000000..a17632b --- /dev/null +++ b/demo/GreetingController.java @@ -0,0 +1,21 @@ +package com.example.demo; + +/*import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class GreetingController { + + @GetMapping("/") + public String greeting(Model model) { + + model.addAttribute("name", "Mundo"); + + return "index"; + } + +} + + */ + diff --git a/demo/controller/GameResController.java b/demo/controller/GameResController.java new file mode 100644 index 0000000..513f1f4 --- /dev/null +++ b/demo/controller/GameResController.java @@ -0,0 +1,48 @@ +package com.example.demo.controller; + +import java.security.Principal; +import java.util.Optional; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.http.ResponseEntity; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.model.Game; +import com.example.demo.model.User; +import com.example.demo.service.GameService; +import com.example.demo.repository.UserRepository; + +@RestController +@RequestMapping("/api/profile") +public class GameResController { + + @Autowired + private GameService purchaseService; + @Autowired + private UserRepository userService; + + @GetMapping("/games") + public ResponseEntity> showMore(Model model, HttpServletRequest request, HttpServletResponse response) { + + + int pageRequested = 0; + String numPage = request.getParameter("numPage"); + if (numPage != null) { + pageRequested = Integer.parseInt(numPage); + } + + Page page = purchaseService.findAll( pageRequested); + return ResponseEntity.ok(page); + + } + +} \ No newline at end of file diff --git a/demo/controller/GameWebController.java b/demo/controller/GameWebController.java new file mode 100644 index 0000000..8c48560 --- /dev/null +++ b/demo/controller/GameWebController.java @@ -0,0 +1,227 @@ +package com.example.demo.controller; + +import java.io.IOException; +import java.security.Principal; +import java.sql.SQLException; +import java.util.List; +import java.util.Optional; + +import javax.servlet.http.HttpServletRequest; + +import com.example.demo.model.Game; +import org.hibernate.engine.jdbc.BlobProxy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import com.example.demo.service.GameService; +//import com.example.demo.service.ShopService; + +@Controller +public class GameWebController { + + @Autowired + private GameService gamesService; + + //@Autowired + //private ShopService shopService; + + @ModelAttribute + public void addAttributes(Model model, HttpServletRequest request) { + + Principal principal = request.getUserPrincipal(); + + if (principal != null) { + + model.addAttribute("logged", true); + model.addAttribute("userName", principal.getName()); + model.addAttribute("admin", request.isUserInRole("ADMIN")); + + } else { + model.addAttribute("logged", false); + } + } + + @GetMapping("/games") + public String showGames(Model model) { + + model.addAttribute("games", gamesService.findAll(0)); + model.addAttribute("currentPage", 0); + return "games"; + } + + + + + + + + + + + @GetMapping("/index") + public String Index(Model model) { + + //model.addAttribute("ga", gamesService.findAll()); + + return "index"; + } + @GetMapping("/Usuario/{id}") + public String User(Model model) { + + //model.addAttribute("ga", gamesService.findAll()); + + return "Usuario"; + } + + @GetMapping("/games/{id}") + public String showGame(Model model, @PathVariable long id) { + + Optional game = gamesService.findById(id); + if (game.isPresent()) { + model.addAttribute("game", game.get()); + return "game"; + } else { + return "games"; + } + + } + + @GetMapping("/games/{id}/image") + public ResponseEntity downloadImage(@PathVariable long id) throws SQLException { + + Optional game = gamesService.findById(id); + if (game.isPresent() && game.get().getImageFile() != null) { + + Resource file = new InputStreamResource(game.get().getImageFile().getBinaryStream()); + + return ResponseEntity.ok().header(HttpHeaders.CONTENT_TYPE, "image/jpeg") + .contentLength(game.get().getImageFile().length()).body(file); + + } else { + return ResponseEntity.notFound().build(); + } + } + @GetMapping("/games/{id}/Checkout") + public String Checkout(Model model, @PathVariable long id) { + + Optional game = gamesService.findById(id); + if (game.isPresent()) { + model.addAttribute("game", game.get()); + return "checkout"; + } else { + return "game"; + } + } + + + + /*@GetMapping("/removebook/{id}") + public String removeBook(Model model, @PathVariable long id) { + + Optional book = gamesService.findById(id); + if (book.isPresent()) { + gamesService.delete(id); + model.addAttribute("book", book.get()); + } + return "removedbook"; + } + + */ + + @GetMapping("/Addgames") + public String newgame(Model model) { + + //model.addAttribute("availableShops", shopService.findAll()); + + return "Addgames"; + } + + + /* + @PostMapping("/Addgames") + public String newGameProcess(Model model, Game game, MultipartFile imageField, @RequestParam List selectedShops) throws IOException { + + if (!imageField.isEmpty()) { + game.setImageFile(BlobProxy.generateProxy(imageField.getInputStream(), imageField.getSize())); + game.setImage(true); + } + + //games.setShops(shopService.findById(selectedShops)); + + gamesService.save(game); + + model.addAttribute("gameId", game.getId()); + + return "redirect:/games/"+ game.getId(); + } + + */ + + /*@GetMapping("/game.html/{id}") + public String showGames(Model model, @PathVariable long id) { + + Optional games = gamesService.findById(id); + if (games.isPresent()) { + model.addAttribute("games", games.get()); + return "single"; + } else { + return "Products"; + } + }*/ + + + /* + + @PostMapping("/editgames") + public String editBookProcess(Model model, Game game, boolean removeImage, MultipartFile imageField) + throws IOException, SQLException { + + updateImage(game, removeImage, imageField); + + gamesService.save(game); + + model.addAttribute("gameId", game.getId()); + + return "redirect:/single/"+ game.getId(); + } + + */ + + + + + + + private void updateImage(Game game, boolean removeImage, MultipartFile imageField) throws IOException, SQLException { + + if (!imageField.isEmpty()) { + game.setImageFile(BlobProxy.generateProxy(imageField.getInputStream(), imageField.getSize())); + game.setImage(true); + } else { + if (removeImage) { + game.setImageFile(null); + game.setImage(false); + } else { + // Maintain the same image loading it before updating the book + Game dbGame = gamesService.findById(game.getId()).orElseThrow(); + if (dbGame.getImage()) { + game.setImageFile(BlobProxy.generateProxy(dbGame.getImageFile().getBinaryStream(), + dbGame.getImageFile().length())); + game.setImage(true); + } + } + } + } + +} diff --git a/demo/controller/LoginWebController.java b/demo/controller/LoginWebController.java new file mode 100644 index 0000000..737b4cc --- /dev/null +++ b/demo/controller/LoginWebController.java @@ -0,0 +1,18 @@ +package com.example.demo.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class LoginWebController { + + @RequestMapping("/login") + public String login() { + return "login"; + } + + @RequestMapping("/loginerror") + public String loginerror() { + return "loginerror"; + } +} diff --git a/demo/model/Game.java b/demo/model/Game.java new file mode 100644 index 0000000..179216a --- /dev/null +++ b/demo/model/Game.java @@ -0,0 +1,117 @@ +package com.example.demo.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.sql.Blob; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.ManyToMany; + +@Entity +public class Game { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id = null; + + private String title; + + private Long price; + + @Column(columnDefinition = "TEXT") + private String description; + + private String category; + + @Lob + @JsonIgnore + private Blob imageFile; + + private boolean image; + + @ManyToMany + private List users; + + + + public Game() {} + + public Game(String nombre, String description, Long price, String category) { + super(); + this.title = nombre; + this.description = description; + this.price = price; + this.category = category; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Long getPrice() { return price; } + + public void setPrice(String description) { + this.price = price; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Blob getImageFile() { + return imageFile; + } + + public void setImageFile(Blob image) { + this.imageFile = image; + } + + public boolean getImage(){ + return this.image; + } + + public void setImage(boolean image){ + this.image = image; + } + + //public List getShops() { return users; } + + //public void setShops(List shops) { this.users = users; } + + + + @Override + public String toString() { + return "Game [id=" + id + ", title=" + title + ", description=" + description + ", price=" + price + ", category=" + category + "]"; + } +} diff --git a/demo/model/Shop.java b/demo/model/Shop.java new file mode 100644 index 0000000..421a3cd --- /dev/null +++ b/demo/model/Shop.java @@ -0,0 +1,71 @@ +package com.example.demo.model; + +/*import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToMany; + +@Entity +public class Shop { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id = null; + + private String name; + + @Column(columnDefinition = "TEXT") + private String address; + + @ManyToMany(mappedBy="shops") + private List games; + + + public Shop() {} + + public Shop(String name, String address) { + this.name = name; + this.address = address; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + + public List getBooks() { + return games; + } + + + public void setBooks(List games) { + this.games = games; + } +} + + + */ \ No newline at end of file diff --git a/demo/model/User.java b/demo/model/User.java new file mode 100644 index 0000000..ac8dbb5 --- /dev/null +++ b/demo/model/User.java @@ -0,0 +1,66 @@ +package com.example.demo.model; + +import java.util.List; + +import javax.persistence.*; + +@Entity(name = "UserTable") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + private String encodedPassword; + + @ElementCollection(fetch = FetchType.EAGER) + private List roles; + + @ManyToMany(mappedBy="users") + private List gamesBaught; + + public User() { + } + + public User(String name, String encodedPassword, String... roles) { + this.name = name; + this.encodedPassword = encodedPassword; + this.roles = List.of(roles); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEncodedPassword() { + return encodedPassword; + } + + public void setEncodedPassword(String encodedPassword) { + this.encodedPassword = encodedPassword; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public List getGames() { + return gamesBaught; + } + + public void setBooks(List books) { + this.gamesBaught = gamesBaught; + } + +} + diff --git a/demo/repository/GameRepository.java b/demo/repository/GameRepository.java new file mode 100644 index 0000000..fcc47f1 --- /dev/null +++ b/demo/repository/GameRepository.java @@ -0,0 +1,15 @@ +package com.example.demo.repository; + +import com.example.demo.model.Game; +import com.example.demo.model.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface GameRepository extends JpaRepository { + + + public Page findAll(Pageable page); +} + diff --git a/demo/repository/ShopRepository.java b/demo/repository/ShopRepository.java new file mode 100644 index 0000000..084fbf8 --- /dev/null +++ b/demo/repository/ShopRepository.java @@ -0,0 +1,12 @@ +/*package com.example.demo.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.example.demo.model.Shop; + +public interface ShopRepository extends JpaRepository { + +} + + */ + diff --git a/demo/repository/UserRepository.java b/demo/repository/UserRepository.java new file mode 100644 index 0000000..b157dc3 --- /dev/null +++ b/demo/repository/UserRepository.java @@ -0,0 +1,15 @@ +package com.example.demo.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.example.demo.model.User; + +public interface UserRepository extends JpaRepository { + + Optional findByName(String name); + +} + + diff --git a/demo/security/CSRFHandlerConfiguration.java b/demo/security/CSRFHandlerConfiguration.java new file mode 100644 index 0000000..676039c --- /dev/null +++ b/demo/security/CSRFHandlerConfiguration.java @@ -0,0 +1,38 @@ +package com.example.demo.security; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.web.csrf.CsrfToken; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CSRFHandlerConfiguration implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new CSRFHandlerInterceptor()); + } +} + +class CSRFHandlerInterceptor implements HandlerInterceptor { + + @Override + public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, + final ModelAndView modelAndView) throws Exception { + + if (modelAndView != null) { + + CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); + if (token != null) { + modelAndView.addObject("token", token.getToken()); + } + } + } +} + + diff --git a/demo/security/RepositoryUserDetailsService.java b/demo/security/RepositoryUserDetailsService.java new file mode 100644 index 0000000..052c348 --- /dev/null +++ b/demo/security/RepositoryUserDetailsService.java @@ -0,0 +1,40 @@ +package com.example.demo.security; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import com.example.demo.model.User; +import com.example.demo.repository.UserRepository; + +@Service +public class RepositoryUserDetailsService implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + + User user = userRepository.findByName(username) + .orElseThrow(() -> new UsernameNotFoundException("User not found")); + + List roles = new ArrayList<>(); + for (String role : user.getRoles()) { + roles.add(new SimpleGrantedAuthority("ROLE_" + role)); + } + + return new org.springframework.security.core.userdetails.User(user.getName(), + user.getEncodedPassword(), roles); + + } +} + + diff --git a/demo/security/WebSecurityConfig.java b/demo/security/WebSecurityConfig.java new file mode 100644 index 0000000..8b45069 --- /dev/null +++ b/demo/security/WebSecurityConfig.java @@ -0,0 +1,61 @@ +package com.example.demo.security; + +import java.security.SecureRandom; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + RepositoryUserDetailsService userDetailsService; + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(10, new SecureRandom()); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + + auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + + // Public pages + http.authorizeRequests().antMatchers("/").permitAll(); + http.authorizeRequests().antMatchers("/login").permitAll(); + http.authorizeRequests().antMatchers("/loginerror").permitAll(); + http.authorizeRequests().antMatchers("/logout").permitAll(); + + // Private pages + http.authorizeRequests().antMatchers("/newbook").hasAnyRole("USER"); + http.authorizeRequests().antMatchers("/editbook/*").hasAnyRole("USER"); + http.authorizeRequests().antMatchers("/removebook/*").hasAnyRole("ADMIN"); + http.authorizeRequests().antMatchers("/Addgames").hasAnyRole("ADMIN"); + http.authorizeRequests().antMatchers("/checkout").hasAnyRole("USER"); + + + // Login form + http.formLogin().loginPage("/login"); + http.formLogin().usernameParameter("username"); + http.formLogin().passwordParameter("password"); + http.formLogin().defaultSuccessUrl("/index"); + http.formLogin().failureUrl("/loginerror"); + + // Logout + http.logout().logoutUrl("/logout"); + http.logout().logoutSuccessUrl("/index"); + } +} + + diff --git a/demo/service/DatabaseInitializer.java b/demo/service/DatabaseInitializer.java new file mode 100644 index 0000000..a6701ff --- /dev/null +++ b/demo/service/DatabaseInitializer.java @@ -0,0 +1,289 @@ +package com.example.demo.service; + +import java.io.IOException; +import java.net.URISyntaxException; + +import javax.annotation.PostConstruct; + +import com.example.demo.model.Game; +import org.hibernate.engine.jdbc.BlobProxy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import com.example.demo.model.User; +import com.example.demo.repository.GameRepository; +//import com.example.demo.repository.ShopRepository; +import com.example.demo.repository.UserRepository; + +@Service +public class DatabaseInitializer { + + @Autowired + private GameRepository gameRepository; + + /*@Autowired + private ShopRepository shopRepository; + + */ + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + + @PostConstruct + public void init() throws IOException, URISyntaxException { + + // Sample games + + Game game1 = new Game("New Sper Mario Bros 2 3DS", + + "Los personajes que protagonizan este relato sobreviven en una sociedad en decadencia a la que, no obstante, lograrán devolver la posibilidad de un futuro. Año 2484. En un mundo dominado por las grandes corporaciones, solo un hombre, Jordi Thompson, detective privado deslenguado y vividor, pero de gran talento y sentido d...", + 35L, + "clasic"); + + setGameImage(game1, "/static/Game_images/3DS_New_Super_Mario_Bros_2.jpg"); + gameRepository.save(game1); + + Game game2 = new Game("New Super Mario Bros DS", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game2, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game2); + + Game game3 = new Game("GBA Super Mario Bros 3", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game3, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game3); + + Game game4 = new Game("NES Super Mario Bros", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game4, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game4); + + Game game5 = new Game("SGG Sonic the Hedgehog", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game5, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game5); + + Game game6 = new Game("SGG Sonic the Hedhog 2", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game6, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game6); + + Game game7 = new Game("SMD Sonic the Hedgehog", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game7, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game7); + + Game game8 = new Game("Switch New Super Mario Bros U Deluxe", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game8, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game8); + + Game game9 = new Game("WII New Super Mario Bros", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game9, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game9); + + Game game10 = new Game("Red Dead Redemption 2", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "survival"); + + setGameImage(game10, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game10); + + Game game11 = new Game("Rust", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "survival"); + + setGameImage(game11, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game11); + + Game game12 = new Game("Resident Evil 7: Biohazard", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "survival"); + + setGameImage(game12, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game12); + + Game game13 = new Game("Until Dawn", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "survival"); + + setGameImage(game13, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game13); + + Game game14 = new Game("Fifa 22", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "sports"); + + setGameImage(game14, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game14); + + Game game15 = new Game("Fifa 21", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "sports"); + + setGameImage(game15, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game15); + + Game game16 = new Game("2K22", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "sports"); + + setGameImage(game16, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game16); + + Game game17 = new Game("2K21", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "sports"); + + setGameImage(game17, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game17); + + Game game18 = new Game("Call of Duty: Modern Warfare 2", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "shooter"); + + setGameImage(game18, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game18); + + Game game19 = new Game("Call of Duty: Modern Warfare 3", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "shooter"); + + setGameImage(game19, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game19); + + Game game20 = new Game("Call of Duty: Black Ops", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "shooter"); + + setGameImage(game20, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game20); + + Game game21 = new Game("Final Fantasy VII", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "rpg"); + + setGameImage(game21, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game21); + + Game game22 = new Game("World of Warcraft", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "rpg"); + + setGameImage(game22, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game22); + + Game game23 = new Game("Call of Duty: Black Ops 2", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "shooter"); + + setGameImage(game23, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game23); + + Game game24 = new Game("Diablo II: Lord of Destrction", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "rpg"); + + setGameImage(game24, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game24); + + Game game25 = new Game("Civilization VI", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "strategy"); + + setGameImage(game25, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game25); + + Game game26 = new Game("XCOM 2", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "strategy"); + + setGameImage(game26, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game26); + + Game game27 = new Game("Frost Punk", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game27, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game27); + + Game game28 = new Game("Gear Tactics", + "La vida secreta de la mentees un viaje especular que recorre el cerebro y el pensamiento: se trata de descubrir nuestra mente para entendernos hasta en los más pequeños rincones que componen lo que somos, cómo forjamos las ideas en los primeros días de vida, cómo damos forma a las decisiones que nos constituyen, cómo soñamos y cómo imaginamos, por qué sentimos ciertas emociones hacia los demás, cómo los demás influyen en nosotros, y cómo el cerebro se transforma y, con él, lo que somos.", + 55L, + "clasic"); + + setGameImage(game28, "static/Game_images/DS New Super Mario Bros.jpg"); + gameRepository.save(game28); + + + // Sample Shops + + //shopRepository.save(new Shop("La casa del libro", "C/Falsa 123")); + //shopRepository.save(new Shop("FNAC", "C/Falsa 456")); + + + // Sample users + + userRepository.save(new User("user", passwordEncoder.encode("pass"), "USER")); + userRepository.save(new User("admin", passwordEncoder.encode("adminpass"), "USER", "ADMIN")); + } + + public void setGameImage(Game game, String classpathResource) throws IOException { + game.setImage(true); + Resource image = new ClassPathResource(classpathResource); + game.setImageFile(BlobProxy.generateProxy(image.getInputStream(), image.contentLength())); + } +} + + diff --git a/demo/service/GameService.java b/demo/service/GameService.java new file mode 100644 index 0000000..63e6d6a --- /dev/null +++ b/demo/service/GameService.java @@ -0,0 +1,44 @@ +package com.example.demo.service; + +import java.util.List; +import java.util.Optional; + +import com.example.demo.model.Game; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + + +import com.example.demo.repository.GameRepository; + +@Service +public class GameService { + + @Autowired + private GameRepository repository; + + public Optional findById(long id) { + return repository.findById(id); + } + + public boolean exist(long id) { + return repository.existsById(id); + } + + public Page findAll(int n) { + return repository.findAll( PageRequest.of(n, 5)); + } + + public void save(Game game) { + repository.save(game); + } + + public void delete(long id) { + repository.deleteById(id); + } + + +} + + diff --git a/demo/service/ShopService.java b/demo/service/ShopService.java new file mode 100644 index 0000000..a62cdb1 --- /dev/null +++ b/demo/service/ShopService.java @@ -0,0 +1,47 @@ +package com.example.demo.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/* import com.example.demo.model.Shop; +import com.example.demo.repository.ShopRepository; + +@Service +public class ShopService { + + @Autowired + private ShopRepository repository; + + public Optional findById(long id) { + return repository.findById(id); + } + + public List findById(List ids){ + return repository.findAllById(ids); + } + + public boolean exist(long id) { + return repository.existsById(id); + } + + public List findAll() { + return repository.findAll(); + } + + public void save(Shop Shop) { + repository.save(Shop); + } + + public void delete(long id) { + repository.deleteById(id); + } + + +} + + + */ + diff --git a/templates/Addgames.html b/templates/Addgames.html new file mode 100644 index 0000000..05a0c5a --- /dev/null +++ b/templates/Addgames.html @@ -0,0 +1,35 @@ + +{{>header}} + + + + + + +{{>footer}} \ No newline at end of file diff --git a/templates/Comercio.html b/templates/Comercio.html new file mode 100644 index 0000000..6eea842 --- /dev/null +++ b/templates/Comercio.html @@ -0,0 +1,124 @@ +{{>header}} + +
+
+

Your shopping cart contains: 3 Products

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PR No.ProductQuantityProduct NameBuyerRevenue
1 +
+
+
 
+
1
+
 
+
+
+
Black Shoe$5.00$290.00 + + +
2 +
+
+
 
+
1
+
 
+
+
+
Centre Table$5.00$250.00 + + +
3 +
+
+
 
+
1
+
 
+
+
+
Stone Bangles$5.00$299.00 + + +
+
+
+
+ +{{>footer}} \ No newline at end of file diff --git a/templates/Usuario.html b/templates/Usuario.html new file mode 100644 index 0000000..66bcd0d --- /dev/null +++ b/templates/Usuario.html @@ -0,0 +1,75 @@ +{{>header}} + + + + +
+
+ + img-avatar + + +
+

Name

+ +

Mail

+ +

Password

+ + +
+
+ +

+ +

Juegos Comprados

+ + + + + + + + + + + + + + + + + + +
Product NameFechaPrice
Red dead redemption II15/02/202260€
Red dead redemption II15/02/202260€
+

+

Juegos Vendidos

+ + + + + + + + + + + + + + + + + + +
Product NameFechaPrice
Mario Kart 8 15/02/202220€
witcher 316/02/202210€
+
+ +{{>footer}} \ No newline at end of file diff --git a/templates/checkout.html b/templates/checkout.html new file mode 100644 index 0000000..2506992 --- /dev/null +++ b/templates/checkout.html @@ -0,0 +1,49 @@ +{{>header}} + + + + +
+
+
+ + + + + + + + + + + + + + +
Product NamePrice
{{game.title}}{{game.price}}€
+
+ +
+
+ + + + + + + +
+ +
+
+
+
+ +{{>footer}} \ No newline at end of file diff --git a/templates/footer.html b/templates/footer.html new file mode 100644 index 0000000..6478335 --- /dev/null +++ b/templates/footer.html @@ -0,0 +1,30 @@ + + + + + + diff --git a/templates/game.html b/templates/game.html new file mode 100644 index 0000000..083b0b5 --- /dev/null +++ b/templates/game.html @@ -0,0 +1,165 @@ +{{>header}} + + + + +
+
+
+

Filtrar por precio

+ + + + +
+
+

Categories

+ +
+ +
+
+
+
+
    + + {{#game.image}} + + {{/game.image}} + + {{^game.image}} + + {{/game.image}} + +
+
+ + + + + +
+
+

Game "{{game.title}}"

+

55€

+ + + + +
+
Occasion :
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+
+ +
Descripción completa del producto
+

{{game.description}}

+
+ +
+ + +{{>footer}} \ No newline at end of file diff --git a/templates/games.html b/templates/games.html new file mode 100644 index 0000000..622fc48 --- /dev/null +++ b/templates/games.html @@ -0,0 +1,374 @@ +{{>header}} + + +
+
+ +
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ {{#games}} +
+ + + +
+ +
  • {{title}}
  • + + + {{/games}} + + + + +
    +
    + + +
    +
    +
    +
    + + +{{>footer}} \ No newline at end of file diff --git a/templates/header.html b/templates/header.html new file mode 100644 index 0000000..264440b --- /dev/null +++ b/templates/header.html @@ -0,0 +1,152 @@ + + + + Best Store a Ecommerce Online Shopping Category Flat Bootstrap Responsive Website Template | Login :: w3layouts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
      +
    • @example.com
    • +
    • +1234 567 892
    • + {{^logged}} +
    • Login
    • + {{/logged}} + + {{#logged}} + + {{/logged}} + + +
    • Register
    • +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + + + + + + +
    +
    + +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..08f8646 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,108 @@ +{{>header}} + + + + + + + + + +
    +
    +
    +
    +

    30% Offer For Last year's Games

    +
    +
    +
    +
    + +{{>footer}} \ No newline at end of file diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..ae17793 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,34 @@ +{{>header}} + + + + + + +{{>footer}} \ No newline at end of file diff --git a/templates/loginerror.html b/templates/loginerror.html new file mode 100644 index 0000000..171ff5a --- /dev/null +++ b/templates/loginerror.html @@ -0,0 +1,4 @@ +{{>header}} +

    Invalid credentials

    + Try again +{{>footer}} diff --git a/templates/mail.html b/templates/mail.html new file mode 100644 index 0000000..f7ed7ed --- /dev/null +++ b/templates/mail.html @@ -0,0 +1,34 @@ +{{>header}} + + + + +
    +
    +

    Mail Us

    +

    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia + deserunt mollit anim id est laborum.

    +
    +
    +
    + + + + + +
    +
    + +
    +
    +
    +
    + +{{>footer}} \ No newline at end of file diff --git a/templates/register.html b/templates/register.html new file mode 100644 index 0000000..4aeb069 --- /dev/null +++ b/templates/register.html @@ -0,0 +1,48 @@ +{{>header}} + + + + +
    +
    +

    Register Here

    +

    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia + deserunt mollit anim id est laborum.

    + +
    + Home +
    +
    +
    + +{{>footer}} \ No newline at end of file diff --git a/webapp11-main-Markos 18 de marzo.zip b/webapp11-main-Markos 18 de marzo.zip new file mode 100644 index 0000000..9dd2772 Binary files /dev/null and b/webapp11-main-Markos 18 de marzo.zip differ