Дипломная работа: Социальная подкаст-платформа

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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 {