Creating a Netflix Clone
III
codenameone.com github.com/codenameone/CodenameOne
Server Internals
codenameone.com github.com/codenameone/CodenameOne
Server Internals
Now that we know Lombok basics we can move on to the server
The code is mostly mock code
We’ll start with the entity model code first
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Content {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String description;
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Content {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String description;
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
codenameone.com github.com/codenameone/CodenameOne
UUID Keys
Strings as keys are important, they eliminate scanning attacks
JPA lets us use the UUID class and the rest is pretty much seamless
This could be costly for RDBMS inserts
Unless you’re doing millions of inserts this shouldn’t be a problem
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Content {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String description;
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
collect(Collectors.
toMap(Media::getQuality,
Media::getMediaURL));
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Content {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String description;
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
collect(Collectors.
toMap(Media::getQuality,
Media::getMediaURL));
return new ContentDTO(id.toString(),
name, description,
getMedia(heroImage), getMedia(icon),
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Content {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String description;
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
collect(Collectors.
toMap(Media::getQuality,
Media::getMediaURL));
return new ContentDTO(id.toString(),
name, description,
getMedia(heroImage), getMedia(icon),
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
collect(Collectors.
toMap(Media::getQuality,
Media::getMediaURL));
return new ContentDTO(id.toString(),
name, description,
getMedia(heroImage), getMedia(icon),
getMedia(logo), qualityUrls);
}
private byte[] getMedia(Media m) {
return m == null ? null : m.getMedia();
}
}
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
collect(Collectors.
toMap(Media::getQuality,
Media::getMediaURL));
return new ContentDTO(id.toString(),
name, description,
getMedia(heroImage), getMedia(icon),
getMedia(logo), qualityUrls);
}
private byte[] getMedia(Media m) {
return m == null ? null : m.getMedia();
}
}
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
Map<VideoQuality, String> qualityUrls = new HashMap<>();
for (Media video : videos) {
qualityUrls.put(video.getQuality(), video.getMediaURL());
}
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
collect(Collectors.
toMap(Media::getQuality,
Media::getMediaURL));
return new ContentDTO(id.toString(),
name, description,
getMedia(heroImage), getMedia(icon),
getMedia(logo), qualityUrls);
}
private byte[] getMedia(Media m) {
return m == null ? null : m.getMedia();
}
}
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
@OneToOne
private Media heroImage;
@OneToOne
private Media icon;
@OneToOne
private Media logo;
@ManyToMany
private Set<Media> videos;
public ContentDTO getDTO() {
Map<VideoQuality, String> qualityUrls = videos.stream().
collect(Collectors.
toMap(Media::getQuality,
Media::getMediaURL));
return new ContentDTO(id.toString(),
name, description,
getMedia(heroImage), getMedia(icon),
getMedia(logo), qualityUrls);
}
private byte[] getMedia(Media m) {
return m == null ? null : m.getMedia();
}
}
Source Listing - Content
codenameone.com github.com/codenameone/CodenameOne
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ContentDTO {
private String id;
private String name;
private String description;
private byte[] heroImage;
private byte[] icon;
private byte[] logo;
private Map<VideoQuality, String> videoUrls;
}
Source Listing - ContentDTO
codenameone.com github.com/codenameone/CodenameOne
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ContentDTO {
private String id;
private String name;
private String description;
private byte[] heroImage;
private byte[] icon;
private byte[] logo;
private Map<VideoQuality, String> videoUrls;
}
Source Listing - ContentDTO
codenameone.com github.com/codenameone/CodenameOne
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ContentDTO {
private String id;
private String name;
private String description;
private byte[] heroImage;
private byte[] icon;
private byte[] logo;
private Map<VideoQuality, String> videoUrls;
}
Source Listing - ContentDTO
codenameone.com github.com/codenameone/CodenameOne
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ContentDTO {
private String id;
private String name;
private String description;
private byte[] heroImage;
private byte[] icon;
private byte[] logo;
private Map<VideoQuality, String> videoUrls;
}
Source Listing - ContentDTO
codenameone.com github.com/codenameone/CodenameOne
package com.codename1.demos.netflixclone.model;
public enum VideoQuality {
NONE,
LOW,
MEDIUM,
HIGH
}
Source Listing - VideoQuality
codenameone.com github.com/codenameone/CodenameOne
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Media {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String mimeType;
private Instant modified;
private long size;
@Lob
@Column(name = "media", columnDefinition="BLOB")
private byte[] media;
private String mediaURL;
private VideoQuality quality;
}
Source Listing - Media
codenameone.com github.com/codenameone/CodenameOne
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Media {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String mimeType;
private Instant modified;
private long size;
@Lob
@Column(name = "media", columnDefinition="BLOB")
private byte[] media;
private String mediaURL;
private VideoQuality quality;
}
Source Listing - Media
codenameone.com github.com/codenameone/CodenameOne
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Media {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String mimeType;
private Instant modified;
private long size;
@Lob
@Column(name = "media", columnDefinition="BLOB")
private byte[] media;
private String mediaURL;
private VideoQuality quality;
}
Source Listing - Media
codenameone.com github.com/codenameone/CodenameOne
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Media {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String mimeType;
private Instant modified;
private long size;
@Lob
@Column(name = "media", columnDefinition="BLOB")
private byte[] media;
private String mediaURL;
private VideoQuality quality;
}
Source Listing - Media
codenameone.com github.com/codenameone/CodenameOne
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Media {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String name;
private String mimeType;
private Instant modified;
private long size;
@Lob
@Column(name = "media", columnDefinition="BLOB")
private byte[] media;
private String mediaURL;
private VideoQuality quality;
}
Source Listing - Media
codenameone.com github.com/codenameone/CodenameOne
codenameone.com github.com/codenameone/CodenameOne
Thank You
Thank You
create-netflix-clone-03-server.pdf

create-netflix-clone-03-server.pdf

  • 1.
  • 2.
  • 3.
    codenameone.com github.com/codenameone/CodenameOne Server Internals Nowthat we know Lombok basics we can move on to the server The code is mostly mock code We’ll start with the entity model code first
  • 4.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Content{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String description; @OneToOne private Media heroImage; @OneToOne private Media icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 5.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Content{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String description; @OneToOne private Media heroImage; @OneToOne private Media icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 6.
    codenameone.com github.com/codenameone/CodenameOne UUID Keys Stringsas keys are important, they eliminate scanning attacks JPA lets us use the UUID class and the rest is pretty much seamless This could be costly for RDBMS inserts Unless you’re doing millions of inserts this shouldn’t be a problem
  • 7.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Content{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String description; @OneToOne private Media heroImage; @OneToOne private Media icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). collect(Collectors. toMap(Media::getQuality, Media::getMediaURL)); Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 8.
    @Data @AllArgsConstructor @NoArgsConstructor public class Content{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String description; @OneToOne private Media heroImage; @OneToOne private Media icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). collect(Collectors. toMap(Media::getQuality, Media::getMediaURL)); return new ContentDTO(id.toString(), name, description, getMedia(heroImage), getMedia(icon), Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 9.
    @Data @AllArgsConstructor @NoArgsConstructor public class Content{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String description; @OneToOne private Media heroImage; @OneToOne private Media icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). collect(Collectors. toMap(Media::getQuality, Media::getMediaURL)); return new ContentDTO(id.toString(), name, description, getMedia(heroImage), getMedia(icon), Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 10.
    @OneToOne private Media heroImage; @OneToOne privateMedia icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). collect(Collectors. toMap(Media::getQuality, Media::getMediaURL)); return new ContentDTO(id.toString(), name, description, getMedia(heroImage), getMedia(icon), getMedia(logo), qualityUrls); } private byte[] getMedia(Media m) { return m == null ? null : m.getMedia(); } } Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 11.
    @OneToOne private Media heroImage; @OneToOne privateMedia icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). collect(Collectors. toMap(Media::getQuality, Media::getMediaURL)); return new ContentDTO(id.toString(), name, description, getMedia(heroImage), getMedia(icon), getMedia(logo), qualityUrls); } private byte[] getMedia(Media m) { return m == null ? null : m.getMedia(); } } Source Listing - Content codenameone.com github.com/codenameone/CodenameOne Map<VideoQuality, String> qualityUrls = new HashMap<>(); for (Media video : videos) { qualityUrls.put(video.getQuality(), video.getMediaURL()); }
  • 12.
    @OneToOne private Media heroImage; @OneToOne privateMedia icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). collect(Collectors. toMap(Media::getQuality, Media::getMediaURL)); return new ContentDTO(id.toString(), name, description, getMedia(heroImage), getMedia(icon), getMedia(logo), qualityUrls); } private byte[] getMedia(Media m) { return m == null ? null : m.getMedia(); } } Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 13.
    @OneToOne private Media heroImage; @OneToOne privateMedia icon; @OneToOne private Media logo; @ManyToMany private Set<Media> videos; public ContentDTO getDTO() { Map<VideoQuality, String> qualityUrls = videos.stream(). collect(Collectors. toMap(Media::getQuality, Media::getMediaURL)); return new ContentDTO(id.toString(), name, description, getMedia(heroImage), getMedia(icon), getMedia(logo), qualityUrls); } private byte[] getMedia(Media m) { return m == null ? null : m.getMedia(); } } Source Listing - Content codenameone.com github.com/codenameone/CodenameOne
  • 14.
    @Data @AllArgsConstructor @NoArgsConstructor public class ContentDTO{ private String id; private String name; private String description; private byte[] heroImage; private byte[] icon; private byte[] logo; private Map<VideoQuality, String> videoUrls; } Source Listing - ContentDTO codenameone.com github.com/codenameone/CodenameOne
  • 15.
    @Data @AllArgsConstructor @NoArgsConstructor public class ContentDTO{ private String id; private String name; private String description; private byte[] heroImage; private byte[] icon; private byte[] logo; private Map<VideoQuality, String> videoUrls; } Source Listing - ContentDTO codenameone.com github.com/codenameone/CodenameOne
  • 16.
    @Data @AllArgsConstructor @NoArgsConstructor public class ContentDTO{ private String id; private String name; private String description; private byte[] heroImage; private byte[] icon; private byte[] logo; private Map<VideoQuality, String> videoUrls; } Source Listing - ContentDTO codenameone.com github.com/codenameone/CodenameOne
  • 17.
    @Data @AllArgsConstructor @NoArgsConstructor public class ContentDTO{ private String id; private String name; private String description; private byte[] heroImage; private byte[] icon; private byte[] logo; private Map<VideoQuality, String> videoUrls; } Source Listing - ContentDTO codenameone.com github.com/codenameone/CodenameOne
  • 18.
    package com.codename1.demos.netflixclone.model; public enumVideoQuality { NONE, LOW, MEDIUM, HIGH } Source Listing - VideoQuality codenameone.com github.com/codenameone/CodenameOne
  • 19.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Media{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String mimeType; private Instant modified; private long size; @Lob @Column(name = "media", columnDefinition="BLOB") private byte[] media; private String mediaURL; private VideoQuality quality; } Source Listing - Media codenameone.com github.com/codenameone/CodenameOne
  • 20.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Media{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String mimeType; private Instant modified; private long size; @Lob @Column(name = "media", columnDefinition="BLOB") private byte[] media; private String mediaURL; private VideoQuality quality; } Source Listing - Media codenameone.com github.com/codenameone/CodenameOne
  • 21.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Media{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String mimeType; private Instant modified; private long size; @Lob @Column(name = "media", columnDefinition="BLOB") private byte[] media; private String mediaURL; private VideoQuality quality; } Source Listing - Media codenameone.com github.com/codenameone/CodenameOne
  • 22.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Media{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String mimeType; private Instant modified; private long size; @Lob @Column(name = "media", columnDefinition="BLOB") private byte[] media; private String mediaURL; private VideoQuality quality; } Source Listing - Media codenameone.com github.com/codenameone/CodenameOne
  • 23.
    @Entity @Data @AllArgsConstructor @NoArgsConstructor public class Media{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; private String name; private String mimeType; private Instant modified; private long size; @Lob @Column(name = "media", columnDefinition="BLOB") private byte[] media; private String mediaURL; private VideoQuality quality; } Source Listing - Media codenameone.com github.com/codenameone/CodenameOne
  • 24.
  • 25.