diff --git a/licenses/LICENSE.template b/licenses/LICENSE.template index 55f2e67..7fe38d6 100644 --- a/licenses/LICENSE.template +++ b/licenses/LICENSE.template @@ -1,7 +1,7 @@ Project: ${project.name}, File: ${file.name} -Copyright ${license.git.copyrightLastYear} Locusworks LLC. +Copyright 2019-${license.git.copyrightLastYear} Locusworks LLC. All rights reserved. Federal copyright law prohibits unauthorized reproduction by any means and imposes fines up to $25,000 for violation. No part of this material may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/pom.xml b/pom.xml index 45168e0..4dd03d9 100644 --- a/pom.xml +++ b/pom.xml @@ -332,7 +332,17 @@ activation 1.1.1 - + + org.eclipse.persistence + eclipselink + 2.5.2 + + + org.eclipse.persistence + org.eclipse.persistence.jpa.modelgen.processor + 2.5.2 + provided + diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java index 9366796..cca6994 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java +++ b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: EightTrackBeanConfiguration.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java index db14060..a596f3d 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java +++ b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: EightTrackDataSource.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/entities/DiscordGuild.java b/src/main/java/net/locusworks/discord/eighttrack/database/entities/DiscordGuild.java index 1f79f3c..114be6e 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/database/entities/DiscordGuild.java +++ b/src/main/java/net/locusworks/discord/eighttrack/database/entities/DiscordGuild.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: DiscordGuild.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, @@ -34,7 +34,9 @@ package net.locusworks.discord.eighttrack.database.entities; import java.io.Serializable; import java.util.Date; +import java.util.List; import javax.persistence.Basic; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -42,6 +44,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @@ -71,6 +74,10 @@ public class DiscordGuild implements Serializable { @Column(name = "date_joined") @Temporal(TemporalType.TIMESTAMP) private Date dateJoined; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "guild") + private List guildSongList; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "guild") + private List guildPlaylistList; public DiscordGuild() { } @@ -117,6 +124,22 @@ public class DiscordGuild implements Serializable { this.dateJoined = dateJoined; } + public List getGuildSongList() { + return guildSongList; + } + + public void setGuildSongList(List guildSongList) { + this.guildSongList = guildSongList; + } + + public List getGuildPlaylistList() { + return guildPlaylistList; + } + + public void setGuildPlaylistList(List guildPlaylistList) { + this.guildPlaylistList = guildPlaylistList; + } + @Override public int hashCode() { int hash = 0; @@ -139,7 +162,7 @@ public class DiscordGuild implements Serializable { @Override public String toString() { - return "net.locusworks.discord.pseudobot.database.entities.DiscordGuild[ id=" + id + " ]"; + return "net.locusworks.discord.eighttrack.database.entities.DiscordGuild[ id=" + id + " ]"; } } diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildPlaylist.java b/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildPlaylist.java new file mode 100644 index 0000000..a29ea7f --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildPlaylist.java @@ -0,0 +1,171 @@ +/** + * + * Project: Eight Track, File: GuildPlaylist.java + * + * Copyright 2019-2019 Locusworks LLC. + * All rights reserved. Federal copyright law prohibits unauthorized reproduction by + * any means and imposes fines up to $25,000 for violation. No part of this material + * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, + * modified, duplicated, adapted or translated into another program language in any + * form or by any means, electronic, mechanical, photocopying, recording, or + * otherwise, without the prior written permission from Locusworks. Locusworks + * affirms that Eight-Track(R) software and data is subject to United States + * Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive + * Forney TX 75126, (802) 488-0438, for commercial licensing opportunities. + * + * IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY + * LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF + * THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND + * ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS + * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + */ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package net.locusworks.discord.eighttrack.database.entities; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.persistence.Basic; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author isaac + */ +@Entity +@Table(name = "guild_playlist", catalog = "eighttrack", schema = "") +@NamedQueries({ + @NamedQuery(name = "GuildPlaylist.findAll", query = "SELECT g FROM GuildPlaylist g")}) +public class GuildPlaylist implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Basic(optional = false) + @Column(name = "id") + private Long id; + @Basic(optional = false) + @Column(name = "userId") + private long userId; + @Basic(optional = false) + @Column(name = "playlist") + private String playlist; + @Column(name = "date_added") + @Temporal(TemporalType.TIMESTAMP) + private Date dateAdded; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "guildPlaylist") + private List guildPlaylistSongList; + @JoinColumn(name = "guild", referencedColumnName = "id") + @ManyToOne(optional = false) + private DiscordGuild guild; + + public GuildPlaylist() { + } + + public GuildPlaylist(Long id) { + this.id = id; + } + + public GuildPlaylist(Long id, long userId, String playlist) { + this.id = id; + this.userId = userId; + this.playlist = playlist; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + + public String getPlaylist() { + return playlist; + } + + public void setPlaylist(String playlist) { + this.playlist = playlist; + } + + public Date getDateAdded() { + return dateAdded; + } + + public void setDateAdded(Date dateAdded) { + this.dateAdded = dateAdded; + } + + public List getGuildPlaylistSongList() { + return guildPlaylistSongList; + } + + public void setGuildPlaylistSongList(List guildPlaylistSongList) { + this.guildPlaylistSongList = guildPlaylistSongList; + } + + public DiscordGuild getGuild() { + return guild; + } + + public void setGuild(DiscordGuild guild) { + this.guild = guild; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof GuildPlaylist)) { + return false; + } + GuildPlaylist other = (GuildPlaylist) object; + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + return false; + } + return true; + } + + @Override + public String toString() { + return "net.locusworks.discord.eighttrack.database.entities.GuildPlaylist[ id=" + id + " ]"; + } + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildPlaylistSong.java b/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildPlaylistSong.java new file mode 100644 index 0000000..d837d25 --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildPlaylistSong.java @@ -0,0 +1,141 @@ +/** + * + * Project: Eight Track, File: GuildPlaylistSong.java + * + * Copyright 2019-2019 Locusworks LLC. + * All rights reserved. Federal copyright law prohibits unauthorized reproduction by + * any means and imposes fines up to $25,000 for violation. No part of this material + * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, + * modified, duplicated, adapted or translated into another program language in any + * form or by any means, electronic, mechanical, photocopying, recording, or + * otherwise, without the prior written permission from Locusworks. Locusworks + * affirms that Eight-Track(R) software and data is subject to United States + * Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive + * Forney TX 75126, (802) 488-0438, for commercial licensing opportunities. + * + * IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY + * LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF + * THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND + * ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS + * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + */ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package net.locusworks.discord.eighttrack.database.entities; + +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author isaac + */ +@Entity +@Table(name = "guild_playlist_song", catalog = "eighttrack", schema = "") +@NamedQueries({ + @NamedQuery(name = "GuildPlaylistSong.findAll", query = "SELECT g FROM GuildPlaylistSong g")}) +public class GuildPlaylistSong implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Basic(optional = false) + @Column(name = "id") + private Long id; + @Column(name = "date_added") + @Temporal(TemporalType.TIMESTAMP) + private Date dateAdded; + @JoinColumn(name = "guild_playlist", referencedColumnName = "id") + @ManyToOne(optional = false) + private GuildPlaylist guildPlaylist; + @JoinColumn(name = "guild_song", referencedColumnName = "id") + @ManyToOne(optional = false) + private GuildSong guildSong; + + public GuildPlaylistSong() { + } + + public GuildPlaylistSong(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Date getDateAdded() { + return dateAdded; + } + + public void setDateAdded(Date dateAdded) { + this.dateAdded = dateAdded; + } + + public GuildPlaylist getGuildPlaylist() { + return guildPlaylist; + } + + public void setGuildPlaylist(GuildPlaylist guildPlaylist) { + this.guildPlaylist = guildPlaylist; + } + + public GuildSong getGuildSong() { + return guildSong; + } + + public void setGuildSong(GuildSong guildSong) { + this.guildSong = guildSong; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof GuildPlaylistSong)) { + return false; + } + GuildPlaylistSong other = (GuildPlaylistSong) object; + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + return false; + } + return true; + } + + @Override + public String toString() { + return "net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong[ id=" + id + " ]"; + } + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildSong.java b/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildSong.java new file mode 100644 index 0000000..91cf503 --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/database/entities/GuildSong.java @@ -0,0 +1,154 @@ +/** + * + * Project: Eight Track, File: GuildSong.java + * + * Copyright 2019-2019 Locusworks LLC. + * All rights reserved. Federal copyright law prohibits unauthorized reproduction by + * any means and imposes fines up to $25,000 for violation. No part of this material + * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, + * modified, duplicated, adapted or translated into another program language in any + * form or by any means, electronic, mechanical, photocopying, recording, or + * otherwise, without the prior written permission from Locusworks. Locusworks + * affirms that Eight-Track(R) software and data is subject to United States + * Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive + * Forney TX 75126, (802) 488-0438, for commercial licensing opportunities. + * + * IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY + * LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF + * THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND + * ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS + * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + */ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package net.locusworks.discord.eighttrack.database.entities; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.persistence.Basic; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author isaac + */ +@Entity +@Table(name = "guild_song", catalog = "eighttrack", schema = "") +@NamedQueries({ + @NamedQuery(name = "GuildSong.findAll", query = "SELECT g FROM GuildSong g")}) +public class GuildSong implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Basic(optional = false) + @Column(name = "id") + private Long id; + @Column(name = "date_added") + @Temporal(TemporalType.TIMESTAMP) + private Date dateAdded; + @JoinColumn(name = "guild", referencedColumnName = "id") + @ManyToOne(optional = false) + private DiscordGuild guild; + @JoinColumn(name = "song", referencedColumnName = "id") + @ManyToOne(optional = false) + private Song song; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "guildSong") + private List guildPlaylistSongList; + + public GuildSong() { + } + + public GuildSong(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Date getDateAdded() { + return dateAdded; + } + + public void setDateAdded(Date dateAdded) { + this.dateAdded = dateAdded; + } + + public DiscordGuild getGuild() { + return guild; + } + + public void setGuild(DiscordGuild guild) { + this.guild = guild; + } + + public Song getSong() { + return song; + } + + public void setSong(Song song) { + this.song = song; + } + + public List getGuildPlaylistSongList() { + return guildPlaylistSongList; + } + + public void setGuildPlaylistSongList(List guildPlaylistSongList) { + this.guildPlaylistSongList = guildPlaylistSongList; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof GuildSong)) { + return false; + } + GuildSong other = (GuildSong) object; + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + return false; + } + return true; + } + + @Override + public String toString() { + return "net.locusworks.discord.eighttrack.database.entities.GuildSong[ id=" + id + " ]"; + } + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/entities/Song.java b/src/main/java/net/locusworks/discord/eighttrack/database/entities/Song.java new file mode 100644 index 0000000..c31ff5e --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/database/entities/Song.java @@ -0,0 +1,253 @@ +/** + * + * Project: Eight Track, File: Song.java + * + * Copyright 2019-2019 Locusworks LLC. + * All rights reserved. Federal copyright law prohibits unauthorized reproduction by + * any means and imposes fines up to $25,000 for violation. No part of this material + * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, + * modified, duplicated, adapted or translated into another program language in any + * form or by any means, electronic, mechanical, photocopying, recording, or + * otherwise, without the prior written permission from Locusworks. Locusworks + * affirms that Eight-Track(R) software and data is subject to United States + * Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive + * Forney TX 75126, (802) 488-0438, for commercial licensing opportunities. + * + * IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY + * LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF + * THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND + * ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS + * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + */ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package net.locusworks.discord.eighttrack.database.entities; + +import java.io.Serializable; +import java.math.BigInteger; +import java.util.Date; +import java.util.List; +import javax.persistence.Basic; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author isaac + */ +@Entity +@Table(name = "song", catalog = "eighttrack", schema = "") +@NamedQueries({ + @NamedQuery(name = "Song.findAll", query = "SELECT s FROM Song s")}) +public class Song implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Basic(optional = false) + @Column(name = "id") + private Long id; + @Basic(optional = false) + @Column(name = "uuid") + private String uuid; + @Basic(optional = false) + @Column(name = "title") + private String title; + @Column(name = "artist") + private String artist; + @Column(name = "album") + private String album; + @Column(name = "genre") + private String genre; + @Column(name = "track_number") + private String trackNumber; + @Column(name = "disc_number") + private String discNumber; + @Column(name = "release_year") + private String releaseYear; + @Column(name = "duration") + private BigInteger duration; + @Basic(optional = false) + @Column(name = "file_path") + private String filePath; + @Basic(optional = false) + @Column(name = "file_hash") + private String fileHash; + @Column(name = "date_added") + @Temporal(TemporalType.TIMESTAMP) + private Date dateAdded; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "song") + private List guildSongList; + + public Song() { + } + + public Song(Long id) { + this.id = id; + } + + public Song(Long id, String uuid, String title, String filePath, String fileHash) { + this.id = id; + this.uuid = uuid; + this.title = title; + this.filePath = filePath; + this.fileHash = fileHash; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getArtist() { + return artist; + } + + public void setArtist(String artist) { + this.artist = artist; + } + + public String getAlbum() { + return album; + } + + public void setAlbum(String album) { + this.album = album; + } + + public String getGenre() { + return genre; + } + + public void setGenre(String genre) { + this.genre = genre; + } + + public String getTrackNumber() { + return trackNumber; + } + + public void setTrackNumber(String trackNumber) { + this.trackNumber = trackNumber; + } + + public String getDiscNumber() { + return discNumber; + } + + public void setDiscNumber(String discNumber) { + this.discNumber = discNumber; + } + + public String getReleaseYear() { + return releaseYear; + } + + public void setReleaseYear(String releaseYear) { + this.releaseYear = releaseYear; + } + + public BigInteger getDuration() { + return duration; + } + + public void setDuration(BigInteger duration) { + this.duration = duration; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileHash() { + return fileHash; + } + + public void setFileHash(String fileHash) { + this.fileHash = fileHash; + } + + public Date getDateAdded() { + return dateAdded; + } + + public void setDateAdded(Date dateAdded) { + this.dateAdded = dateAdded; + } + + public List getGuildSongList() { + return guildSongList; + } + + public void setGuildSongList(List guildSongList) { + this.guildSongList = guildSongList; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof Song)) { + return false; + } + Song other = (Song) object; + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + return false; + } + return true; + } + + @Override + public String toString() { + return "net.locusworks.discord.eighttrack.database.entities.Song[ id=" + id + " ]"; + } + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/repos/GuildRepository.java b/src/main/java/net/locusworks/discord/eighttrack/database/repos/GuildRepository.java index 95e09d8..4650ee3 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/database/repos/GuildRepository.java +++ b/src/main/java/net/locusworks/discord/eighttrack/database/repos/GuildRepository.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: GuildRepository.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/repos/GuildSongRepository.java b/src/main/java/net/locusworks/discord/eighttrack/database/repos/GuildSongRepository.java new file mode 100644 index 0000000..a069a4d --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/database/repos/GuildSongRepository.java @@ -0,0 +1,51 @@ +/** + * + * Project: Eight Track, File: GuildSongRepository.java + * + * Copyright 2019-2019 Locusworks LLC. + * All rights reserved. Federal copyright law prohibits unauthorized reproduction by + * any means and imposes fines up to $25,000 for violation. No part of this material + * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, + * modified, duplicated, adapted or translated into another program language in any + * form or by any means, electronic, mechanical, photocopying, recording, or + * otherwise, without the prior written permission from Locusworks. Locusworks + * affirms that Eight-Track(R) software and data is subject to United States + * Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive + * Forney TX 75126, (802) 488-0438, for commercial licensing opportunities. + * + * IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY + * LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF + * THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND + * ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS + * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + */ +package net.locusworks.discord.eighttrack.database.repos; + +import java.util.List; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; + +import net.locusworks.discord.eighttrack.database.entities.DiscordGuild; +import net.locusworks.discord.eighttrack.database.entities.GuildSong; +import net.locusworks.discord.eighttrack.database.entities.Song; + +public interface GuildSongRepository extends CrudRepository { + + GuildSong findByGuildAndSong(DiscordGuild guild, Song song); + + @Query("SELECT gs FROM GuildSong gs WHERE gs.guild.guildId = ?1 AND gs.song.fileHash = ?2") + GuildSong findByGuildAndSongHash(Long guildId, String songHash); + + List findByGuild(DiscordGuild guild); + + @Query("SELECT gs FROM GuildSong gs WHERE gs.guild.guildId = ?1") + List findByGuild(Long guildId); + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/repos/SongRepository.java b/src/main/java/net/locusworks/discord/eighttrack/database/repos/SongRepository.java new file mode 100644 index 0000000..e0ea5bd --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/database/repos/SongRepository.java @@ -0,0 +1,39 @@ +/** + * + * Project: Eight Track, File: SongRepository.java + * + * Copyright 2019-2019 Locusworks LLC. + * All rights reserved. Federal copyright law prohibits unauthorized reproduction by + * any means and imposes fines up to $25,000 for violation. No part of this material + * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, + * modified, duplicated, adapted or translated into another program language in any + * form or by any means, electronic, mechanical, photocopying, recording, or + * otherwise, without the prior written permission from Locusworks. Locusworks + * affirms that Eight-Track(R) software and data is subject to United States + * Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive + * Forney TX 75126, (802) 488-0438, for commercial licensing opportunities. + * + * IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY + * LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF + * THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND + * ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS + * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + */ +package net.locusworks.discord.eighttrack.database.repos; + +import org.springframework.data.repository.CrudRepository; +import net.locusworks.discord.eighttrack.database.entities.Song; + +public interface SongRepository extends CrudRepository { + + Song findByUuid(String uuid); + + Song findByFileHash(String fileHash); + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/enums/Configuration.java b/src/main/java/net/locusworks/discord/eighttrack/enums/Configuration.java index de7ec76..9927b0e 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/enums/Configuration.java +++ b/src/main/java/net/locusworks/discord/eighttrack/enums/Configuration.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: Configuration.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java b/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java index c6844e4..de041bb 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java +++ b/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: DiscordEventHandler.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, @@ -43,6 +43,7 @@ import net.locusworks.discord.eighttrack.database.entities.DiscordGuild; import net.locusworks.discord.eighttrack.database.repos.GuildRepository; import net.locusworks.discord.eighttrack.services.ConfigurationService; import net.locusworks.discord.eighttrack.services.GuildMusicService; +import net.locusworks.discord.eighttrack.services.GuildSongRepoService; import net.locusworks.logger.ApplicationLogger; import net.locusworks.logger.ApplicationLoggerFactory; @@ -64,6 +65,9 @@ public class DiscordEventHandler extends ListenerAdapter { @Autowired private Mp3UploadHandler uploadHandler; + + @Autowired + private GuildSongRepoService guildSongRepoService; @PostConstruct private void init() throws IOException { @@ -106,7 +110,7 @@ public class DiscordEventHandler extends ListenerAdapter { private void onGuildMessageReceivedHelper(GuildMessageReceivedEvent event) throws IOException { if (!musicService.containsKey(event.getGuild().getIdLong())) { - musicService.put(event.getGuild().getIdLong(), new GuildMusicHandler(musicDir, uploadHandler)); + musicService.put(event.getGuild().getIdLong(), new GuildMusicHandler(musicDir, uploadHandler, guildSongRepoService)); } GuildMusicHandler gmh = musicService.get(event.getGuild().getIdLong()); gmh.accept((id) -> musicService.remove(id)); diff --git a/src/main/java/net/locusworks/discord/eighttrack/handlers/EightTrackAudioSendHandler.java b/src/main/java/net/locusworks/discord/eighttrack/handlers/EightTrackAudioSendHandler.java index e05df0b..335e61a 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/handlers/EightTrackAudioSendHandler.java +++ b/src/main/java/net/locusworks/discord/eighttrack/handlers/EightTrackAudioSendHandler.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: EightTrackAudioSendHandler.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/handlers/GuildMusicHandler.java b/src/main/java/net/locusworks/discord/eighttrack/handlers/GuildMusicHandler.java index 315bbde..4162671 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/handlers/GuildMusicHandler.java +++ b/src/main/java/net/locusworks/discord/eighttrack/handlers/GuildMusicHandler.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: GuildMusicHandler.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, @@ -29,10 +29,13 @@ package net.locusworks.discord.eighttrack.handlers; import java.awt.Color; import java.io.IOException; +import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.time.OffsetDateTime; +import java.util.Date; import java.util.List; +import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -51,7 +54,12 @@ import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.VoiceChannel; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.managers.AudioManager; +import net.locusworks.crypto.utils.HashUtils; +import net.locusworks.discord.eighttrack.database.entities.DiscordGuild; +import net.locusworks.discord.eighttrack.database.entities.GuildSong; +import net.locusworks.discord.eighttrack.database.entities.Song; import net.locusworks.discord.eighttrack.scheduler.TrackScheduler; +import net.locusworks.discord.eighttrack.services.GuildSongRepoService; import net.locusworks.logger.ApplicationLogger; import net.locusworks.logger.ApplicationLoggerFactory; @@ -69,13 +77,15 @@ public class GuildMusicHandler { private Consumer callback; private Mp3UploadHandler uploadHandler; + private GuildSongRepoService guildSongRepoService; - public GuildMusicHandler(Path musicDir, Mp3UploadHandler uploadHandler) throws IOException { + public GuildMusicHandler(Path musicDir, Mp3UploadHandler uploadHandler, GuildSongRepoService guildSongRepoService) throws IOException { this.logger = ApplicationLoggerFactory.getLogger(GuildMusicHandler.class); this.playing = new AtomicBoolean(false); this.musicDir = musicDir; this.lastPlayed = OffsetDateTime.now(); this.uploadHandler = uploadHandler; + this.guildSongRepoService = guildSongRepoService; this.apm = new DefaultAudioPlayerManager(); AudioSourceManagers.registerLocalSource(apm); @@ -211,16 +221,13 @@ public class GuildMusicHandler { for(Attachment attachment : event.getMessage().getAttachments()) { attachment.retrieveInputStream().thenAccept((in) -> { + Mp3UploadResults res = null; try { - Mp3UploadResults res = uploadHandler.parse(in); - - MessageEmbed embed = new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Upload Results") - .setDescription(res.toString()) - .setTimestamp(OffsetDateTime.now()) - .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl()) - .build(); + MessageEmbed embed = null; + res = uploadHandler.parse(in); + if (res.validFile()) { + embed =persistSong(res, event, attachment.getFileName()); + } event.getChannel().sendMessage(embed).queue(); } catch (Exception ex) { @@ -228,12 +235,72 @@ public class GuildMusicHandler { logger.error(ex); } finally { event.getMessage().delete().queue(); + if (res != null) res.clear(); } }).exceptionally((err) ->{ return null; }); } + } + + private MessageEmbed persistSong(Mp3UploadResults result, GuildMessageReceivedEvent event, String fileName) throws Exception { + + DiscordGuild guild = guildSongRepoService.getGuildRepo().findByGuildId(event.getGuild().getIdLong()); + if(guild == null) { + throw new IOException("Unable to find guild in database. Please contact administrator"); + } + + Path output = musicDir; + if (result.getArtist() != null) { + output = output.resolve(result.getArtist()); + if (result.getAlbum() != null) { + output = output.resolve(result.getAlbum()); + } + } + output = output.resolve(fileName); + + if (!Files.exists(output.toAbsolutePath().getParent())) { + Files.createDirectories(output.toAbsolutePath().getParent()); + } + + Files.write(output, result.getData()); + + Song song = new Song(); + song.setAlbum(result.getAlbum()); + song.setArtist(result.getArtist()); + song.setDateAdded(new Date()); + song.setDiscNumber(result.getDiscNumber()); + if (result.getDuration() != null) + song.setDuration(BigInteger.valueOf(result.getDuration())); + song.setFileHash(HashUtils.hash("SHA-1", result.getData())); + song.setFilePath(output.toAbsolutePath().toString()); + song.setGenre(result.getGenre()); + song.setReleaseYear(result.getReleaseDate()); + song.setTitle(result.getTitle()); + song.setTrackNumber(result.getTrackNumber()); + song.setUuid(UUID.nameUUIDFromBytes(result.getData()).toString()); + + guildSongRepoService.getSongRepo().save(song); + + GuildSong gs = new GuildSong(); + gs.setDateAdded(new Date()); + gs.setGuild(guild); + gs.setSong(song); + + guildSongRepoService.getGuildSongRepo().save(gs); + + String out = String.format("```%s%n%-10s: %s```", result, "UUID", song.getUuid()); + + MessageEmbed embed = new EmbedBuilder() + .setColor(Color.GREEN) + .setTitle("Upload Results for " + fileName) + .setDescription(out) + .setTimestamp(OffsetDateTime.now()) + .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl()) + .build(); + + return embed; } } diff --git a/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadHandler.java b/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadHandler.java index be6ed7e..b511448 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadHandler.java +++ b/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadHandler.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: Mp3UploadHandler.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, @@ -27,6 +27,8 @@ */ package net.locusworks.discord.eighttrack.handlers; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -50,16 +52,26 @@ public class Mp3UploadHandler { } public Mp3UploadResults parse(InputStream is) throws IOException { - try { + byte[] data; + try(InputStream in = is; ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + int read = 0; + byte[] buffer = new byte[1024 * 1024]; + while((read = in.read(buffer)) > 0) { + baos.write(buffer, 0, read); + } + data = baos.toByteArray(); + } + + try (InputStream in = new ByteArrayInputStream(data)) { BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); Mp3Parser parser = new Mp3Parser(); - parser.parse(is, handler, metadata, context); + parser.parse(in, handler, metadata, context); - return new Mp3UploadResults(metadata); + return new Mp3UploadResults(metadata, data); } catch (Exception ex) { throw new IOException(ex); } diff --git a/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadResults.java b/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadResults.java index cb016be..174e33a 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadResults.java +++ b/src/main/java/net/locusworks/discord/eighttrack/handlers/Mp3UploadResults.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: Mp3UploadResults.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, @@ -63,9 +63,11 @@ public class Mp3UploadResults { private String releaseDate; private Long duration; + private byte[] rawData; - public Mp3UploadResults( Metadata metadata) { + public Mp3UploadResults( Metadata metadata, byte[] data) { parseResults(metadata); + this.rawData = data; } private void parseResults(Metadata metadata) { @@ -83,6 +85,10 @@ public class Mp3UploadResults { duration = Double.valueOf(metadata.get(MetaDataField.DURATION.getValue())).longValue(); } } + + public final byte[] getData() { + return this.rawData; + } /** * @return the genre @@ -153,7 +159,7 @@ public class Mp3UploadResults { @Override public String toString() { - StringBuilder sb = new StringBuilder("```"); + StringBuilder sb = new StringBuilder(); if (getTitle() != null) sb.append(String.format("%-10s: %s%n", "Title", getTitle())); @@ -178,10 +184,13 @@ public class Mp3UploadResults { if (duration != null) sb.append(String.format("%-10s: %s%n", "Duration", dateFormat(getDuration()))); - sb.append("```"); return sb.toString(); } + public void clear() { + rawData = new byte[0]; + } + private String dateFormat(long timeInMilliSeconds) { long seconds = timeInMilliSeconds / 1000; long minutes = seconds / 60; diff --git a/src/main/java/net/locusworks/discord/eighttrack/main/EightTrackLauncher.java b/src/main/java/net/locusworks/discord/eighttrack/main/EightTrackLauncher.java index 7c09013..5298c09 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/main/EightTrackLauncher.java +++ b/src/main/java/net/locusworks/discord/eighttrack/main/EightTrackLauncher.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: EightTrackLauncher.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java b/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java index 715a047..f7bb4a1 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java +++ b/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: TrackScheduler.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/AESService.java b/src/main/java/net/locusworks/discord/eighttrack/services/AESService.java index 1351190..b3f6e68 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/services/AESService.java +++ b/src/main/java/net/locusworks/discord/eighttrack/services/AESService.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: AESService.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/ConfigurationService.java b/src/main/java/net/locusworks/discord/eighttrack/services/ConfigurationService.java index c2614f1..b349739 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/services/ConfigurationService.java +++ b/src/main/java/net/locusworks/discord/eighttrack/services/ConfigurationService.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: ConfigurationService.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java b/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java index 8ef52c3..c0fd67f 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java +++ b/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: DatabaseCleanupService.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java b/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java index 2ccf575..1b2ee63 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java +++ b/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: EightTrackService.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/GuildMusicService.java b/src/main/java/net/locusworks/discord/eighttrack/services/GuildMusicService.java index fede33a..4db286c 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/services/GuildMusicService.java +++ b/src/main/java/net/locusworks/discord/eighttrack/services/GuildMusicService.java @@ -2,7 +2,7 @@ * * Project: Eight Track, File: GuildMusicService.java * - * Copyright 2019 Locusworks LLC. + * Copyright 2019-2019 Locusworks LLC. * All rights reserved. Federal copyright law prohibits unauthorized reproduction by * any means and imposes fines up to $25,000 for violation. No part of this material * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/GuildSongRepoService.java b/src/main/java/net/locusworks/discord/eighttrack/services/GuildSongRepoService.java new file mode 100644 index 0000000..33ee8cc --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/services/GuildSongRepoService.java @@ -0,0 +1,70 @@ +/** + * + * Project: Eight Track, File: GuildSongRepoService.java + * + * Copyright 2019-2019 Locusworks LLC. + * All rights reserved. Federal copyright law prohibits unauthorized reproduction by + * any means and imposes fines up to $25,000 for violation. No part of this material + * may be reproduced, transmitted, transcribed, stored in a retrieval system, copied, + * modified, duplicated, adapted or translated into another program language in any + * form or by any means, electronic, mechanical, photocopying, recording, or + * otherwise, without the prior written permission from Locusworks. Locusworks + * affirms that Eight-Track(R) software and data is subject to United States + * Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive + * Forney TX 75126, (802) 488-0438, for commercial licensing opportunities. + * + * IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY + * LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF + * THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND + * ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS + * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + */ +package net.locusworks.discord.eighttrack.services; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import net.locusworks.discord.eighttrack.database.repos.GuildRepository; +import net.locusworks.discord.eighttrack.database.repos.GuildSongRepository; +import net.locusworks.discord.eighttrack.database.repos.SongRepository; + +@Service +public class GuildSongRepoService { + + @Autowired + private GuildRepository guildRepo; + + @Autowired + private GuildSongRepository guildSongRepo; + + @Autowired + private SongRepository songRepo; + + /** + * @return the guildRepo + */ + public final GuildRepository getGuildRepo() { + return guildRepo; + } + + /** + * @return the guildSongRepo + */ + public final GuildSongRepository getGuildSongRepo() { + return guildSongRepo; + } + + /** + * @return the songRepo + */ + public final SongRepository getSongRepo() { + return songRepo; + } + +} diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..eb8ffd7 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,17 @@ + + + + org.eclipse.persistence.jpa.PersistenceProvider + net.locusworks.discord.eighttrack.database.entities.GuildSong + net.locusworks.discord.eighttrack.database.entities.GuildPlaylist + net.locusworks.discord.eighttrack.database.entities.DiscordGuild + net.locusworks.discord.eighttrack.database.entities.Song + net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong + + + + + + + + diff --git a/src/main/resources/database/migration/mariadb/Tables/V01_000_000__initial_tables.sql b/src/main/resources/database/migration/mariadb/Tables/V01_000_000__initial_tables.sql index 6aa1706..947cff1 100644 --- a/src/main/resources/database/migration/mariadb/Tables/V01_000_000__initial_tables.sql +++ b/src/main/resources/database/migration/mariadb/Tables/V01_000_000__initial_tables.sql @@ -6,3 +6,58 @@ CREATE TABLE eighttrack.discord_guild ( PRIMARY KEY (id), UNIQUE KEY guild_UN (guild_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Information about discord guild'; + +CREATE TABLE eighttrack.song ( + id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', + uuid varchar(100) NOT NULL COMMENT 'Unique Identifier', + title varchar(500) NOT NULL COMMENT 'title of song', + artist varchar(500) DEFAULT NULL COMMENT 'songs artist', + album varchar(500) DEFAULT NULL COMMENT 'songs album', + genre varchar(500) DEFAULT NULL COMMENT 'songs genre', + track_number varchar(100) DEFAULT NULL COMMENT 'track number', + disc_number varchar(100) DEFAULT NULL COMMENT 'disc number', + release_year varchar(100) DEFAULT NULL COMMENT 'release year', + duration bigint(20) DEFAULT NULL COMMENT 'songs duration', + file_path varchar(5000) NOT NULL COMMENT 'file location on local file system', + file_hash varchar(40) NOT NULL COMMENT 'sha1 hash of file', + date_added timestamp NULL DEFAULT NULL, + PRIMARY KEY (id), + UNIQUE KEY song_uuid_UN (uuid), + UNIQUE KEY song_file_hash_UN (file_hash) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE eighttrack.guild_song ( + id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key', + guild bigint(20) NOT NULL COMMENT 'guild the song belongs to', + song bigint(20) NOT NULL COMMENT 'the song', + date_added timestamp NULL DEFAULT NULL COMMENT 'date added', + PRIMARY KEY (id), + UNIQUE KEY guild_song_UN (guild,song), + KEY guild_song_FK_1 (song), + CONSTRAINT guild_song_FK FOREIGN KEY (guild) REFERENCES eighttrack.discord_guild (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT guild_song_FK_1 FOREIGN KEY (song) REFERENCES eighttrack.song (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE eighttrack.guild_playlist ( + id bigint(20) NOT NULL AUTO_INCREMENT, + guild bigint(20) NOT NULL, + userId bigint(20) NOT NULL, + playlist varchar(500) NOT NULL, + date_added timestamp NULL DEFAULT NULL, + PRIMARY KEY (id), + UNIQUE KEY guild_playlist_UN (guild,userId,playlist), + CONSTRAINT guild_playlist_FK FOREIGN KEY (guild) REFERENCES eighttrack.discord_guild (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +CREATE TABLE eighttrack.guild_playlist_song ( + id bigint(20) NOT NULL AUTO_INCREMENT, + guild_playlist bigint(20) NOT NULL, + guild_song bigint(20) NOT NULL, + date_added timestamp NULL DEFAULT NULL, + PRIMARY KEY (id), + UNIQUE KEY guild_playlist_song_UN (guild_playlist,guild_song), + KEY guild_playlist_song_FK_1 (guild_song), + CONSTRAINT guild_playlist_song_FK FOREIGN KEY (guild_playlist) REFERENCES eighttrack.guild_playlist (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT guild_playlist_song_FK_1 FOREIGN KEY (guild_song) REFERENCES eighttrack.guild_song (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file