this.subscribersCount--;
}
public void subscribersCountInc() {
this.subscribersCount++;
}
}
Файл: Discasst\src\main\java\discasst\entity\RatingEntity.java
package discasst.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@Data
public class RatingEntity {
@Id
@GeneratedValue
private long id;
private long userId;
private long podcastId;
private boolean decision;
public RatingEntity(long userId, long podcastId, boolean decision) {
this.userId = userId;
this.podcastId = podcastId;
this.decision = decision;
}
public long getUserId() {
return userId;
}
public long getPodcastId() {
return podcastId;
}
public void setDecision(boolean decision) {
this.decision = decision;
}
public boolean isDecision() {
return decision;
}
}
Файл: Discasst\src\main\java\discasst\entity\Role.java
package discasst.entity;
import org.springframework.security.core.GrantedAuthority;
public enum Role implements GrantedAuthority {
ROLE_USER, ROLE_ADMIN;
@Override
public String getAuthority() {
return name();
}
}
Файл: Discasst\src\main\java\discasst\entity\SubscribeEntity.java
package discasst.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@Data
public class SubscribeEntity {
@Id
@GeneratedValue
private long id;
private long userId;
private long podcastId;
private boolean isSubscribed;
public SubscribeEntity(long userId, long podcastId, boolean sub) {
this.userId = userId;
this.podcastId = podcastId;
this.isSubscribed = sub;
}
public boolean isSubscribed() {
return isSubscribed;
}
public void setSubscribed(boolean subscribed) {
isSubscribed = subscribed;
}
}
Файл: Discasst\src\main\java\discasst\entity\Tweet.java
package discasst.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@Data
@Entity
public class Tweet {
@Id
@GeneratedValue
private long id;
private long podcastId;
private long authorId;
private String authorUsername;
private String text;
private String creationDate;
public Tweet(String text) {
Random r = new Random();
int v = r.nextInt(3);
this.podcastId = 21;
this.authorId = v == 0 ? 17: v == 1 ? 18: 19;
this.text = text;
this.creationDate = new SimpleDateFormat("dd.MM.yy HH:mm").format(new Date());
this.authorUsername = v == 0 ? "vedensky": v == 1 ? "istishev": "ilyaliya";
}
public long getAuthorId() {
return authorId;
}
public String getAuthorNickName() {
return authorUsername;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public void setCreationDate() {
this.creationDate = new SimpleDateFormat("dd.MM.yy HH:mm").format(new Date());
}
}
Файл: Discasst\src\main\java\discasst\entity\User.java
package discasst.entity;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@Entity
@Data
public class User implements UserDetails {
@Id
@GeneratedValue
private long id;
@Transient
private List<Role> authorities = new ArrayList<Role>(){{add(Role.ROLE_USER);}};
private boolean accountNonExpired = true;
private boolean accountNonLocked = true;
private boolean credentialsNonExpired = true;
private boolean enabled = true;
@Column(unique = true)
private String username;
private String password;
private String email;
private String name;
private String creationDate;
public User(String username, String email, String password, String name) {
this.username = username;
this.email = email;
this.password = password;
this.name = name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
public void setCreationDate(Date date) {
this.creationDate = new SimpleDateFormat("dd.MM.yy").format(date);
}
}
Файл: Discasst\src\main\java\discasst\loaders\DatabaseLoader.java
package discasst.loaders;
import discasst.da.*;
import discasst.entity.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Component
public class DatabaseLoader implements CommandLineRunner {
@Autowired
private UserRepository userRepository;
@Autowired
private PodcastRepository podcastRepository;
@Autowired
private GenreRepository genreRepository;
@Autowired
private EpisodeRepository episodeRepository;
@Autowired
private TweetRepository tweetRepository;
@Autowired
private CoauthorsRepository coauthorsRepository;
@Override
public void run(String... strings) {
List<String> genres = Arrays.asList("Обо всем", "Авто", "Аудиокниги", "Бизнес и карьера", "Интернет и технологии"
, "Кино и музыка", "Красота и здоровье", "Культура и искусство", "Наука и образование", "Политика"
, "Отношения", "Путешествия", "Спорт", "Видеоигры");
for (String name: genres) {
this.genreRepository.save(new Genre(name));
}
this.userRepository.save(new User("finch", "sal0212@mail.ru", new BCryptPasswordEncoder().encode("finch"), "FINCH"));
this.userRepository.save(new User("q", "qqq@mail.ru", new BCryptPasswordEncoder().encode("q"), "bigQ"));
this.userRepository.save(new User("vedensky", "vedensky@gmail.com", new BCryptPasswordEncoder().encode("vedensky"), "Борис Веденский"));
this.userRepository.save(new User("istishev", "istishev@mail.ru", new BCryptPasswordEncoder().encode("istishev"), "Валерий Истишев"));
this.userRepository.save(new User("ilyaliya", "ilyaliya@gmail.com", new BCryptPasswordEncoder().encode("ilyaliya"), "Илья Рябов"));
String podDesc = "Завтракаст один из самых популярных подкастов про игры, медиа, кино, сериалы и технологии в России. Его ведущими являются три очень разных человека маркетолог Тимур, технический директор Дима и видеопродюсер Максим. Их объединяет любовь к играм, книгам, сериалам, кино, новым технологиям, трендам в интернете и интересным событиям вокруг нас.";
this.podcastRepository.save(new Podcast("Завтракаст", podDesc, 404, 13, 0));
podDesc = "Раз в неделю Борис Веденский, Валерий Истишев и Илья Рябов соберутся, чтобы сжечь несколько ведьм, разоблачить пару заговоров, обсудить последние новости интернета, технологий, кино и видеоигр в неформальной обстановке.";
this.podcastRepository.save(new Podcast("Droider Cast", podDesc, "https://itunes.apple.com/ru/podcast/droider-cast/id1057019371?mt=2", "https://vk.com/droider_ru", "https://twitter.com/vedensky", "https://www.facebook.com/Droider", 12, 4, 509, 217, 17));
this.podcastRepository.save(new Podcast("Newочём", "Мы переводим и озвучиваем всё самое интересное, что появляется в зарубежном Интернете.", 342, 0, 0));
podDesc = "Рассказываем обо всём, что можно «взломать»: о здоровье, работе и технологиях, об образовании, спорте и отдыхе, об отношениях, финансах и мотивации. Помогаем решить проблемы или упростить ситуации, с которыми вы сталкиваетесь каждый день. Отвечаем на вопросы и призываем посмотреть на привычные вещи другими глазами.";
this.podcastRepository.save(new Podcast("Подкаст «Лайфхакера»", podDesc, 15, 0, 0));
podDesc = "Наше психологическое радио о простых и сложных переживаниях, о психологии эмоций, личной эффективности и личностном развитии, о саногенном мышлении, мы рассказываем на простых примерах, как пережить те или иные эмоции, как то: страх, гнев, стыд, обида или вина, либо вообще их угасить. Наши подкастырассказывают как контролируемое спокойствие влияет на результаты в бизнесе, спорте, развитии личности и личной жизни. Приятного прослушивания! ";
this.podcastRepository.save(new Podcast("Психология: мифы и реальность.", podDesc, 221, 8, 0));
podDesc = "Программа о том, как выучить английский язык быстро и без лишних усилий. Вы узнаете, как пополнить словарный запас, разобраться в правилах грамматики, поставить произношение. А самое главное -- освоить логику английского языка и научиться думать на нём.";
this.podcastRepository.save(new Podcast("Учим английский с Don't Speak", podDesc, 159, 8, 0));
podDesc = "Что может быть лучше душевной беседы? Только душевная беседа двух рыжих чуваков. Каждое воскресенье Константин Тростенюк и Денис Карамышев экспертно анализируют всё, что достойно экспертного анализа.";
this.podcastRepository.save(new Podcast("Душевный подкаст", podDesc, 407, 13, 0));
this.podcastRepository.save(new Podcast("Вечерние чтения", "Озвучиваю самое интересное из прочитанного за день.", 93, 2, 0));
podDesc = "Радио ENERGY, частота в Москве 104.2 FM, получила официальное разрешение на использование всемирно известного товарного знака NRJ / Energy, которым владеет французская медиагруппа «Эн Эр Жи» («NRJ Group»). Это стало возможным в результате переговоров, проходивших в 2006 году между представителями Группы и «ВКПМ». NRJ создает специальные проекты, самым известным из которых является ежегодная музыкальная премия NRJ Music Awards. Радиостанции с торговой маркой NRJ / Energy работают в Австрии, Бельгии, Болгарии, Германии, Дании, Норвегии, Финляндии, Швейцарии, Швеции, а также в Ливане и на Украине.\n\nСетевое издание ENERGYFM.RU, свидетельство о регистрации СМИ Эл № ФС77-50193 от 15.06.2012, выдано Федеральной службой по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор).";
this.podcastRepository.save(new Podcast("NRJ RUSSIA", podDesc, 213, 5, 0));
this.podcastRepository.save(new Podcast("Предназначение. Дело Жизни", "Обсуждаются такие вопросы:\nПредназначение\nМотивация\nЭмоциональное выгорание\nЛень и прокрастинация\nCамоопределение\nКак найти себяПрофориентация\nПризвание\nКем быть в жизни\nДело Жизни\nПродуктивность\n\nВ эфире:\nИстории раскрытия и монетизации дела жизни. Короткие практики и медитации для самостоятельной работы. Методики и модели раскрытия предназначения. Записи выступлений и вебинаров Павла Кочкина. Ответы на вопросы подписчиков.", 277, 8, 0));
this.podcastRepository.save(new Podcast("Игровой Батискаф", "Лучшее со дна игровой индустрии в исполнении знатных водолазов.", 407, 13, 0));
this.episodeRepository.save(new Episode(21, "Droider Cast 1", "1 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/50", new Date(2018, 9, 22)));
this.episodeRepository.save(new Episode(21, "Droider Cast 2", "2 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/51", new Date(2018, 10, 12)));
this.episodeRepository.save(new Episode(21, "Droider Cast 3", "3 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/52", new Date(2018, 10, 22)));
this.episodeRepository.save(new Episode(21, "Droider Cast 4", "4 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 10, 27)));
this.episodeRepository.save(new Episode(21, "Droider Cast 5", "5 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 11, 2)));
this.episodeRepository.save(new Episode(21, "Droider Cast 6", "6 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 11, 12)));
this.episodeRepository.save(new Episode(21, "Droider Cast 7", "7 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 11, 21)));
this.episodeRepository.save(new Episode(21, "Droider Cast 8", "8 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 12, 2)));
this.episodeRepository.save(new Episode(21, "Droider Cast 9", "9 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 12, 9)));
this.episodeRepository.save(new Episode(21, "Droider Cast 10", "10 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 12, 16)));
this.episodeRepository.save(new Episode(21, "Droider Cast 11", "11 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2018, 12, 24)));
this.episodeRepository.save(new Episode(21, "Droider Cast 12", "12 выпуск подкаста \"Droider Cast\"", "https://droidercast.podster.fm/53", new Date(2019, 1, 5)));
for (int i = 1; i <= 25; i++) {
this.tweetRepository.save(new Tweet("Droider Cast Твит " + i + "!"));
}
this.coauthorsRepository.save(new CoauthorsEntity(21, 18));
this.coauthorsRepository.save(new CoauthorsEntity(21, 19));
}
}
Файл: Discasst\src\main\java\discasst\service\PodcastService.java
package discasst.service;
import com.google.gson.Gson;
import discasst.da.*;
import discasst.entity.CoauthorsEntity;
import discasst.entity.Episode;
import discasst.entity.Genre;
import discasst.entity.Podcast;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import javax.transaction.Transactional;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@Service
@RestController
public class PodcastService {
@Autowired
private GenreRepository genreRepository;
@Autowired
private PodcastRepository podcastRepository;
@Autowired
private EpisodeRepository episodeRepository;
@Autowired
private CoauthorsRepository coauthorsRepository;
@Autowired
private SubscribeRepository subscribeRepository;
@Autowired
private TweetRepository tweetRepository;
@Autowired
private RatingRepository ratingRepository;
@RequestMapping(value = "/getGenres", method = RequestMethod.GET)
public List<Genre> getGenres() {
List<Genre> genres = genreRepository.findAll();
if (genres != null) return genres;
else throw new UsernameNotFoundException("Genres not found!");
}
@RequestMapping(value = "/createPodcast")
public @ResponseBody
void createPodcast(@RequestBody String podcast) {
Gson g = new Gson();
Podcast pod = g.fromJson(podcast, Podcast.class);
pod.setCreationDate(new Date());
podcastRepository.save(pod);
}
@Transactional
@RequestMapping(value = "/removePodcast", method = RequestMethod.POST)
public @ResponseBody
void removePodcast(@RequestParam(value = "id") long id) {
episodeRepository.deleteAllByPodcastId(id);
coauthorsRepository.deleteAllByPodcastId(id);
tweetRepository.deleteAllByPodcastId(id);
subscribeRepository.deleteAllByPodcastId(id);
ratingRepository.deleteAllByPodcastId(id);
podcastRepository.deleteById(id);
}
@RequestMapping(value = "/getPodcastsByUserId")
public @ResponseBody
List<Podcast> getPodcastsByUserId(@RequestParam(value = "id") long id) {
return podcastRepository.findAllByAuthorId(id);
}
@RequestMapping(value = "/getPodcastsByUserIdInCoauthors")
public @ResponseBody
List<Podcast> getPodcastsByUserIdInCoauthors(@RequestParam(value = "id") long id) {
long[] ids = coauthorsRepository.findAllByUserId(id);
return podcastRepository.findAllByIdIn(ids);
}
@RequestMapping(value = "/createEpisode")
public @ResponseBody
void createEpisode(@RequestBody String episode) {
Gson g = new Gson();
Episode newEpisode = g.fromJson(episode, Episode.class);
newEpisode.setDate(new Date());
episodeRepository.save(newEpisode);
Podcast pod = podcastRepository.findById(newEpisode.getPodcastId());
pod.setEpisodeCount(pod.getEpisodeCount() + 1);
podcastRepository.save(pod);
}
@RequestMapping(value = "/getEpisodesByPodcastIdInPage")
public @ResponseBody
Page<Episode> getAllEpisodesByPodcastIdInPage(
@RequestParam(value = "id") long id, Pageable pageable) {
return episodeRepository.findAllByPodcastIdOrderByIdDesc(id, pageable);
}
@Transactional
@RequestMapping(value = "/getEpisodesInFeedByUserIdInPage")
public @ResponseBody
Page<Episode> getEpisodesInFeedByUserIdInPage(@RequestParam(value = "id") long id, Pageable pageable) {
long[] subs = subscribeRepository.findAllByUserId(id);
return episodeRepository.findAllByPodcastIdInOrderByIdDesc(subs, pageable);
}
@RequestMapping(value = "/getEpisodesCountToday")
public @ResponseBody
int getEpisodesCountToday() throws ParseException {
String today = new SimpleDateFormat("dd.MM.yy").format(new Date());
return episodeRepository.findAllByDate(today).size();
}
@RequestMapping(value = "/getEpisodesCountThisMounth")
public @ResponseBody
int getEpisodesCountThisMounth() throws ParseException {
String today = new SimpleDateFormat("MM.yy").format(new Date());
return episodeRepository.findAllInThisMonth("%" + today + "%").size();
}
@RequestMapping(value = "/getPodcastsCountToday")
public @ResponseBody
int getPodcastsCountToday() throws ParseException {
String today = new SimpleDateFormat("dd.MM.yy").format(new Date());
return podcastRepository.findAllByCreationDate(today).size();
}
@RequestMapping(value = "/getPodcastsCountThisMounth")
public @ResponseBody
int getPodcastsCountThisMounth() throws ParseException {