diff --git a/.gitignore b/.gitignore index 323a898..de51f68 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ # profiling files chrome-profiler-events*.json -speed-measure-plugin*.json # IDEs and editors /.idea @@ -40,13 +39,7 @@ npm-debug.log yarn-error.log testem.log /typings -*.env # System Files .DS_Store Thumbs.db - -/backend/database/ -/backend/node_modules/ - -package-lock.json diff --git a/README.md b/README.md index 13b2e84..4722e70 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,19 @@ -# Frontend +# UserAndAdvertiser -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.7. +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.2.14. ## Development server Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. ## Code scaffolding -à -Run `ng generate component component-title` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. ## Build -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. +Then run `npm start` ## Running unit tests @@ -20,7 +21,7 @@ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github. ## Running end-to-end tests -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. ## Further help diff --git a/angular.json b/angular.json index 4f6d04d..9efa4cd 100644 --- a/angular.json +++ b/angular.json @@ -3,11 +3,14 @@ "version": 1, "newProjectRoot": "projects", "projects": { - "frontend": { + "userAndAdvertiser": { "projectType": "application", "schematics": { "@schematics/angular:component": { "style": "scss" + }, + "@schematics/angular:application": { + "strict": true } }, "root": "", @@ -17,12 +20,12 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist/frontend", + "outputPath": "dist/frontend-userAndAdvertiser", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", - "aot": true, + "inlineStyleLanguage": "scss", "assets": [ "src/favicon.ico", "src/assets" @@ -32,56 +35,57 @@ "src/styles.scss", "node_modules/bootstrap/scss/bootstrap.scss" ], - "scripts": [ - "node_modules/jquery/dist/jquery.js", - "node_modules/bootstrap/dist/js/bootstrap.js" - ] + "scripts": [] }, "configurations": { "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "1mb", + "maximumError": "2mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" - } - ] + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true } - } + }, + "defaultConfiguration": "production" }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "frontend:build" - }, "configurations": { "production": { - "browserTarget": "frontend:build:production" + "browserTarget": "userAndAdvertiser:build:production" + }, + "development": { + "browserTarget": "userAndAdvertiser:build:development" } - } + }, + "defaultConfiguration": "development" }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "frontend:build" + "browserTarget": "userAndAdvertiser:build" } }, "test": { @@ -91,44 +95,19 @@ "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", + "inlineStyleLanguage": "scss", "assets": [ "src/favicon.ico", "src/assets" ], "styles": [ - "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", "src/styles.scss" ], "scripts": [] } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "tsconfig.app.json", - "tsconfig.spec.json", - "e2e/tsconfig.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "frontend:serve" - }, - "configurations": { - "production": { - "devServerTarget": "frontend:serve:production" - } - } } } } }, - "defaultProject": "frontend" + "defaultProject": "userAndAdvertiser" } diff --git a/app-backend/config/functions.config.js b/app-backend/config/functions.config.js deleted file mode 100644 index b229914..0000000 --- a/app-backend/config/functions.config.js +++ /dev/null @@ -1,26 +0,0 @@ -const request = require("request"); -const VideoCategories = require("../models/objects/video.categories.model"); - -function asyncRequest(uri, option){ - return new Promise(function(resolve){ - request(uri, option,function (error, response, body){ - resolve({response: response, body: JSON.parse(body)}); - }); - }); -} -module.exports.asyncRequest = asyncRequest; - -function asyncInterest(interest, source){ - return new Promise(function(resolve){ - for(const i in VideoCategories){ - for(const j in VideoCategories[i].categories){ - if((VideoCategories[i].categories[j].name === interest || VideoCategories[i].categories[j].id === interest) - && VideoCategories[i].categories[j].source === source){ - resolve(VideoCategories[i].interest); - } - } - } - resolve(null); - }); -} -module.exports.asyncInterest = asyncInterest; diff --git a/app-backend/config/host.config.js b/app-backend/config/host.config.js deleted file mode 100644 index 6a62f28..0000000 --- a/app-backend/config/host.config.js +++ /dev/null @@ -1,26 +0,0 @@ -if(process.env.YOUTUBE_API_KEY === undefined || - process.env.YOUTUBE_API_KEY === '' || - process.env.DAILYMOTION_API_KEY === undefined || - process.env.DAILYMOTION_API_KEY === ''){ - console.log('Error Env YOUTUBE_API_KEY & DAILYMOTION_API_KEY Variables'); - process.exit(); -} - -console.log('Env variables YOUTUBE_API_KEY & DAILYMOTION_API_KEY received'); - -module.exports = { - youtube: { - name: "Youtube", - shortname: "yt", - baseAPIUrl: 'https://youtube.googleapis.com/youtube/v3', - baseChannelUrl: 'https://www.youtube.com/channel/', - YOUTUBE_API_KEY: process.env.YOUTUBE_API_KEY - }, - dailymotion: { - name: "Dailymotion", - shortname: "dm", - baseAPIUrl: 'https://api.dailymotion.com', - baseChannelUrl: 'https://www.dailymotion.com/', - DAILYMOTION_API_KEY: process.env.DAILYMOTION_API_KEY - } -}; diff --git a/app-backend/config/mongodb.config.js b/app-backend/config/mongodb.config.js deleted file mode 100644 index 2180acc..0000000 --- a/app-backend/config/mongodb.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - prodUrl: process.env.DATABASE, - devUrl: "mongodb://127.0.0.1:27017/polynotfound" -}; diff --git a/app-backend/config/response.config.js b/app-backend/config/response.config.js deleted file mode 100644 index dfca2db..0000000 --- a/app-backend/config/response.config.js +++ /dev/null @@ -1,9 +0,0 @@ -function sendMessage (res, successCode, data, token=null) { - res.status(200).json({ status: 'success', successCode: successCode, token: token, data: data }); -} - -function sendError (res, statusCode, errorCode, reason, token=null) { - res.status(statusCode).json({ status: 'error', errorCode: errorCode, token: token, reason: reason}); -} - -module.exports = { sendMessage, sendError }; diff --git a/app-backend/config/sessionJWT.config.js b/app-backend/config/sessionJWT.config.js deleted file mode 100644 index 7dbc86c..0000000 --- a/app-backend/config/sessionJWT.config.js +++ /dev/null @@ -1,109 +0,0 @@ -const sessionJWTConfig = require ('jsonwebtoken'); -require('dotenv').config({ path: './app-backend/.env' }); -const {sendError} = require ("./response.config"); - -if(process.env.JWTRS256_PRIVATE_KEY === undefined || process.env.JWTRS256_PUBLIC_KEY === undefined){ - console.log('Error Env JWTRS256_PRIVATE_KEY & JWTRS256_PUBLIC_KEY Variables'); - process.exit(); -} - -console.log('Env variables JWTRS256_PRIVATE_KEY & JWTRS256_PUBLIC_KEY received'); -const JWTRS256_PRIVATE_KEY = Buffer.from(process.env.JWTRS256_PRIVATE_KEY, 'base64').toString('utf-8'); -const JWTRS256_PUBLIC_KEY = Buffer.from(process.env.JWTRS256_PUBLIC_KEY, 'base64').toString('utf-8'); - - -function createSessionJWT (id, email, profileImageUrl, role) { - return sessionJWTConfig.sign( - { - id: id, - email: email, - profileImageUrl: profileImageUrl, - role: role, - midExp: Math.floor(Date.now() / 1000) + 1800 - }, - JWTRS256_PRIVATE_KEY, - { - algorithm: 'RS256', - expiresIn: '1h' - } - ); -} - -function createSessionCookie(req, res, payload) { - let jwtToken; - if (typeof payload.id !== 'undefined' && - typeof payload.email !== 'undefined' && - typeof payload.profileImageUrl !== 'undefined' && - typeof payload.role !== 'undefined' && - typeof payload.midExp !== 'undefined' && - (Math.floor(Date.now() / 1000) <= payload.midExp)) { - jwtToken = req.headers.cookie; - } - else { - jwtToken = createSessionJWT(payload.id, payload.email, payload.profileImageUrl, payload.role); - } - res.cookie('SESSIONID', jwtToken, {httpOnly:true, secure:false}); -} - -function decodeSessionCookie(sessionid) { - if (typeof sessionid === 'undefined') { - return {id: -1, email: -1, profileImageUrl: -1, role: -1}; - } - try { - const token = sessionJWTConfig.verify( - sessionid, - JWTRS256_PUBLIC_KEY, - {algorithms: ['RS256']}); - return {token: token}; - } - catch (err) { - return {id: -1, email: -1, profileImageUrl: -1, role: -1}; - } -} - -function getSession(sessionid) { - return decodeSessionCookie(sessionid); -} -module.exports.getSession = getSession - -function setSessionCookie (req, res, session) { - createSessionCookie(req, res, session); -} -module.exports.setSessionCookie = setSessionCookie; - -function getToken(session) { - if (typeof session === 'undefined' || typeof session.token === 'undefined') return -1; - return session.token; -} -module.exports.getToken = getToken; - -function checkLogin(req, res, role=null){ - if(typeof req.cookies !== 'undefined'){ - const session = getSession(req.cookies.SESSIONID); - const token = getToken(session); - if(typeof token.email === 'undefined' || - token.email === -1 || - typeof token.id === 'undefined' || - token.id === -1){ - return sendError(res, 500, 102, "User not authenticated."); - } else { - token.midExp = new Date(token.midExp*1000); - token.iat = new Date(token.iat*1000); - token.exp = new Date(token.exp*1000); - if(role === null){ - return token; - } else { - if(typeof token.role !== 'undefined' && - ((Array.isArray(role) && role.includes(token.role)) || - ( typeof role === 'object' && typeof token.role.permission !== 'undefined' && token.role.permission >= role.permission && token.role.isAccepted === true))){ - return token; - } else { - return sendError(res, 500, 106, "User doesn't have permission.", token); - } - } - } - } else { - return sendError(res, 500, -1, "Cookies don't exist."); - } -} -module.exports.checkLogin = checkLogin; diff --git a/app-backend/controllers/ad.controller.js b/app-backend/controllers/ad.controller.js deleted file mode 100644 index d92be1f..0000000 --- a/app-backend/controllers/ad.controller.js +++ /dev/null @@ -1,290 +0,0 @@ -const db = require("../models/mongodb.model"); -const {sendError, sendMessage} = require ("../config/response.config"); -const {checkLogin} = require("../config/sessionJWT.config"); -const ObjectId = require('mongoose').Types.ObjectId; -const roles = require("../models/objects/role.model"); -const Ad = db.ads; - -// Create a new Ad -exports.create = (req, res) => { - const token = checkLogin(req, res, roles.Advertiser); - if(token && req.body.title){ - Ad.exists({title: req.body.title, userId: token.id, isActive: true}, function (err, docs){ - if(err){ - sendError(res, 500,100,err.message || "Some error occurred while checking if the Ad already exists.", token); - } else{ - if(docs === null) { - let ad; - - ad = new Ad({ - userId: token.id, - title: req.body.title, - images: req.body.images ? req.body.images : undefined, - url: req.body.url ? req.body.url : undefined, - interests: req.body.interests ? req.body.interests : undefined, - comment: req.body.comment ? req.body.comment : undefined, - isVisible: req.body.isVisible ? req.body.isVisible : undefined, - isActive: req.body.isActive ? req.body.isActive : undefined - }); - - // Save User in the database - ad - .save(ad) - .then(data => { - return sendMessage(res, 41, data, token) - }) - .catch(err => { - return sendError(res, 500,100,err.message || "Some error occurred while creating the Ad.", token); - }); - } else{ - return sendError(res, 500, 104, err || `Ad ${req.body.title} already exists.`, token); - } - } - }); - } else { - return sendError(res, 500, -1, `No title given`, token); - } -}; - -// Retrieve all Ad from id if admin or session id -exports.findAll = (req, res) => { - const token = checkLogin(req, res, roles.Advertiser); - if(token){ - let query = {}; - let condition; - - const adId = req.query.adId; - condition = adId ? adId : undefined; - query._id = condition; - - let userId; - if(typeof token.role !== 'undefined' && - typeof token.role.permission !== 'undefined' && - typeof token.role.isAccepted !== 'undefined' && - token.role.isAccepted === true && - token.role.permission >= roles.Admin.permission) { - userId = req.query.userId; - } else { - userId = token.id; - } - condition = userId ? userId : undefined; - query.userId = condition; - - const title = req.query.title; - condition = title ? { $regex: new RegExp(title), $options: "i" } : undefined; - query.title = condition; - - const url = req.query.url; - condition = url ? { $regex: new RegExp(url), $options: "i" } : undefined; - query.url = condition; - - const interests = req.query.interests; - condition = interests ? {$in: interests.split(',')} : undefined; - query["interests.interest"] = condition - - const comment = req.query.comment; - condition = comment ? { $regex: new RegExp(comment), $options: "i" } : undefined; - query.comment = condition; - - const isVisible = req.query.isVisible; - condition = isVisible ? isVisible : undefined; - query.isVisible = condition; - - const isActive = req.query.isActive; - condition = isActive ? isActive : undefined; - query.isActive = condition; - - const sort = req.query.sort; - if(sort !== 'undefined'){ - switch (sort){ - case 'asc': - condition = {title: 1}; - break; - case 'desc': - condition = {title: -1}; - break; - case 'createdAtAsc': - condition = {createdAt: 1}; - break; - case 'createdAtDesc': - condition = {createdAt: -1}; - break; - case 'updatedAtAsc': - condition = {updatedAt: 1}; - break; - case 'updatedAtDesc': - condition = {updatedAt: -1}; - break; - default: - condition = {title: 1}; - } - } - const query_sort = {sort: condition}; - - // Remove undefined key - Object.keys(query).forEach(key => query[key] === undefined ? delete query[key] : {}); - console.log(query); - - Ad.find(query, {}, query_sort) - .then(data => { - if(data){ - return sendMessage(res, 42, data, token); - } - }) - .catch(err => { - return sendError(res,500,100,err.message || "Some error occurred while finding the Ads.", token); - }); - } -}; - -// Find single Ad from id if admin or session id -exports.findOne = (req, res) => { - const token = checkLogin(req, res, roles.Advertiser); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(id && ObjectId.isValid(id)){ - Ad.findById(id, {}) - .then(data => { - if(data){ - return sendMessage(res, 43, data, token); - } else { - return sendError(res,404,105,`Ad not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res,500,100,err.message || `Some error occurred while finding the Ad with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Update a Ad with ad id -exports.update = (req, res) => { - const token = checkLogin(req, res, roles.Advertiser); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(typeof req.body._id !== 'undefined' || typeof req.body.id !== 'undefined'){ - return sendError(res, 500, -1, `User do not have the permission to modify id or _id`, token); - } else{ - let update = {}; - let condition; - - const title = req.body.title; - condition = title ? title : undefined; - update.title = condition; - - const images = req.body.images; - condition = images ? images : undefined; - update.images = condition; - - const url = req.body.url; - condition = url ? url : undefined; - update.url = condition; - - let interests = req.body.interests; - condition = interests ? {interests: [...new Map(interests.map(v => [v.id, v])).values()]} : undefined; - update.$addToSet = condition; - - const comment = req.body.comment; - condition = comment ? comment : undefined; - update.comment = condition; - - const isVisible = req.body.isVisible; - if(typeof isVisible !== 'undefined'){ - condition = isVisible; - } else{ - condition = undefined; - } - update.isVisible = condition; - - const isActive = req.body.isActive; - if(typeof isActive !== 'undefined'){ - condition = isActive; - } else{ - condition = undefined; - } - update.isActive = condition; - - // Remove undefined key - Object.keys(update).forEach(key => update[key] === undefined ? delete update[key] : {}); - - if(id && ObjectId.isValid(id)){ - Ad.updateOne({_id: id, userId: token.id}, update) - .then(data => { - if(data) { - //Object.keys(update).forEach(key => data[key] = update[key]); - return sendMessage(res, 44, update, token); - } else { - return sendError(res, 404, -1, `Ad not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, -1, err.message || `Some error occurred while updating the Ad with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Delete an Ad with ad id -exports.delete = (req, res) => { - const token = checkLogin(req, res, roles.Advertiser); - if(token && typeof req.params.id !== 'undefined') { - let match = null; - const id = req.params.id; - if(id && ObjectId.isValid(id)){ - if(typeof token.role !== 'undefined' && - typeof token.role.permission !== 'undefined' && - typeof token.role.isAccepted !== 'undefined' && - token.role.isAccepted === true && - token.role.permission >= roles.Admin.permission) { - match = {_id: id, isActive: true}; - } else { - match = {_id: id, userId: token.id, isActive: true}; - } - Ad.findOneAndUpdate(match, {isActive: false}, {useFindAndModify: false, new: true}) - .then(data => { - if(data) { - if(data.isActive !== true){ - return sendMessage(res, 45, {message: `Ad ${id} was successfully deleted.`}, token); - } else { - return sendError(res, 404, 105, `Ad ${id} was not deleted.`, token); - } - } else { - return sendError(res, 404, 105, `Ad not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, 100, err.message || `Some error occurred while deleting the Ad with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Delete all Ad from session id -exports.deleteAll = (req, res) => { - const token = checkLogin(req, res, roles.Advertiser); - if(token) { - Ad.updateMany({userId: {$eq: token.id}, isActive: true}, {isActive: false}) - .then(data => { - return sendMessage(res, 46, { - message: `${data.modifiedCount} Ads were deleted successfully.` - }); - }) - .catch(err => { - return sendError(res, 500, -1, err.message || "Some error occurred while removing all Ads."); - }); - } -}; diff --git a/app-backend/controllers/misc.controller.js b/app-backend/controllers/misc.controller.js deleted file mode 100644 index 326e138..0000000 --- a/app-backend/controllers/misc.controller.js +++ /dev/null @@ -1,7 +0,0 @@ -const {sendMessage} = require ("../config/response.config"); -const interests = require("../models/objects/video.categories.model"); - -// Get all interests available -exports.getInterests = (req, res) => { - return sendMessage(res, 51, interests, null) -}; diff --git a/app-backend/controllers/playlist.controller.js b/app-backend/controllers/playlist.controller.js deleted file mode 100644 index 51442a1..0000000 --- a/app-backend/controllers/playlist.controller.js +++ /dev/null @@ -1,407 +0,0 @@ -const db = require("../models/mongodb.model"); -const {sendError, sendMessage} = require ("../config/response.config"); -const {checkLogin} = require("../config/sessionJWT.config"); -const {youtube, dailymotion} = require("../config/host.config"); -const {asyncRequest, asyncInterest} = require("../config/functions.config"); -const ObjectId = require('mongoose').Types.ObjectId; -const Playlist = db.playlists; -const Video = db.videos; - -// Create a new Playlist -exports.create = (req, res) => { - const token = checkLogin(req, res); - if(token && req.body.name){ - const video = req.body.video; - if(typeof video !== 'undefined' && - video !== null && - typeof video.videoId !== 'undefined' && - video.videoId !== null && - typeof video.source !== 'undefined' && - video.source !== null && - typeof video.interest !== 'undefined' && - video.interest !== null - ){ - Video.exists({userId: token.id, videoId: video.videoId, source: video.source, isActive: true}, function (err, docs){ - if(err){ - sendError(res, 500,100,err.message || "Some error occurred while checking if the Video already exists.", token); - } else{ - if(docs === null) { - let video; - - video = new Video({ - userId: token.id, - videoId: id, - source: req.body.source, - interest: req.body.interest, - watchedDates: [new Date()] - }); - - // Save Video in the database - video - .save(video) - .then(data => { - if(data) { - Playlist.exists({name: req.body.name, isActive: true}, function (err, docs){ - if(err){ - sendError(res, 500,100,err.message || "Some error occurred while checking if the Playlist already exists.", token); - } else{ - if(docs === null) { - let playlist; - - playlist = new Playlist({ - userId: token.id, - name: req.body.name, - videoIds: data._id ? [data._id] : undefined, - isActive: true - }); - - // Save User in the database - playlist - .save(playlist) - .then(data => { - return sendMessage(res, 21, data, token) - }) - .catch(err => { - return sendError(res, 500,100,err.message || "Some error occurred while creating the Playlist.", token); - }); - } else{ - return sendError(res, 500, 104, err || `Playlist ${req.body.name} already exists.`, token); - } - } - }); - } - }) - .catch(err => { - return sendError(res, 500,100,err.message || "Some error occurred while creating the Video.", token); - }); - } else{ - const id = docs._id.toString(); - Playlist.exists({name: req.body.name, isActive: true}, function (err, docs){ - if(err){ - sendError(res, 500,100,err.message || "Some error occurred while checking if the Playlist already exists.", token); - } else{ - if(docs === null) { - let playlist; - - playlist = new Playlist({ - userId: token.id, - name: req.body.name, - videoIds: [id], - isActive: true - }); - - // Save User in the database - playlist - .save(playlist) - .then(data => { - return sendMessage(res, 21, data, token) - }) - .catch(err => { - return sendError(res, 500,100,err.message || "Some error occurred while creating the Playlist.", token); - }); - } else{ - return sendError(res, 500, 104, err || `Playlist ${req.body.name} already exists.`, token); - } - } - }); - } - } - }); - } else { - Playlist.exists({name: req.body.name, isActive: true}, function (err, docs){ - if(err){ - sendError(res, 500,100,err.message || "Some error occurred while checking if the Playlist already exists.", token); - } else{ - if(docs === null) { - let playlist; - - playlist = new Playlist({ - userId: token.id, - name: req.body.name, - videoIds: req.body.videoIds ? req.body.videoIds : undefined, - isActive: req.body.isActive ? req.body.isActive : undefined - }); - - // Save User in the database - playlist - .save(playlist) - .then(data => { - return sendMessage(res, 21, data, token) - }) - .catch(err => { - return sendError(res, 500,100,err.message || "Some error occurred while creating the Playlist.", token); - }); - } else{ - return sendError(res, 500, 104, err || `Playlist ${req.body.name} already exists.`, token); - } - } - }); - } - } -}; - -// Retrieve all Playlist from id if admin or session id -exports.findAll = (req, res) => { - const token = checkLogin(req, res); - if(token){ - let query = {}; - let condition; - - const playlistId = req.query.playlistId; - condition = playlistId ? playlistId : undefined; - query._id = condition; - - const userId = token.id; - condition = userId ? userId : undefined; - query.userId = condition; - - const videoIds = req.query.videoIds; - condition = videoIds ? {$in: videoIds} : undefined; - query.videoIds = condition; - - const name = req.query.name; - condition = name ? { $regex: new RegExp(name), $options: "i" } : undefined; - query.name = condition; - - const isActive = req.query.isActive; - condition = isActive ? isActive : undefined; - query.isActive = condition; - - const sort = req.query.sort; - if(sort !== 'undefined'){ - switch (sort){ - case 'asc': - condition = {name: 1}; - break; - case 'desc': - condition = {name: -1}; - break; - case 'createdAtAsc': - condition = {createdAt: 1}; - break; - case 'createdAtDesc': - condition = {createdAt: -1}; - break; - case 'updatedAtAsc': - condition = {updatedAt: 1}; - break; - case 'updatedAtDesc': - condition = {updatedAt: -1}; - break; - default: - condition = {name: 1}; - } - } - const query_sort = {sort: condition}; - - // Remove undefined key - Object.keys(query).forEach(key => query[key] === undefined ? delete query[key] : {}); - console.log(query); - - Playlist.find(query, {}, query_sort) - .then(data => { - return sendMessage(res, 22, data, token); - }) - .catch(err => { - return sendError(res,500,100,err.message || "Some error occurred while finding the Playlists.", token); - }); - } -}; - -// Find single Playlist from session id -exports.findOne = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(id && ObjectId.isValid(id)){ - Playlist.aggregate([ - {$match: {_id: new ObjectId(id), userId: token.id, isActive: true}}, - {$unwind: '$videoIds'}, - {$project: { - userId: true, - name: true, - isActive: true, - createdAt: true, - updatedAt: true, - videoIds: {$toObjectId: '$videoIds'} - }}, - {$lookup: { - from: 'videos', - localField: 'videoIds', - foreignField: '_id', - as: 'videos' - }}, - {$unwind: '$videos'}, - {$group: { - _id: '$_id', - userId: {$first: "$userId"}, - name: {$first: "$name"}, - isActive: {$first: "$isActive"}, - createdAt: {$first: "$createdAt"}, - updatedAt: {$first: "$updatedAt"}, - videos: {$push: "$videos"} - }} - ]) - .then(async data => { - let yt_results = []; - let dm_results = []; - let yt_videoIds = ""; - let dm_videoIds = ""; - - for (const i in data[0].videos) { - if (data[0].videos[i].source === youtube.name) { - yt_videoIds = yt_videoIds + data[0].videos[i].videoId + ","; - } else if (data[0].videos[i].source === dailymotion.name) { - dm_videoIds = dm_videoIds + data[0].videos[i].videoId + ","; - } - } - if (yt_videoIds !== "") { - const uri = youtube.baseAPIUrl + '/videos' + '?part=snippet&part=statistics&id=' + yt_videoIds.slice(0, -1) + '&key=' + youtube.YOUTUBE_API_KEY; - const dataVideos = await asyncRequest(uri, {}); - if (dataVideos.response.statusCode === 200 && dataVideos.body.items.length > 0) { - yt_results = dataVideos.body.items; - } - } - - if (dm_videoIds !== "") { - const uri = dailymotion.baseAPIUrl + '/videos?ids=' + dm_videoIds.slice(0, -1) + '&fields=thumbnail_480_url%2Ctitle%2Cid'; - const data = await asyncRequest(uri, {}); - const response = data.response; - const jsonBody = data.body; - if (response.statusCode === 200) { - dm_results = jsonBody.list; - } - } - for (const i in data[0].videos) { - if (data[0].videos[i].source === youtube.name) { - const obj = yt_results.filter(obj => obj.id === data[0].videos[i].videoId); - data[0].videos[i].imageUrl = obj[0].snippet.thumbnails.medium.url ? obj[0].snippet.thumbnails.medium.url : null; - data[0].videos[i].interest = obj[0].snippet.categoryId ? await asyncInterest(obj[0].snippet.categoryId, youtube.name): null; - data[0].videos[i].title = obj[0].snippet.title ? obj[0].snippet.title : null; - data[0].videos[i].views = obj[0].statistics.viewCount ? parseInt(obj[0].statistics.viewCount) : null; - data[0].videos[i].publishedAt = obj[0].snippet.publishedAt ? obj[0].snippet.publishedAt : null; - } else if (data[0].videos[i].source === dailymotion.name) { - const obj = dm_results.filter(obj => obj.id === data[0].videos[i].videoId); - data[0].videos[i].imageUrl = obj[0].thumbnail_480_url ? obj[0].thumbnail_480_url : null; - data[0].videos[i].interest = obj[0]['channel.name'] ? await asyncInterest( obj[0]['channel.name'], dailymotion.name) : null; - data[0].videos[i].title = obj[0].title ? obj[0].title : null; - data[0].videos[i].views = obj[0].views_total ? parseInt(obj[0].views_total) : null; - data[0].videos[i].publishedAt = obj[0].created_time ? new Date(obj[0].created_time * 1000) : null - } - } - return sendMessage(res, 12, data[0], token) - }) - .catch(err => { - return sendError(res,500,100,err.message || `Some error occurred while finding the Playlist with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Update a Playlist with playlist id -exports.update = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(typeof req.body._id !== 'undefined' || typeof req.body.id !== 'undefined'){ - return sendError(res, 500, -1, `User do not have the permission to modify id or _id`, token); - } else{ - const ids = id.split(','); - let update = {}; - let condition; - - const name = req.body.name; - condition = name ? name : undefined; - update.name = condition; - - const videoIds = req.body.videoIds; - condition = videoIds ? videoIds : undefined; - update.videoIds = condition; - - const videoId = req.body.videoId; - if(typeof videoId !== 'undefined' && typeof videoId.id !== 'undefined' && typeof videoId.action !== 'undefined'){ - if(videoId.action === 'add'){ - condition = videoId.id ? {videoIds: videoId.id} : undefined; - update.$addToSet = condition; - } else if(videoId.action === 'delete'){ - condition = videoId.id ? {videoIds: videoId.id} : undefined; - update.$pull = condition; - } - } - - const isActive = req.body.isActive; - if(typeof isActive !== 'undefined'){ - condition = isActive; - } else{ - condition = undefined; - } - update.isActive = condition; - - // Remove undefined key - Object.keys(update).forEach(key => update[key] === undefined ? delete update[key] : {}); - - Playlist.updateMany({_id: {$in: ids}, userId: token.id, isActive: true}, update, {new: false}) - .then(data => { - if(data) { - if(data.modifiedCount > 0){ - return sendMessage(res, 24, update, token); - } else { - return sendError(res, 500, -1, `Video in Playlist ${data} already exists.`, token); - } - } else { - return sendError(res, 404, -1, `Playlist not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, -1, err.message || `Some error occurred while updating the Playlist with id=${id}`, token); - }); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Delete a Playlist with playlist id -exports.delete = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(id && ObjectId.isValid(id)){ - Playlist.findByIdAndUpdate(id, {isActive: false}, {useFindAndModify: false}) - .then(data => { - if(data) { - return sendMessage(res, 25, {message: `Playlist ${id} was successfully deleted.`}, token); - } else { - return sendError(res, 404, 105, `Playlist not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, 100, err.message || `Some error occurred while deleting the Playlist with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Delete all Playlists from session id -exports.deleteAll = (req, res) => { - const token = checkLogin(req, res); - if(token) { - Playlist.updateMany({userId: {$eq: token.id}, isActive: true}, {isActive: false}) - .then(data => { - return sendMessage(res, 26, { - message: `${data.modifiedCount} Playlists were deleted successfully.` - }); - }) - .catch(err => { - return sendError(res, 500, -1, err.message || "Some error occurred while removing all Playlists."); - }); - } -}; diff --git a/app-backend/controllers/user.controller.js b/app-backend/controllers/user.controller.js deleted file mode 100644 index 098db1b..0000000 --- a/app-backend/controllers/user.controller.js +++ /dev/null @@ -1,546 +0,0 @@ -const db = require("../models/mongodb.model"); -const {sendError, sendMessage} = require ("../config/response.config"); -const {checkLogin, setSessionCookie} = require("../config/sessionJWT.config"); -const ObjectId = require('mongoose').Types.ObjectId; -const roles = require("../models/objects/role.model"); -const {youtube, dailymotion} = require("../config/host.config"); -const {asyncRequest} = require("../config/functions.config"); -const User = db.users; -const Video = db.videos; -const Ad = db.ads; - -// Authenticate a User -exports.auth = (req, res) => { - // Validate request - if (!req.body.email || !req.body.hashPass) { - sendError(res, 400,-1,"Content can not be empty . (email and hashPass needed)"); - } else{ - // Check User in the database - User - .findOne({email: req.body.email, hashPass: req.body.hashPass, isActive: true, "role.isAccepted": true}, {role: true, profileImageUrl: true}) - .then(data => { - if (data !== null){ - User.findByIdAndUpdate(data._id.toString(), {lastConnexion: new Date()}, {useFindAndModify: false}, - function (err) { - if (err){ - return sendError(res, 400, 100,err.message || "Some error occurred while updating the User."); - } - else{ - const dataRes = {id: data._id.toString(), email: req.body.email, profileImageUrl: data.profileImageUrl, role: data.role}; - setSessionCookie(req, res, dataRes); - return sendMessage(res, 1, dataRes); - } - }); - } else { - setSessionCookie(req, res, {id: -1, email: -1, profileImageUrl: -1, role: -1}); - return sendError(res, 500, 101, "Invalid login or password."); - } - }) - .catch(err => { - return sendError(res, 400, 100,err.message || "Some error occurred while authenticating the User."); - }); - } -}; - -// Logout a User -exports.logout = (req, res) => { - const token = checkLogin(req, res); - if(token){ - setSessionCookie(req, res, {id: -1, email: -1, profileImageUrl: -1, role: -1}); - return sendMessage(res, 2, {message: "User disconnected"}); - } -}; - -// Request password reset with email -exports.resetPass = (req, res) => { - return sendError(res, 501, -1, "User.resetPass not Implemented", null); -}; - -// Create and Save a new User -exports.create = (req, res) => { - // Validate request - if (!req.body.email || !req.body.hashPass || !req.body.login) { - sendError(res, 400,-1,"Content can not be empty . (email, hashPass and login needed"); - } - else{ - User.exists({email: req.body.email}, function (err, docs){ - if(err){ - sendError(res, 500,100,err.message || "Some error occurred while checking if the User already exists."); - } else{ - if(docs === null) { - let user; - let var_role; - if(typeof req.body.role !== 'undefined'){ - switch(req.body.role){ - case 'admin': - var_role = roles.Admin; - break; - case 'advertiser': - var_role = roles.Advertiser; - break; - default: - var_role = roles.User; - } - } else{ - var_role = roles.User; - } - - user = new User({ - email: req.body.email, - hashPass: req.body.hashPass, - login: req.body.login, - role: var_role, - company: req.body.company ? req.body.company : null, - dateOfBirth: req.body.dateOfBirth ? req.body.dateOfBirth : null, - gender: req.body.gender ? req.body.gender : null, - interests: req.body.interests ? req.body.interests : null, - }); - - // Save User in the database - user - .save(user) - .then(data => { - data.hashPass = undefined; // Hiding hashPass on return - return sendMessage(res, 4, data) - }) - .catch(err => { - return sendError(res, 500,100,err.message || "Some error occurred while creating the User."); - }); - } else{ - return sendError(res, 500, 104, err || `Email ${req.body.email} already exists.`); - } - } - }); - } -}; - -// Retrieve all Users from the database if at least admin. -exports.findAll = (req, res) => { - const token = checkLogin(req, res, roles.Admin); - if(token){ - let query = {}; - let condition; - - const ids = req.query.userId; - condition = ids ? {$in: ids} : undefined; - query._id = condition; - - const email = req.query.email; - condition = email ? { $regex: new RegExp(email), $options: "i" } : undefined; - query.email = condition; - - const login = req.query.login; - condition = login ? { $regex: new RegExp(login), $options: "i" } : undefined; - query.login = condition; - - const role = req.query.role; - condition = role ? role : undefined; - query["role.name"] = condition; - - const company = req.query.company; - condition = company ? { $regex: new RegExp(company), $options: "i" } : undefined; - query.company = condition; - - const dateOfBirth = req.query.dateOfBirth; - condition = dateOfBirth ? new Date(dateOfBirth) : undefined; - query.dateOfBirth = condition; - - const gender = req.query.gender; - condition = gender ? gender : undefined; - query.gender = condition; - - const isActive = req.query.isActive; - condition = isActive ? isActive : undefined; - query.isActive = condition; - - const isAccepted = req.query.isAccepted; - if(isAccepted !== 'undefined'){ - switch (isAccepted){ - case 'true': - condition = true; - break; - case 'false': - condition = false; - break; - } - } - query["role.isAccepted"] = condition; - - const sort = req.query.sort; - if(sort !== 'undefined'){ - switch (sort){ - case 'asc': - condition = {email: 1}; - break; - case 'desc': - condition = {email: -1}; - break; - case 'lastConnexionAsc': - condition = {lastConnexion: 1}; - break; - case 'lastConnexionDesc': - condition = {lastConnexion: -1}; - break; - case 'createdAtAsc': - condition = {createdAt: 1}; - break; - case 'createdAtDesc': - condition = {createdAt: -1}; - break; - case 'updatedAtAsc': - condition = {updatedAt: 1}; - break; - case 'updatedAtDesc': - condition = {updatedAt: -1}; - break; - default: - condition = {email: 1}; - } - } - const query_sort = {sort: condition}; - - // Remove undefined key - Object.keys(query).forEach(key => query[key] === undefined ? delete query[key] : {}); - console.log(query); - - User.find(query, {hashPass: false}, query_sort) - .then(data => { - return sendMessage(res, 5, data, token); - }) - .catch(err => { - return sendError(res,500,100,err.message || "Some error occurred while retrieving users.", token); - }); - } -}; - -// Find a single User by session id -exports.findOne = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - let id = null; - if(typeof token.id !== 'undefined' && token.id === req.params.id){ - id = req.params.id; - } else { - if(typeof token.role !== 'undefined' && - typeof token.role.permission !== 'undefined' && - typeof token.role.isAccepted !== 'undefined' && - token.role.isAccepted === true && - token.role.permission >= roles.Admin.permission) { - id = req.params.id; - } else { - return sendError(res, 500, 106, `User do not have the permission.`, token); - } - } - if(id && ObjectId.isValid(id)){ - User.findById(id, {hashPass: false}) - .then(data => { - if(data){ - return sendMessage(res, 6, data, token); - } else { - return sendError(res,404,105,`User not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res,500,100,err.message || `Some error occurred while finding the User with id=${id}`, token); - }); - } else { - sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Update a User by the id in the request -exports.update = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - let id = null; - if(typeof token.id !== 'undefined' && token.id === req.params.id){ - id = req.params.id; - } else { - if(typeof token.role !== 'undefined' && - typeof token.role.permission !== 'undefined' && - typeof token.role.isAccepted !== 'undefined' && - token.role.isAccepted === true && - token.role.permission >= roles.Admin.permission) { - id = req.params.id; - } else { - return sendError(res, 500, 106, `User do not have the permission.`, token); - } - } - if(id && ObjectId.isValid(id)){ - let update = null; - if(typeof req.body._id !== 'undefined' || typeof req.body.id !== 'undefined'){ - return sendError(res, 500, -1, `User do not have the permission to modify id or _id`, token); - } else{ - if(typeof req.body.role !== 'undefined' || - typeof req.body.isActive !== 'undefined' || - typeof req.body.lastConnexion !== 'undefined' || - typeof req.body.createdAt !== 'undefined'|| - typeof req.body.updatedAt !== 'undefined'){ - if(typeof token.role !== 'undefined' && - typeof token.role.permission !== 'undefined' && - typeof token.role.isAccepted !== 'undefined' && - token.role.isAccepted === true && - token.role.permission >= roles.Admin.permission) { - update = true; - } else{ - return sendError(res, 500, 106, `User do not have the permission to modify these keys.`, token); - } - } else{ - update = true; - } - } - if(update === true){ - User.findByIdAndUpdate(id, req.body, {useFindAndModify: false}) - .then(data => { - if(data) { - data.hashPass = undefined; - Object.keys(req.body).forEach(key => data[key] = req.body[key]); - sendMessage(res, 7, data, token); - } else { - sendError(res, 404, -1, `User not found with id=${id}`, token); - } - }) - .catch(err => { - sendError(res, 500, -1, err.message || `Some error occurred while updating the User with id=${id}`, token); - }); - } - } else { - sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - - - -// Delete a User with the specified id in the request -exports.delete = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - let id = null; - if(typeof token.id !== 'undefined' && token.id === req.params.id){ - id = req.params.id; - } else { - if(typeof token.role !== 'undefined' && - typeof token.role.permission !== 'undefined' && - typeof token.role.isAccepted !== 'undefined' && - token.role.isAccepted === true && - token.role.permission >= roles.Admin.permission) { - id = req.params.id; - } else { - return sendError(res, 500, 106, `User do not have the permission.`, token); - } - } - if(id && ObjectId.isValid(id)){ - User.findByIdAndUpdate(id, {isActive: false}, {useFindAndModify: false}) - .then(data => { - if(data) { - return sendMessage(res, 8, {message: `User ${id} was successfully deleted.`}, token); - } else { - return sendError(res, 404, 105, `User not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, 100, err.message || `Some error occurred while deleting the User with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Delete all Users from the database except superAdmin -exports.deleteAll = (req, res) => { - const token = checkLogin(req, res, roles.SuperAdmin); - if(token) { - User.deleteMany({login: {$ne: "superAdmin"}}) - .then(data => { - return sendMessage(res, 9, { - message: `${data.deletedCount} Users were deleted successfully.` - }); - }) - .catch(err => { - return sendError(res, 500, 100, err.message || "Some error occurred while removing all Users."); - }); - } -}; - -// Get all Roles depending on the role of the User -exports.roles = (req, res) => { - const token = checkLogin(req, res); - if(token){ - return sendMessage(res, 10, roles, token); - } -}; - -// Get 1 or multiple ad adapted to the User session id -exports.ad = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.query.quantity !== 'undefined'){ - const id = token.id; - const quantity = req.query.quantity; - // Interests from the user and from last 20 videos viewed if no ad matches -> find x ad from these interests + add date view to the ad - let interests = []; - const maxInterests = 20; - let limit = maxInterests; - User.findById(id, {_id: false, interests: true}) - .then(data => { - if(typeof data.interests !== 'undefined' && data.interests !== null){ - interests = interests.concat(data.interests); - limit = maxInterests-data.interests.length; - } - Video.aggregate([ - {$match: {userId: id}}, - {$project: {_id: false, interest: true}}, - {$sort: {watchedDates: -1}}, - {$limit: limit}, - {$unwind: '$interest'}, - {$group: {_id: null, interests: {$push: '$interest'}}} - ]) - .then(data => { - if(typeof data[0] !== 'undefined' && - typeof data[0].interests !== 'undefined' && - data[0].interests !== [] && - data[0].interests !== null){ - interests = interests.concat(data[0].interests); - } - let match, pick; - if(interests.length > 0){ - match = {$match: {isVisible: true, isActive: true, interests: {$elemMatch: {interest: {$in: interests}}}}}; - pick = {$limit: parseInt(quantity, 10)} - } else { - match = {$match: {isVisible: true, isActive: true}}; - pick = {$sample: {size: parseInt(quantity, 10)}}; - } - - Ad.aggregate([ - match, - pick - ]) - .then(data => { - if(data.length > 0){ - let ids = [] - for(const i in data){ids.push(data[i]._id);} - Ad.updateMany({_id: {$in: ids}}, {$push: {views: [new Date()]}}) - .then(dataUpdate => { - if(dataUpdate && dataUpdate.modifiedCount > 0){ - return sendMessage(res, 11, data, token); - } else { - return sendError(res,500,101,`Some error occurred while updating ${quantity} ad(s) for the User.`, token); - } - }) - .catch(err => { - return sendError(res,500,101,err.message || `Some error occurred while updating ${quantity} ad(s) for the User.`, token); - }); - } else { - Ad.aggregate([{$match: {isVisible: true, isActive: true}}, {$sample: {size: parseInt(quantity, 10)}}]) - .then(data => { - let ids = [] - for(const i in data){ids.push(data[i]._id);} - Ad.updateMany({_id: {$in: ids}}, {$push: {views: [new Date()]}}) - .then(dataUpdate => { - if(dataUpdate && dataUpdate.modifiedCount > 0){ - return sendMessage(res, 11, data, token); - } else { - return sendError(res,500,101,`Some error occurred while updating ${quantity} ad(s) for the User.`, token); - } - }) - .catch(err => { - return sendError(res,500,101,err.message || `Some error occurred while updating ${quantity} ad(s) for the User.`, token); - }); - }) - .catch(err => { - return sendError(res,500,101,err.message || `Some error occurred while getting ${quantity} ad(s) for the User.`, token); - }); - } - }) - .catch(err => { - return sendError(res,500,101,err.message || `Some error occurred while getting ${quantity} ad(s) for the User.`, token); - }); - }) - .catch(err => { - return sendError(res,500,102,err.message || `Some error occurred while getting ${quantity} ad(s) for the User.`, token); - }); - }) - .catch(err => { - return sendError(res,500,100,err.message || `Some error occurred while getting ${quantity} ad(s) for the User.`, token); - }); - } else { - sendError(res, 500, -1, `No quantity given`, token); - } -}; - -// Get History -exports.history = (req, res) => { - const token = checkLogin(req, res); - if(token){ - const id = token.id; - - Video.aggregate([ - {$match: {userId: id, $expr: {$gt: [{$size: "$watchedDates"}, 0]}}}, - {$limit: 300}, - {$project: { - videoId: true, - source: true, - tags: true, - interest: true, - views: {$size: '$watchedDates'}, - watchedDate: {$arrayElemAt: ["$watchedDates", -1]}, - createdAt: true, - updatedAt: true - }}, - {$sort: {watchedDate: -1}}]) - .then(async data => { - let yt_results = []; - let dm_results = []; - let yt_videoIds = ""; - let dm_videoIds = ""; - - for(const i in data) { - if(data[i].source === youtube.name) { - yt_videoIds = yt_videoIds + data[i].videoId + ","; - } else if (data[i].source === dailymotion.name) { - dm_videoIds = dm_videoIds + data[i].videoId + ","; - } - } - if(yt_videoIds !== ""){ - const uri = youtube.baseAPIUrl + '/videos' + '?part=snippet&part=statistics&id=' + yt_videoIds.slice(0, -1) + '&key=' + youtube.YOUTUBE_API_KEY; - const dataVideos = await asyncRequest(uri, {}); - if (dataVideos.response.statusCode === 200 && dataVideos.body.items.length > 0) { - yt_results = dataVideos.body.items; - } - } - - if(dm_videoIds !== ""){ - const uri = dailymotion.baseAPIUrl + '/videos?ids='+dm_videoIds.slice(0, -1)+'&fields=thumbnail_480_url%2Ctitle%2Cid'; - const data = await asyncRequest(uri, {}); - const response = data.response; - const jsonBody = data.body; - if(response.statusCode === 200){ - dm_results = jsonBody.list; - } - } - for(const i in data) { - if(data[i].source === youtube.name) { - const obj = yt_results.filter(obj => obj.id === data[i].videoId); - data[i].imageUrl = obj[0].snippet.thumbnails.medium.url ? obj[0].snippet.thumbnails.medium.url : null; - data[i].title = obj[0].snippet.title ? obj[0].snippet.title : null; - } else if (data[i].source === dailymotion.name) { - const obj = dm_results.filter(obj => obj.id === data[i].videoId); - data[i].imageUrl = obj[0].thumbnail_480_url ? obj[0].thumbnail_480_url : null; - data[i].title = obj[0].title ? obj[0].title : null; - } - } - return sendMessage(res, 12, data, token) - }) - .catch(err => { - return sendError(res,500,100,err.message || "Some error occurred while getting the User history.", token); - }); - } -}; diff --git a/app-backend/controllers/video.controller.js b/app-backend/controllers/video.controller.js deleted file mode 100644 index f928918..0000000 --- a/app-backend/controllers/video.controller.js +++ /dev/null @@ -1,473 +0,0 @@ -const db = require("../models/mongodb.model"); -const request = require('request'); -const {sendError, sendMessage} = require ("../config/response.config"); -const {checkLogin} = require("../config/sessionJWT.config"); -const {youtube, dailymotion} = require("../config/host.config"); -const {asyncRequest, asyncInterest} = require("../config/functions.config"); -const ObjectId = require('mongoose').Types.ObjectId; -const Video = db.videos; - - -// Search Videos -exports.search = async (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.query.q !== 'undefined'){ - const query = req.query.q; - const maxResults = req.query.maxResults ? req.query.maxResults : 45; - const pageToken = req.query.pageToken ? req.query.pageToken : undefined; - let sources; - if(typeof req.query.sources !== 'undefined' && req.query.sources !== ''){ - sources = req.query.sources.split(','); - } else { - sources = ["yt", "dm"]; - } - let yt_results = []; - let dm_results = []; - for(const i in sources){ - if(sources[i] === youtube.shortname){ - if(youtube.YOUTUBE_API_KEY !== 'undefined' && youtube.YOUTUBE_API_KEY !== ''){ - let uri; - if(query !== ''){ - if(typeof pageToken !== 'undefined'){ - uri = youtube.baseAPIUrl+'/search'+'?part=snippet&maxResults='+maxResults+'&q='+query+'&pageToken='+pageToken+'&key='+youtube.YOUTUBE_API_KEY; - } else{ - uri = youtube.baseAPIUrl+'/search'+'?part=snippet&maxResults='+maxResults+'&q='+query+'&key='+youtube.YOUTUBE_API_KEY; - } - const dataIds = await asyncRequest(uri, {}); - if(dataIds.response.statusCode === 200 && dataIds.body.items.length > 0){ - let yt_videoIds = ""; - dataIds.body.items.forEach(item => yt_videoIds = yt_videoIds+item.id.videoId+","); - uri = youtube.baseAPIUrl+'/videos'+'?part=snippet&part=statistics&id='+yt_videoIds.slice(0, -1)+'&key='+youtube.YOUTUBE_API_KEY; - const dataVideos = await asyncRequest(uri, {}); - if(dataVideos.response.statusCode === 200 && dataVideos.body.items.length > 0){ - yt_results = dataVideos.body.items; - } - } - } else { - uri = youtube.baseAPIUrl+'/videos'+'?part=snippet&part=statistics&chart=mostPopular&maxResults='+maxResults+'&key='+youtube.YOUTUBE_API_KEY; - const dataVideos = await asyncRequest(uri, {}); - if(dataVideos.response.statusCode === 200 && dataVideos.body.items.length > 0){ - yt_results = dataVideos.body.items; - } - } - } else{ - return sendError(res, 500, -1, `Error Env Variable DAILYMOTION_API_KEY missing, please contact the admin.`, token); - } - } else if(sources[i] === dailymotion.shortname){ - if(dailymotion.DAILYMOTION_API_KEY !== 'undefined' && dailymotion.DAILYMOTION_API_KEY !== '') { - let uri; - if(query !== ''){ - uri = dailymotion.baseAPIUrl + '/videos?limit='+maxResults+'&search='+query+'&fields=created_time%2Cdescription%2Cthumbnail_480_url%2Clikes_total%2Ctitle%2Cid%2Cembed_url%2Cviews_total%2Cowner.username%2Cowner.id%2Cchannel.name'; - } else { - uri = dailymotion.baseAPIUrl + '/videos?limit='+maxResults+'&sort=trending&fields=created_time%2Cdescription%2Cthumbnail_480_url%2Clikes_total%2Ctitle%2Cid%2Cembed_url%2Cviews_total%2Cowner.username%2Cowner.id%2Cchannel.name'; - } - const data = await asyncRequest(uri, {}); - const response = data.response; - const jsonBody = data.body; - if(response.statusCode === 200){ - dm_results = jsonBody.list; - } - } else{ - return sendError(res, 500, -1, `Error Env Variable DAILYMOTION_API_KEY missing, please contact the admin.`, token); - } - } - } - - let results = []; - for(let i = 0; i < Math.max(dm_results.length, yt_results.length); i++){ - - // Youtube - if(yt_results.length > i){ - const yt_data = { - videoId: yt_results[i].id, - source: youtube.name, - imageUrl: yt_results[i].snippet.thumbnails.medium.url ? yt_results[i].snippet.thumbnails.medium.url : null, - title: yt_results[i].snippet.title ? yt_results[i].snippet.title : null, - channelTitle: yt_results[i].snippet.channelTitle ? yt_results[i].snippet.channelTitle : null, - channelUrl: youtube.baseChannelUrl+yt_results[i].snippet.channelId ? yt_results[i].snippet.channelId : null, - description: yt_results[i].snippet.description ? yt_results[i].snippet.description : null, - embedUrl: 'https://www.youtube.com/embed/'+yt_results[i].id, - interest: await asyncInterest(yt_results[i].snippet.categoryId, youtube.name), - views: yt_results[i].statistics.viewCount ? parseInt(yt_results[i].statistics.viewCount) : null, - likes: yt_results[i].statistics.likeCount ? parseInt(yt_results[i].statistics.likeCount) : null, - dislikes: yt_results[i].statistics.dislikeCount ? parseInt(yt_results[i].statistics.dislikeCount) : null, - publishedAt: yt_results[i].snippet.publishedAt ? yt_results[i].snippet.publishedAt : null - }; - results.push(yt_data); - } - - // Dailymotion - if(dm_results.length > i) { - const channelTitle = dm_results[i]['owner.username'] ? dm_results[i]['owner.username'] : null; - const dm_data = { - videoId: dm_results[i].id ? dm_results[i].id : null, - source: dailymotion.name, - imageUrl: dm_results[i].thumbnail_480_url ? dm_results[i].thumbnail_480_url : null, - title: dm_results[i].title ? dm_results[i].title : null, - channelTitle: channelTitle.charAt(0).toUpperCase() + channelTitle.slice(1), - channelUrl: dailymotion.baseChannelUrl + channelTitle, - description: dm_results[i].description ? dm_results[i].description : null, - embedUrl: dm_results[i].embed_url ? dm_results[i].embed_url : null, - interest: await asyncInterest(dm_results[i]['channel.name'], dailymotion.name), - views: dm_results[i].views_total ? parseInt(dm_results[i].views_total) : null, - likes: dm_results[i].likes_total ? parseInt(dm_results[i].likes_total) : null, - dislikes: null, - publishedAt: dm_results[i].created_time ? new Date(dm_results[i].created_time * 1000) : null - }; - results.push(dm_data); - } - } - return sendMessage(res, 31, results, token); - } else{ - return sendError(res, 500, -1, `No q given`, token); - } -}; - -// Get Video with id of source -exports.get = (req, res) => { - if(typeof req.query.source !== 'undefined' && typeof req.params.id !== 'undefined'){ - const source = req.query.source; - const id = req.params.id; - if(source === youtube.shortname){ - if(youtube.YOUTUBE_API_KEY !== 'undefined' && youtube.YOUTUBE_API_KEY !== ''){ - const uri = youtube.baseAPIUrl+'/videos'+'?part=snippet&part=statistics&id='+id+'&key='+youtube.YOUTUBE_API_KEY; - request(uri,{},async function (error, response, body){ - if(typeof body !== 'undefined'){ - const jsonBody = JSON.parse(body); - if(jsonBody.items.length !== 0 && - typeof jsonBody.items[0] !== 'undefined' && - typeof jsonBody.items[0].id !== 'undefined' && - jsonBody.items[0].id === id){ - const imageUrl = jsonBody.items[0].snippet.thumbnails.standard.url ? jsonBody.items[0].snippet.thumbnails.standard.url : null; - const title = jsonBody.items[0].snippet.title ? jsonBody.items[0].snippet.title : null; - const channelId = jsonBody.items[0].snippet.channelId ? jsonBody.items[0].snippet.channelId : null; - const channelTitle = jsonBody.items[0].snippet.channelTitle ? jsonBody.items[0].snippet.channelTitle : null; - const description = jsonBody.items[0].snippet.description ? jsonBody.items[0].snippet.description : null; - //const embedUrl = jsonBody.embed_url ? jsonBody.embed_url : null; - const publishedAt = jsonBody.items[0].snippet.publishedAt ? jsonBody.items[0].snippet.publishedAt : null; - const interest = jsonBody.items[0].snippet.categoryId ? await asyncInterest(jsonBody.items[0].snippet.categoryId, youtube.name): null; - const views = jsonBody.items[0].statistics.viewCount ? parseInt(jsonBody.items[0].statistics.viewCount) : null; - const likes = jsonBody.items[0].statistics.likeCount ? parseInt(jsonBody.items[0].statistics.likeCount) : null; - const dislikes = jsonBody.items[0].statistics.dislikeCount ? parseInt(jsonBody.items[0].statistics.dislikeCount) : null; - const data = { - videoId: id, - source: youtube.name, - imageUrl: imageUrl, - title: title, - channelTitle: channelTitle, - channelUrl: youtube.baseChannelUrl+channelId, - description: description, - embedUrl: 'https://www.youtube.com/embed/'+id, - interest: interest, - views: views, - likes: likes, - dislikes: dislikes, - publishedAt: publishedAt - }; - return sendMessage(res, 32, data); - } else{ - return sendError(res, 404, -1, `No result`); - } - } else{ - return sendError(res, 500, -1, error); - } - }); - } else{ - return sendError(res, 500, -1, `Error Env Variable YOUTUBE_API_KEY missing, please contact the admin.`); - } - } else if(source === dailymotion.shortname){ - if(dailymotion.DAILYMOTION_API_KEY !== 'undefined' && dailymotion.DAILYMOTION_API_KEY !== ''){ - const uri = dailymotion.baseAPIUrl+'/video/'+id+'?fields=created_time%2Cdescription%2Cthumbnail_480_url%2Clikes_total%2Ctitle%2Cid%2Cembed_url%2Cviews_total%2Cowner.username%2Cowner.id%2Cchannel.name'; - request(uri,{},async function (error, response, body) { - if (typeof body !== 'undefined') { - const jsonBody = JSON.parse(body); - if(response.statusCode === 200 && - typeof jsonBody.id !== 'undefined' && - jsonBody.id === id){ - const imageUrl = jsonBody.thumbnail_480_url ? jsonBody.thumbnail_480_url : null; - const title = jsonBody.title ? jsonBody.title : null; - //const channelId = jsonBody['owner.id'] ? jsonBody['owner.id'] : null; - const channelTitle = jsonBody['owner.username'] ? jsonBody['owner.username'] : null; - const description = jsonBody.description ? jsonBody.description : null; - const embedUrl = jsonBody.embed_url ? jsonBody.embed_url : null; - const publishedAt = jsonBody.created_time ? new Date(jsonBody.created_time * 1000) : null; - const interest = jsonBody['channel.name'] ? await asyncInterest(jsonBody['channel.name'], dailymotion.name) : null; - const views = jsonBody.views_total ? parseInt(jsonBody.views_total) : null; - const likes = jsonBody.likes_total ? parseInt(jsonBody.likes_total) : null; - const dislikes = null; - const data = { - videoId: id, - source: dailymotion.name, - imageUrl: imageUrl, - title: title, - channelTitle: channelTitle.charAt(0).toUpperCase() + channelTitle.slice(1), - channelUrl: dailymotion.baseChannelUrl+channelTitle, - description: description, - embedUrl: embedUrl, - interest: interest, - views: views, - likes: likes, - dislikes: dislikes, - publishedAt: publishedAt - }; - return sendMessage(res, 32, data); - } else{ - return sendError(res, 404, -1, jsonBody.error.message); - } - } - }); - } else{ - return sendError(res, 500, -1, `Error Env Variable DAILYMOTION_API_KEY missing, please contact the admin.`); - } - } else{ - return sendError(res, 500, -1, `Wrong source name`); - } - } else{ - return sendError(res, 500, -1, `No source or/and id given`); - } -}; - -// Create a new Video -exports.create = (req, res) => { - const token = checkLogin(req, res); - if(token && - typeof req.body.source !== 'undefined' && - typeof req.body.interest !== 'undefined' && - typeof req.params.id !== 'undefined'){ - const id = req.params.id; - Video.exists({userId: token.id, videoId: id, source: req.body.source, isActive: true}, function (err, docs){ - if(err){ - sendError(res, 500,100,err.message || "Some error occurred while checking if the Video already exists.", token); - } else{ - if(docs === null) { - let video; - - video = new Video({ - userId: token.id, - videoId: id, - source: req.body.source, - interest: req.body.interest, - watchedDates: [new Date()] - }); - - // Save Video in the database - video - .save(video) - .then(data => { - return sendMessage(res, 33, data, token) - }) - .catch(err => { - return sendError(res, 500,100,err.message || "Some error occurred while creating the Video.", token); - }); - } else{ - const id = docs._id.toString(); - Video.findByIdAndUpdate(id, {$push: {watchedDates: [new Date()]}}, {useFindAndModify: false, new: true}) - .then(data => { - if(data) { - return sendMessage(res, 33, data, token); - } else { - return sendError(res, 404, 105, `Video not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, 100, err.message || `Some error occurred while updating the Video with id=${id}`, token); - }); - } - } - }); - } else { - return sendError(res, 500, -1, `No source or interest or id given`, token); - } -}; - -// Retrieve all Videos -exports.findAll = (req, res) => { - const token = checkLogin(req, res); - if(token){ - let query = {}; - let condition; - - const userId = req.query.userId; - condition = userId ? userId : undefined; - query.userId = condition; - - const videoId = req.query.videoId; - condition = videoId ? videoId : undefined; - query.videoId = condition; - - const source = req.query.source; - condition = source ? source : undefined; - query.source = condition; - - const interests = req.query.interests; - condition = interests ? {$in: interests} : undefined; - query["interests.interest"] = condition - - const isActive = req.query.isActive; - condition = isActive ? isActive : undefined; - query.isActive = condition; - - const sort = req.query.sort; - if(sort !== 'undefined'){ - switch (sort){ - case 'asc': - condition = {videoId: 1}; - break; - case 'desc': - condition = {videoId: -1}; - break; - case 'createdAtAsc': - condition = {createdAt: 1}; - break; - case 'createdAtDesc': - condition = {createdAt: -1}; - break; - case 'updatedAtAsc': - condition = {updatedAt: 1}; - break; - case 'updatedAtDesc': - condition = {updatedAt: -1}; - break; - default: - condition = {createdAt: -1}; - } - } - const query_sort = {sort: condition}; - - // Remove undefined key - Object.keys(query).forEach(key => query[key] === undefined ? delete query[key] : {}); - console.log(query); - - Video.find(query, {}, query_sort) - .then(data => { - return sendMessage(res, 34, data, token); - }) - .catch(err => { - return sendError(res,500,100,err.message || "Some error occurred while finding the Videos.", token); - }); - } -}; - -// Find single Video with id -exports.findOne = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(id && ObjectId.isValid(id)){ - Video.findById(id, {}) - .then(data => { - if(data){ - return sendMessage(res, 35, data, token); - } else { - return sendError(res,404,105,`Video not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res,500,100,err.message || `Some error occurred while finding the Video with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Update Video with id -exports.update = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(typeof req.body._id !== 'undefined' || typeof req.body.id !== 'undefined'){ - return sendError(res, 500, -1, `User do not have the permission to modify id or _id`, token); - } else{ - let update = {}; - let condition; - - const watchedDate = req.body.watchedDate; - if(typeof watchedDate !== 'undefined'){ - if(watchedDate){ - condition = {watchedDates: [new Date()]} - } else { - condition = undefined; - } - } else{ - condition = undefined; - } - update.$push = condition; - - const watchedDates = req.body.watchedDates ? req.body.watchedDates : undefined; - update.watchedDates = watchedDates; - - const isActive = req.body.isActive; - if(typeof isActive !== 'undefined'){ - condition = isActive; - } else{ - condition = undefined; - } - update.isActive = condition; - - // Remove undefined key - Object.keys(update).forEach(key => update[key] === undefined ? delete update[key] : {}); - - if(id && ObjectId.isValid(id)){ - Video.updateOne({_id: id, userId: token.id, isActive: true}, update) - .then(data => { - if(data) { - return sendMessage(res, 36, update, token); - } else { - return sendError(res, 404, -1, `Video not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, -1, err.message || `Some error occurred while updating the Video with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Delete Video with id -exports.delete = (req, res) => { - const token = checkLogin(req, res); - if(token && typeof req.params.id !== 'undefined') { - const id = req.params.id; - if(id && ObjectId.isValid(id)){ - Video.updateOne({_id: id, userId: token.id, isActive: true}, {isActive: false}, {useFindAndModify: false}) - .then(data => { - if(data.modifiedCount > 0) { - return sendMessage(res, 37, {message: `Video ${id} was successfully deleted.`}, token); - } else { - return sendError(res, 404, 105, `Video not found with id=${id}`, token); - } - }) - .catch(err => { - return sendError(res, 500, 100, err.message || `Some error occurred while deleting the Video with id=${id}`, token); - }); - } else { - return sendError(res, 500, -1, `Error id is not valid`, token); - } - } else { - return sendError(res, 500, -1, `No id given`, token); - } -}; - -// Delete all Videos -exports.deleteAll = (req, res) => { - const token = checkLogin(req, res); - if(token) { - Video.updateMany({userId: {$eq: token.id}, isActive: true}, {isActive: false}) - .then(data => { - return sendMessage(res, 38, { - message: `${data.modifiedCount} Videos were deleted successfully.`, - }); - }) - .catch(err => { - return sendError(res, 500, 100, err.message || "Some error occurred while removing all Videos."); - }); - } -}; diff --git a/app-backend/jwtRS256.key.pub b/app-backend/jwtRS256.key.pub deleted file mode 100644 index 6b52055..0000000 --- a/app-backend/jwtRS256.key.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtW31Xj62sjbJVBxnn0G2 -Habc22q7/pFIBdfn8+OsajdNVnmtfRNOsSXZP8sNhXt1QLPSgxZ/wogG0fLXIX2+ -ewzPgqrwTnr+quJ1DZ6RqOY3G1PGOibgk25aHkIXJ/gTPk1yTT6pjUmKiaGKM8pt -M2wGwugCdEH5Wndgby8Jej30v/PPzyPxTSXrIWDeaSMX+jQyFZTGgEdgL7JvjkTj -qLtfWKIAcEeO4PzOlRXVvbzBoYphBiZqkbzEeuOjSLPxgy4cQdbqVMlJ/lZt0SBO -MLiIUBTufLcJS3ApesiZWWfUCq+pFFdhEABc9qrtVumzhmzWAv2rKVrHRXbguxc/ -eHKlRjAE4qmnNnTP2fsAuQIPkXVHOPWdXM1IBwnhXVB+XhxEHSANx/2oeKS6fO/e -1oNJCiVkHin9gC8vkU9seEN73lNKZ5wPXMqTYUGA65dCY+8li+n/1pveJOJozFk7 -amkmOAPTi44lBJmxRm88XBHC3TXz6tFqX3phMqFDcQs2D9s3/2UylK0dSH5MSLnb -9x24/ykO4RlPRVCC90vwlxzbnb0rfQVlT4dKcE6OIyXw3UsqIqFnXWmm+hnGu4QH -Ysr+i1VIhPOs9YdZwlqhzcPTuNcdxmxy9ZfZ8KlLIWbAMbSH+obwm4w+HYTZjspe -2MwrKGgzpl4YW7ct/ViqeQMCAwEAAQ== ------END PUBLIC KEY----- diff --git a/app-backend/jwtRS256.sh b/app-backend/jwtRS256.sh deleted file mode 100755 index 64ecaff..0000000 --- a/app-backend/jwtRS256.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -ssh-keygen -t rsa -b 4096 -m PEM -f jwtRS256.key -q -N "" -openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub -#rm .env -echo "JWTRS256_PRIVATE_KEY='`cat ./jwtRS256.key | base64 -w 0`'" >> .env -echo "JWTRS256_PUBLIC_KEY='`cat ./jwtRS256.key.pub | base64 -w 0`'" >> .env -source .env -rm jwtRS256.key diff --git a/app-backend/models/database/ads.model.js b/app-backend/models/database/ads.model.js deleted file mode 100644 index 2389c44..0000000 --- a/app-backend/models/database/ads.model.js +++ /dev/null @@ -1,44 +0,0 @@ -module.exports = mongoose => { - let schema = mongoose.Schema({ - userId: String, - title: String, - images: { - type: Array, - default: [] - }, - url: { - type: String, - default: null - }, - interests: { - type: Array, - default: [] - }, - comment: { - type: String, - default: null - }, - views: { - type: Array, - default: [] - }, - isVisible: { - type: Boolean, - default: true - }, - isActive: { - type: Boolean, - default: true - } - }, - { timestamps: true } - ); - - schema.method("toJSON", function() { - const { __v, _id, ...object } = this.toObject(); - object.id = _id; - return object; - }); - - return mongoose.model("ads", schema); -}; diff --git a/app-backend/models/database/playlists.model.js b/app-backend/models/database/playlists.model.js deleted file mode 100644 index ad065a5..0000000 --- a/app-backend/models/database/playlists.model.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = mongoose => { - let schema = mongoose.Schema({ - userId: String, - videoIds: { - type: Array, - default: [] - }, - name: String, - isActive: { - type: Boolean, - default: true - } - }, - { timestamps: true } - ); - - schema.method("toJSON", function() { - const { __v, _id, ...object } = this.toObject(); - object.id = _id; - return object; - }); - - return mongoose.model("playlists", schema); -}; diff --git a/app-backend/models/database/users.model.js b/app-backend/models/database/users.model.js deleted file mode 100644 index 9467b3c..0000000 --- a/app-backend/models/database/users.model.js +++ /dev/null @@ -1,48 +0,0 @@ -const roles = require("../objects/role.model"); - -module.exports = mongoose => { - let schema = mongoose.Schema({ - email: String, - hashPass: String, // WARNING: We don't want to send back the hashPass - login: String, - role: { - type: Object, - default: roles.User - }, - company: String, - profileImageUrl: { - type: String, - default: "https://www.handiclubnimois.fr/wp-content/uploads/2020/10/blank-profile-picture-973460_1280.png" - }, - dateOfBirth: { - type: Date, - default: null - }, - gender: { - type: String, - default: null - }, - interests: { - type: Array, - default: null - }, - isActive: { - type: Boolean, - default: true - }, - lastConnexion: { - type: Date, - default: null - } - }, - { timestamps: true } - ); - - schema.method("toJSON", function() { - const { __v, _id, ...object } = this.toObject(); - object.id = _id; - return object; - }); - - return mongoose.model("users", schema); -}; diff --git a/app-backend/models/database/videos.model.js b/app-backend/models/database/videos.model.js deleted file mode 100644 index 4d322da..0000000 --- a/app-backend/models/database/videos.model.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = mongoose => { - let schema = mongoose.Schema({ - userId: String, - videoId: String, - source: String, - interest: { - type: String, - default: null - }, - watchedDates: { - type: Array, - default: null - }, - isActive: { - type: Boolean, - default: true - } - }, - { timestamps: true } - ); - - schema.method("toJSON", function() { - const { __v, _id, ...object } = this.toObject(); - object.id = _id; - return object; - }); - - return mongoose.model("videos", schema); -}; diff --git a/app-backend/models/mongodb.model.js b/app-backend/models/mongodb.model.js deleted file mode 100644 index 9ddb7cd..0000000 --- a/app-backend/models/mongodb.model.js +++ /dev/null @@ -1,19 +0,0 @@ -const dbConfig = require("../config/mongodb.config"); -const mongoose = require("mongoose"); -mongoose.Promise = global.Promise; - -const db = {}; -db.mongoose = mongoose; - -if(typeof process.env.NODE_ENV !== 'undefined' && process.env.NODE_ENV === 'production'){ - db.url = dbConfig.prodUrl; -} else { - db.url = dbConfig.devUrl; -} - -db.users = require("./database/users.model")(mongoose); -db.playlists = require("./database/playlists.model")(mongoose); -db.videos = require("./database/videos.model")(mongoose); -db.ads = require("./database/ads.model")(mongoose); - -module.exports = db; diff --git a/app-backend/models/objects/image.model.js b/app-backend/models/objects/image.model.js deleted file mode 100644 index 72ec783..0000000 --- a/app-backend/models/objects/image.model.js +++ /dev/null @@ -1,10 +0,0 @@ -class Image { - constructor(base64, url, description, type){ - this.base64 = base64; - this.url = url; - this.description = description; - this.type = type; - } -} - -module.exports = Image; diff --git a/app-backend/models/objects/role.model.js b/app-backend/models/objects/role.model.js deleted file mode 100644 index 2e1703c..0000000 --- a/app-backend/models/objects/role.model.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - User: { - name: "user", - permission: 0, - isAccepted: true - }, - Advertiser: { - name: "advertiser", - permission: 5, - isAccepted: false - }, - Admin: { - name: "admin", - permission: 10, - isAccepted: false - }, - SuperAdmin: { - name: "superAdmin", - permission: 1000, - isAccepted: true - } -}; diff --git a/app-backend/models/objects/video.categories.model.js b/app-backend/models/objects/video.categories.model.js deleted file mode 100644 index 6eaab33..0000000 --- a/app-backend/models/objects/video.categories.model.js +++ /dev/null @@ -1,157 +0,0 @@ -const {youtube, dailymotion} = require('../../config/host.config'); -module.exports = [ - { - id: 0, - interest: "Actualités", - categories: [ - {id: "news", name: "News", source: dailymotion.name}, - {id: "25", name: "News & Politics", source: youtube.name}, - ] - }, - { - id: 1, - interest: "Animaux", - categories: [ - {id: "animals", name: "animaux", source: dailymotion.name}, - {id: "15", name: "Pets & Animals", source: youtube.name}, - ] - }, - { - id: 2, - interest: "Arts", - categories: [ - {id: "creation", name: "Art", source: dailymotion.name}, - {id: "", name: "", source: youtube.name}, - ] - }, - { - id: 3, - interest: "Autos", - categories: [ - {id: "auto", name: "Auto-Moto", source: dailymotion.name}, - {id: "2", name: "Autos & Vehicles", source: youtube.name}, - ] - }, - { - id: 4, - interest: "Divertissements", - categories: [ - {id: "tv", name: "TV", source: dailymotion.name}, - {id: "fun", name: "Humour & Divertissement", source: dailymotion.name}, - {id: "webcam", name: "Webcam", source: dailymotion.name}, - {id: "23", name: "Comedy", source: youtube.name}, - {id: "24", name: "Entertainment", source: youtube.name}, - {id: "43", name: "Shows", source: youtube.name} - ] - }, - { - id: 5, - interest: "Éducation", - categories: [ - {id: "school", name: "Éducation", source: dailymotion.name}, - {id: "27", name: "Education", source: youtube.name} - ] - }, - { - id: 6, - interest: "Événements", - categories: [ - {id: "", name: "", source: dailymotion.name}, - {id: "19", name: "Travel & Events", source: youtube.name}, - ] - }, - { - id: 7, - interest: "Films", - categories: [ - {id: "shortfilms", name: "Cinéma", source: dailymotion.name}, - {id: "1", name: "Film & Animation", source: youtube.name}, - {id: "18", name: "Short Movies", source: youtube.name}, - {id: "30", name: "Movies", source: youtube.name}, - {id: "31", name: "Anime/Animation", source: youtube.name}, - {id: "32", name: "Action/Adventure", source: youtube.name}, - {id: "33", name: "Comedy", source: youtube.name}, - {id: "35", name: "Documentary", source: youtube.name}, - {id: "36", name: "Drama", source: youtube.name}, - {id: "39", name: "Horror", source: youtube.name}, - {id: "40", name: "Sci-Fi/Fantasy", source: youtube.name}, - {id: "41", name: "Thriller", source: youtube.name}, - {id: "42", name: "Shorts", source: youtube.name}, - {id: "44", name: "Trailers", source: youtube.name} - ] - }, - { - id: 8, - interest: "Jeux vidéo", - categories: [ - {id: "videogames", name: "Jeux vidéo", source: dailymotion.name}, - {id: "20", name: "Gaming", source: youtube.name}, - ] - }, - { - id: 9, - interest: "Kids", - categories: [ - {id: "kids", name: "Kids", source: dailymotion.name}, - {id: "", name: "", source: youtube.name}, - ] - }, - { - id: 10, - interest: "Modes de vie", - categories: [ - {id: "lifestyle", name: "Lifestyle & Tutoriels", source: dailymotion.name}, - {id: "26", name: "Howto & Style", source: youtube.name}, - ] - }, - { - id: 11, - interest: "Musiques", - categories: [ - {id: "music", name: "Musique", source: dailymotion.name}, - {id: "10", name: "Music", source: youtube.name}, - ] - }, - { - id: 12, - interest: "People", - categories: [ - {id: "people", name: "Amis & Famille", source: dailymotion.name}, - {id: "21", name: "Videoblogging", source: youtube.name}, - {id: "22", name: "People & Blogs", source: youtube.name}, - {id: "37", name: "Family", source: youtube.name}, - ] - }, - { - id: 13, - interest: "Science et Technologie", - categories: [ - {id: "tech", name: "Tech", source: dailymotion.name}, - {id: "28", name: "Science & Technology", source: youtube.name}, - ] - }, - { - id: 14, - interest: "Sports", - categories: [ - {id: "sport", name: "Sport", source: dailymotion.name}, - {id: "17", name: "Sports", source: youtube.name}, - ] - }, - { - id: 15, - interest: "Voyages", - categories: [ - {id: "travel", name: "Voyages", source: dailymotion.name}, - {id: "38", name: "Foreign", source: youtube.name}, - ] - }, - { - id: 16, - interest: "Autres", - categories: [ - {id: "29", name: "Nonprofits & Activism", source: youtube.name}, - {id: "33", name: "Classics", source: youtube.name} - ] - } -]; diff --git a/app-backend/routes/ad.routes.js b/app-backend/routes/ad.routes.js deleted file mode 100644 index 738892b..0000000 --- a/app-backend/routes/ad.routes.js +++ /dev/null @@ -1,24 +0,0 @@ -const ads = require("../controllers/ad.controller"); -module.exports = app => { - let router = require("express").Router(); - - // Create a new Ad - router.post("/ad/create", ads.create); - - // Retrieve all Ad from id if admin or session id - router.get("/ad/findAll", ads.findAll); - - // Find single Ad from id if admin or session id - router.get("/ad/findOne/:id", ads.findOne); - - // Update a Ad with ad id - router.put("/ad/update/:id", ads.update); - - // Delete a Ad with ad id - router.delete("/ad/delete/:id", ads.delete); - - // Delete all Ad from id if admin or session id - router.delete("/ad/deleteAll", ads.deleteAll); - - app.use('/api', router); -}; diff --git a/app-backend/routes/misc.routes.js b/app-backend/routes/misc.routes.js deleted file mode 100644 index 7aa5be6..0000000 --- a/app-backend/routes/misc.routes.js +++ /dev/null @@ -1,9 +0,0 @@ -const misc = require("../controllers/misc.controller"); -module.exports = app => { - let router = require("express").Router(); - - // Get all interests available - router.get("/misc/getInterests", misc.getInterests); - - app.use('/api', router); -}; diff --git a/app-backend/routes/playlist.routes.js b/app-backend/routes/playlist.routes.js deleted file mode 100644 index 3b9beeb..0000000 --- a/app-backend/routes/playlist.routes.js +++ /dev/null @@ -1,24 +0,0 @@ -const playlists = require("../controllers/playlist.controller"); -module.exports = app => { - let router = require("express").Router(); - - // Create a new Playlist - router.post("/playlist/create", playlists.create); - - // Retrieve all Playlist from id if admin or session id - router.get("/playlist/findAll", playlists.findAll); - - // Find single Playlist from id if admin or session id - router.get("/playlist/findOne/:id", playlists.findOne); - - // Update a Playlist with playlist id - router.put("/playlist/update/:id", playlists.update); - - // Delete a Playlist with playlist id - router.delete("/playlist/delete/:id", playlists.delete); - - // Delete all Playlists from id if admin or session id - router.delete("/playlist/deleteAll", playlists.deleteAll); - - app.use('/api', router); -}; diff --git a/app-backend/routes/user.routes.js b/app-backend/routes/user.routes.js deleted file mode 100644 index 346cb04..0000000 --- a/app-backend/routes/user.routes.js +++ /dev/null @@ -1,42 +0,0 @@ -const users = require("../controllers/user.controller"); -module.exports = app => { - let router = require("express").Router(); - - // Authenticate a User - router.post("/user/auth", users.auth); - - // Logout a User - router.delete("/user/logout", users.logout); - - // Request password reset with email - router.post("/user/resetPass", users.resetPass); - - // Create and Save a new User - router.post("/user/create", users.create); - - // Retrieve all Users if admin - router.get("/user/findAll", users.findAll); - - // Find single User from id if admin or session id - router.get("/user/findOne/:id", users.findOne); - - // Update a User from id if admin or session id - router.put("/user/update/:id", users.update); - - // Delete a User from id if admin or session id - router.delete("/user/delete/:id", users.delete); - - // Delete all Users if superAdmin - router.delete("/user/deleteAll", users.deleteAll); - - // Get all Roles depending on the User session id - router.get("/user/roles", users.roles); - - // Get 1 or multiple ad adapted to the User session id - router.get("/user/ad", users.ad); - - // Get History - router.get("/user/history", users.history); - - app.use('/api', router); -}; diff --git a/app-backend/routes/video.routes.js b/app-backend/routes/video.routes.js deleted file mode 100644 index a07de28..0000000 --- a/app-backend/routes/video.routes.js +++ /dev/null @@ -1,30 +0,0 @@ -const videos = require("../controllers/video.controller"); -module.exports = app => { - let router = require("express").Router(); - - // Search Videos - router.get("/video/search", videos.search); - - // Get Video with id of source - router.get("/video/get/:id", videos.get); - - // Create a new Video - router.post("/video/create/:id", videos.create); - - // Retrieve all Videos - router.get("/video/findAll", videos.findAll); - - // Find single Video with id - router.get("/video/findOne/:id", videos.findOne); - - // Update Video with id - router.put("/video/update/:id", videos.update); - - // Delete Video with id - router.delete("/video/delete/:id", videos.delete); - - // Delete all Videos - router.delete("/video/deleteAll", videos.deleteAll); - - app.use('/api', router); -}; diff --git a/karma.conf.js b/karma.conf.js index 3635639..e82c4ac 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -25,7 +25,7 @@ module.exports = function (config) { suppressAll: true // removes the duplicated traces }, coverageReporter: { - dir: require('path').join(__dirname, './coverage/frontend'), + dir: require('path').join(__dirname, './coverage/userAndAdvertiser'), subdir: '.', reporters: [ { type: 'html' }, diff --git a/package.json b/package.json index 1aacb0a..dc0f7db 100644 --- a/package.json +++ b/package.json @@ -1,67 +1,47 @@ { - "name": "frontend", - "version": "1.0.0", + "name": "frontend-user-advertiser", + "version": "0.0.0", "scripts": { "ng": "ng", "start": "node server.js", - "dev": "ng serve", - "build": "ng build --configuration production", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" }, "private": true, "dependencies": { - "@angular/animations": "^12.2.11", - "@angular/cdk": "^12.2.11", - "@angular/cli": "~12.2.11", - "@angular/common": "^12.2.11", - "@angular/compiler": "^12.2.11", - "@angular/compiler-cli": "~12.2.11", - "@angular/core": "^12.2.11", - "@angular/forms": "^12.2.11", - "@angular/material": "^12.2.11", - "@angular/platform-browser": "^12.2.11", - "@angular/platform-browser-dynamic": "^12.2.11", - "@angular/router": "^12.2.11", - "@ng-bootstrap/ng-bootstrap": "^10.0.0", - "angular-responsive-carousel": "^2.1.2", - "body-parser": "^1.19.0", + "@angular/animations": "~12.2.0", + "@angular/cdk": "^13.1.1", + "@angular/common": "~12.2.0", + "@angular/compiler": "~12.2.0", + "@angular/core": "~12.2.0", + "@angular/forms": "~12.2.0", + "@angular/material": "^13.1.1", + "@angular/platform-browser": "~12.2.0", + "@angular/platform-browser-dynamic": "~12.2.0", + "@angular/router": "~12.2.0", "bootstrap": "^5.1.3", - "chart.js": "^2.9.3", - "cookie-parser": "^1.4.5", - "cors": "^2.8.5", - "dotenv": "^10.0.0", - "express": "^4.17.1", + "express": "^4.17.2", "jquery": "^3.6.0", - "jsonwebtoken": "^8.5.1", - "mongoose": "^6.0.12", "ng2-charts": "^2.2.3", "popper": "^1.0.1", - "request": "^2.88.2", "rxjs": "~6.6.0", - "tslib": "^2.0.0", - "typescript": "~4.3.5", - "zone.js": "~0.11.3" + "tslib": "^2.3.0", + "zone.js": "~0.11.4", + "chart.js": "^2.9.3" }, "devDependencies": { - "@angular-devkit/build-angular": "~12.2.11", - "@angular/cli": "~12.2.11", - "@angular/compiler-cli": "~12.2.11", - "@angular/localize": "^12.2.11", - "@types/jasmine": "~3.6.0", + "@angular-devkit/build-angular": "~12.2.14", + "@angular/cli": "~12.2.14", + "@angular/compiler-cli": "~12.2.0", + "@types/jasmine": "~3.8.0", "@types/node": "^12.11.1", - "codelyzer": "^6.0.0", - "jasmine-core": "~3.6.0", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~6.3.5", + "jasmine-core": "~3.8.0", + "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.0.3", "karma-jasmine": "~4.0.0", - "karma-jasmine-html-reporter": "^1.5.0", - "protractor": "~7.0.0", - "ts-node": "~8.3.0", - "tslint": "~6.1.0", + "karma-jasmine-html-reporter": "~1.7.0", "typescript": "~4.3.5" } } diff --git a/server.js b/server.js index 91f4105..73b92a1 100644 --- a/server.js +++ b/server.js @@ -3,80 +3,9 @@ const express = require('express'); const app = express(); const port = process.env.PORT || 3000; -const cookieParser = require('cookie-parser'); -app.use(cookieParser()); - -const bodyParser = require('body-parser'); -app.use(bodyParser.urlencoded({extended:true})); -app.use(bodyParser.json()); - -const cors = require('cors'); -app.use(cors({origin: 'http://127.0.0.1:4200', credentials: true})); - -const db = require("./app-backend/models/mongodb.model"); -console.log("Db Url: ",db.url); -db.mongoose - .connect(db.url, { - useNewUrlParser: true, - useUnifiedTopology: true - }, function (err){ - const admin = new db.mongoose.mongo.Admin(db.mongoose.connection.db); - admin.buildInfo(function (err, info) { - console.log("MongoDB Version: "+info.version); - }); - if(err){ - console.log("Cannot connect to the database!", err); - process.exit(); - } else{ - console.log("Connected to the database!", db.url); - } - }); - -require("./app-backend/routes/user.routes")(app); -require("./app-backend/routes/playlist.routes")(app); -require("./app-backend/routes/video.routes")(app); -require("./app-backend/routes/ad.routes")(app); -require("./app-backend/routes/misc.routes")(app); - -const roles = require("./app-backend/models/objects/role.model"); -const User = db.users; -const login = 'superAdmin'; -const hashPass = 'hashPassSuperAdmin'; -const mail = 'superAdmin@email.admin'; - -User.exists({role: roles.SuperAdmin}, function (err, docs){ - if(err){ - console.log("Some error occurred while checking if superAdmin already exists."); - } else{ - if(docs === null){ - const user = new User({ - login: login, - hashPass: hashPass, - email: mail, - role: roles.SuperAdmin - }); - user - .save(user) - .then(data => { - data.hashPass = undefined; // Hiding hashPass on return - console.log(data); - }) - .catch(err => { - console.log(err.message || "Some error occurred while creating superAdmin."); - }); - } else { - console.log("superAdmin already exist !"); - } - } -}); - -app.get('/*all', function(req,res) { - res.sendFile(path.join(__dirname+ '/dist/index.html')); -}); - -app.use(express.static(__dirname + '/dist/frontend')); +app.use(express.static(__dirname + '/dist/frontend-userAndAdvertiser')); app.get('/*', function(req,res) { - res.sendFile(path.join(__dirname+ '/dist/frontend/index.html')); + res.sendFile(path.join(__dirname+ '/dist/frontend-userAndAdvertiser/index.html')); }); app.listen(port, '0.0.0.0',() => { diff --git a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.html b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.html deleted file mode 100644 index 76bc154..0000000 --- a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.html +++ /dev/null @@ -1,167 +0,0 @@ -
-
- - -

- - - - -
- - -
- Filtre -
- - - - -
- -
- - -
- - -
- visible
- non visible -
- - -
- - Sujets - - - {{formControlInterests.value ? formControlInterests.value[0] : ''}} - - (+{{formControlInterests.value.length - 1}} {{formControlInterests.value?.length === 2 ? 'autre' : 'autres'}}) - - - {{topping}} - - - -
- - -
- Période de création:   - - Date de début - - -   -   - - Date de fin - - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Titre - {{advert.title}} - Entreprise - {{advert.company}} - Sujets - - {{objectInterest.interest}}, - {{objectInterest.interest}} - - Date de création - {{ advert.createdAt | date:'dd/LL/YYYY à HH:mm:ss' }} - Dernière modification - {{ advert.updatedAt | date:'dd/LL/YYYY à HH:mm:ss' }} - Vues - {{advert.countViews}} - Visible - check - - Actions - - -
Aucune vidéo ne correspond au filtre: "{{input.value}}"
-
- -
-

- -
-
diff --git a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.scss b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.scss deleted file mode 100644 index 954f3d0..0000000 --- a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.scss +++ /dev/null @@ -1,74 +0,0 @@ -.myContainer { - max-width: 100vw; - height: 100vh; - overflow-x: hidden; - font-size: small; -} - -// ---------------------------------------------------------- - - -.filtersContainer { - width: 80%; - background-color: white; - padding: 10px 10px 10px 10px; - margin: 20px 3% 20px 3% -} - -.myRow { - margin-left: 1%; -} - -.textFilter { - width: 50%; - font-size: medium; - border-radius: 5px; -} - -// ---------------------------------------------------------- - - -table { - margin: 0 auto; - width: 94%; - font-size: small; -} -.darkTheme table { border: solid 2px white; } - -th.mat-sort-header-sorted { - color: black; -} - -td { - font-size: small; -} - -input { - width: 30%; - font-size: large; - border-radius: 5px; -} - - -// ------------------------------------------------------------------------- - - -// aura -::ng-deep .mat-checkbox-ripple .mat-ripple-element { - background-color: grey !important; -} - -// contenu coche -::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background { - background-color: black !important; -} - -// indeterminate -::ng-deep .mat-checkbox .mat-checkbox-frame { - border: solid 1px black !important; - background-color: white !important; -} - -::ng-deep .mat-pseudo-checkbox-checked { - background-color: black !important; -} diff --git a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.spec.ts b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.spec.ts deleted file mode 100644 index 5b77dff..0000000 --- a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PageAdListAdminComponent } from './page-ad-list-admin.component'; - -describe('PageAdListAdminComponent', () => { - let component: PageAdListAdminComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PageAdListAdminComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PageAdListAdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.ts b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.ts deleted file mode 100644 index 3b89012..0000000 --- a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.ts +++ /dev/null @@ -1,262 +0,0 @@ -import {AfterViewInit, Component, ViewChild} from '@angular/core'; -import {MatSort} from "@angular/material/sort"; -import {MatPaginator} from "@angular/material/paginator"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {MatDialog} from "@angular/material/dialog"; -import {MatSnackBar} from "@angular/material/snack-bar"; -import {MatTableDataSource} from "@angular/material/table"; -import {Advert} from "../../../utils/interfaces/advert"; -import {PopupDeleteAdAdminComponent} from "../popup-delete-ad-admin/popup-delete-ad-admin.component"; -import {PopupVisualizeImagesAdminComponent} from "../popup-visualize-images-admin/popup-visualize-images-admin.component"; -import {FormControl} from "@angular/forms"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {HttpParams} from "@angular/common/http"; - - - -export interface AdvertWithCountViewsAndCompany { - id: string, - userId: string, - company: string, - title: string, - url: string, - images: { - url: string, - description: string, - }[], - interests: string[], - comment: string, - views: Date[], - countViews: number, - isVisible: boolean, - isActive: boolean, - createdAt: Date, - updatedAt: Date, -} - - - -@Component({ - selector: 'app-page-ad-list-admin', - templateUrl: './page-ad-list-admin.component.html', - styleUrls: ['./page-ad-list-admin.component.scss'] -}) -export class PageAdListAdminComponent implements AfterViewInit -{ - tabAdvertWithCountViews: AdvertWithCountViewsAndCompany[] = []; - tabAdvertiser: any[]; - displayedColumns: string[] = [ 'title', 'company', 'interests', 'createdAt', 'updatedAt', 'countViews', 'isVisible', 'actions' ]; - dataSource ; - @ViewChild(MatSort) sort: MatSort; - @ViewChild(MatPaginator) paginator: MatPaginator; - - visible: boolean = true; - noVisible: boolean = true; - startDate: Date = null; - endDate: Date = null; - formControlInterests = new FormControl(); - allInterests: string[] = []; - - - constructor( public themeService: ThemeService, - public dialog: MatDialog, - private snackBar: MatSnackBar, - private messageService: MessageService) { } - - - ngAfterViewInit(): void - { - // Ask for ads and then for advertiser - let params = new HttpParams(); - params = params.append("isActive", true); - this.messageService - .get("ad/findAll", params) - .subscribe(ret => this.afterReceivingAds(ret), err => this.afterReceivingAds(err) ); - - // Ask for interest - this.messageService - .get("misc/getInterests") - .subscribe(ret => this.afterReceivingInterests(ret), err => this.afterReceivingInterests(err) ); - } - - - afterReceivingAds(retour: any): void - { - if(retour.status !== "success") { - console.log(retour); - } - else { - const tabAdvert = retour.data; - this.messageService - .get("user/findAll") - .subscribe(ret => this.afterReceivingAdvertiser(ret, tabAdvert), err => this.afterReceivingAdvertiser(err, tabAdvert) ); - } - } - - - afterReceivingAdvertiser(retour: any, tabAdvert): void - { - if(retour.status !== "success") { - console.log(retour); - } - else { - this.tabAdvertiser = retour.data.filter(x => x.role.name === "advertiser"); - for(let advert of tabAdvert) this.tabAdvertWithCountViews.push(this.advertToAdvertWithCountViewsAndCompany(advert)); - this.dataSource = new MatTableDataSource(); - this.onFilter(); - } - } - - - afterReceivingInterests(retour: any): void - { - if(retour.status !== "success") { - console.log(retour); - } - else { - this.allInterests = retour.data.map(x => x.interest); - this.allInterests.sort(); - } - } - - - applyFilter(event: Event): void - { - const filterValue = (event.target as HTMLInputElement).value; - this.dataSource.filter = filterValue.trim().toLowerCase(); - } - - - onVisualizeImages(advert: AdvertWithCountViewsAndCompany) - { - if(advert.images.length !== 0) - { - const config = { - width: '30%', - height: '90%', - data: { images: advert.images } - }; - this.dialog - .open(PopupVisualizeImagesAdminComponent, config) - .afterClosed() - .subscribe(retour => {}); - } - else { - const config = { duration: 2000, panelClass: "custom-class" }; - const message = "Cette annonce ne contient aucune image" ; - this.snackBar.open( message, "", config); - } - } - - - onDelete(advert: AdvertWithCountViewsAndCompany): void - { - const config = { - data: { advert: advert } - }; - this.dialog - .open(PopupDeleteAdAdminComponent, config) - .afterClosed() - .subscribe( retour => { - - const config = { duration: 1000, panelClass: "custom-class" }; - let message = "" ; - if((retour === undefined) || (retour === null)) { - message = "Opération annulée" ; - } - else { - const index = this.dataSource.data.findIndex( elt => (elt.id === advert.id)); - this.dataSource.data.splice(index, 1); - this.dataSource.data = this.dataSource.data; - this.dataSource = this.dataSource; - message = advert.title + " a bien été supprimée ✔" ; - } - this.snackBar.open( message, "", config); - }); - } - - - onFilter(): void - { - this.dataSource.data = []; - for(let advert of this.tabAdvertWithCountViews) - { - let valide: boolean = true; - - if(advert.isVisible && this.visible) valide = true; - else if((!advert.isVisible) && this.noVisible) valide = true; - else valide = false; - - if(valide) - { - if ((advert.createdAt === null) && (this.startDate !== null)) valide = false; - else if ((advert.createdAt === null) && (this.endDate !== null)) valide = false; - else if (this.startDate !== null) - { - if(this.startDate.getTime() > advert.createdAt.getTime()) valide = false; - else if (this.endDate !== null) - { - if(this.endDate.getTime() < advert.createdAt.getTime()) valide = false; - } - } - } - - if(valide) { - if(this.formControlInterests.value !== null) { - for (let interest of this.formControlInterests.value) { - if (advert.interests.indexOf(interest) === -1) { - valide = false; - break; - } - } - } - } - - if(valide) this.dataSource.data.push(advert); - } - - this.dataSource = new MatTableDataSource(this.dataSource.data); - this.dataSource.sort = this.sort; - this.dataSource.paginator = this.paginator; - } - - - onNewStartDate(event): void { - this.startDate = new Date(event); - } - - onNewEndDate(event): void { - this.endDate = new Date(event); - } - - - advertToAdvertWithCountViewsAndCompany(advert): AdvertWithCountViewsAndCompany - { - let company0 = "company" ; - for(let advertiser of this.tabAdvertiser) - { - if(advert.userId === advertiser.id) { - company0 = advertiser.company; - break; - } - } - - return { - id: advert.id, - userId: advert.userId, - title: advert.title, - company: company0, - url: advert.url, - images: advert.images, - interests: advert.interests, - comment: advert.comment, - views: advert.views, - countViews: advert.views.length, - isVisible: advert.isVisible, - isActive: advert.isActive, - createdAt: advert.createdAt, - updatedAt: advert.updatedAt, - } - } - -} diff --git a/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.html b/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.html deleted file mode 100644 index d92e686..0000000 --- a/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.html +++ /dev/null @@ -1,8 +0,0 @@ - - Êtes-vous sûr de vouloir supprimer l'annonce {{advert.title}} ? - - - - - - diff --git a/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.scss b/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.spec.ts b/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.spec.ts deleted file mode 100644 index 811eee8..0000000 --- a/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PopupDeleteAdAdminComponent } from './popup-delete-ad-admin.component'; - -describe('PopupDeleteAdAdminComponent', () => { - let component: PopupDeleteAdAdminComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PopupDeleteAdAdminComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PopupDeleteAdAdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.ts b/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.ts deleted file mode 100644 index 196f024..0000000 --- a/src/app/admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import {Component, Inject, OnInit} from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; - - - -@Component({ - selector: 'app-popup-delete-ad-admin', - templateUrl: './popup-delete-ad-admin.component.html', - styleUrls: ['./popup-delete-ad-admin.component.scss'] -}) -export class PopupDeleteAdAdminComponent implements OnInit -{ - advert: any; - - - constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data, - private messageService: MessageService) { } - - - ngOnInit(): void - { - this.advert = this.data.advert; - } - - - onValidate(): void - { - this.messageService - .delete("ad/delete/"+this.advert.id) - .subscribe(ret => this.onValidateCallback(ret), err => this.onValidateCallback(err)); - } - - - onValidateCallback(retour: any): void - { - if(retour.status !== "success") { - console.log(retour); - this.dialogRef.close(); - } - else { - console.log("suppr"); - console.log(retour); - this.dialogRef.close(true); - } - } - -} diff --git a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.html b/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.html deleted file mode 100644 index dfbc2fe..0000000 --- a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

- -
- - - - - - - - - - - - - - diff --git a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.scss b/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.scss deleted file mode 100644 index eb60d48..0000000 --- a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -carousel { - width: 100%; - margin: 0 auto; - text-align: center; - justify-content: center -} - - - -.dialog-title { - display: flex; - justify-content: space-between; - align-items: center; -} diff --git a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.spec.ts b/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.spec.ts deleted file mode 100644 index 24f276f..0000000 --- a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PopupVisualizeImagesAdminComponent } from './popup-visualize-images-admin.component'; - -describe('PopupVisualizeImagesAdminComponent', () => { - let component: PopupVisualizeImagesAdminComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PopupVisualizeImagesAdminComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PopupVisualizeImagesAdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.ts b/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.ts deleted file mode 100644 index 5b98819..0000000 --- a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import {Component, Inject, OnInit} from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; - - - -@Component({ - selector: 'app-popup-visualize-images-admin', - templateUrl: './popup-visualize-images-admin.component.html', - styleUrls: ['./popup-visualize-images-admin.component.scss'] -}) -export class PopupVisualizeImagesAdminComponent implements OnInit -{ - tabImages = []; - index: number = 0; - nbImage: number = 0; - - - constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data ) { } - - - ngOnInit(): void - { - this.tabImages = this.data.images; - this.nbImage = this.tabImages.length; - } - - onPrecedent(): void - { - if(this.index !== 0) this.index -= 1; - } - - onSuivant(): void - { - if(this.index !== (this.nbImage-1)) this.index += 1; - } - -} diff --git a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.html b/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.html deleted file mode 100644 index 7e025c5..0000000 --- a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
- - - - - -
- - -
- -
- - -
-
Pseudo:
-
{{admin.login}}
-
- - -
-
Mail:
-
{{admin.email}}
-
- - -
-
Date de création:
-
{{admin.createdAt | date:'dd/LL/YYYY'}}
-
- - -
- -
- -
- - -
-
diff --git a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.scss b/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.scss deleted file mode 100644 index 966c9a2..0000000 --- a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.scss +++ /dev/null @@ -1,61 +0,0 @@ -.myContainer { - max-width: 100vw; - height: 100vh; - overflow-x: hidden; -} - - -.boite { - margin-left: auto; - margin-right: auto; - width: 25%; - margin-top: 10vh; - border: solid 3px; - border-radius: 10px; - padding: 20px 40px 20px 40px; - background-color: #ffffff; - text-align: center; - box-shadow: 10px 5px 5px black; -} -.lightTheme .boite { - border-color: black; -} -.darkTheme .boite { - border-color: white; -} - - -img { - margin: 0px 0px 10px 0px; - width: 5vw; - height: 5vw; - border: solid 2px black; - border-radius: 50%; - font-size: xxx-large; -} - - -.myRow { - margin: 15px 0px 15px 0px; -} -.myLabel { - text-align: right; - padding: 0px 5px 0px 0px; - margin: 0px; - font-weight: bold; -} -.myValue { - text-align: left; - padding: 0px 0px 0px 5px; - margin: 0px; -} - - -.btnContainer { - text-align: center; - margin-top: 40px; -} -.myBtn { - border: solid 1px black; - background-color: white; -} diff --git a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.spec.ts b/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.spec.ts deleted file mode 100644 index 39fbdd9..0000000 --- a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PageProfilAdminComponent } from './page-profil-admin.component'; - -describe('PageProfilAdminComponent', () => { - let component: PageProfilAdminComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PageProfilAdminComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PageProfilAdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.ts b/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.ts deleted file mode 100644 index 75e599f..0000000 --- a/src/app/admin/myProfil/page-profil-admin/page-profil-admin.component.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import {User} from "../../../utils/interfaces/user"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {MatDialog} from "@angular/material/dialog"; -import {MatSnackBar} from "@angular/material/snack-bar"; -import {PopupUpdateAdminComponent} from "../popup-update-admin/popup-update-admin.component"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; - - - -@Component({ - selector: 'app-page-profil-admin', - templateUrl: './page-profil-admin.component.html', - styleUrls: ['./page-profil-admin.component.scss'] -}) -export class PageProfilAdminComponent implements OnInit -{ - admin: User = { - _id: "", - login: "", - hashPass: "", - email: "", - role: { - name: "admin", - permission: 10, - isAccepted: true, - }, - profileImageUrl: "", - dateOfBirth: null, - gender: "man", - interests: [], - company: "", - isActive: true, - createdAt: new Date(), - updatedAt: new Date(), - lastConnexion: null - }; - - - constructor( public themeService: ThemeService, - public dialog: MatDialog, - private snackBar: MatSnackBar, - private messageService: MessageService, - private profilService: ProfilService ) { } - - - ngOnInit(): void - { - this.messageService - .get( "user/findOne/"+this.profilService.getId()) - .subscribe( retour => this.ngOnInitCallback(retour), err => this.ngOnInitCallback(err) ) - } - - - ngOnInitCallback(retour: any) - { - if(retour.status !== "success") { - console.log(retour); - } - else { - this.admin = retour.data; - } - } - - - onModifier() - { - const config = { - width: '25%', - data: { admin: this.admin } - }; - this.dialog - .open(PopupUpdateAdminComponent, config) - .afterClosed() - .subscribe(retour => { - - if((retour === null) || (retour === undefined)) - { - const config = { duration: 1000, panelClass: "custom-class" }; - this.snackBar.open( "Opération annulé", "", config); - } - else - { - this.admin = retour; - } - }); - } - -} diff --git a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.html b/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.html deleted file mode 100644 index 38cf7e5..0000000 --- a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.html +++ /dev/null @@ -1,59 +0,0 @@ -
-
- - -
-
- -
- - -

- - - - Pseudo - -
- - -
- - -
- Modifier mot de passe: - -
- - -
- - - Nouveau mot de passe - - -
- - - Confirmation nouveau mot de passe - - -
-

- - -
- - -
- {{errorMessage}} -
- - -
- - -
- -
-
diff --git a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.scss b/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.scss deleted file mode 100644 index 1968e90..0000000 --- a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -.boite { - font-size: small; -} - -button { - font-size: small; -} - -img { - margin: 0px 0px 10px 0px; - width: 5vw; - height: 5vw; - border: solid 2px black; - border-radius: 50%; - font-size: xxx-large; -} - -// ------------------------------------------------------------------------- - -// aura -::ng-deep .mat-checkbox-ripple .mat-ripple-element { - background-color: grey !important; -} - -// contenu coche -::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background { - background-color: black !important; -} - -// indeterminate -::ng-deep .mat-checkbox .mat-checkbox-frame { - background-color: white !important; -} diff --git a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.spec.ts b/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.spec.ts deleted file mode 100644 index 9f1a0f5..0000000 --- a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PopupUpdateAdminComponent } from './popup-update-admin.component'; - -describe('PopupUpdateAdminComponent', () => { - let component: PopupUpdateAdminComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PopupUpdateAdminComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PopupUpdateAdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.ts b/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.ts deleted file mode 100644 index 39bb3f0..0000000 --- a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.ts +++ /dev/null @@ -1,124 +0,0 @@ -import {Component, Inject, OnInit} from '@angular/core'; -import {User} from "../../../utils/interfaces/user"; -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; - - - -@Component({ - selector: 'app-popup-update-admin', - templateUrl: './popup-update-admin.component.html', - styleUrls: ['./popup-update-admin.component.scss'] -}) -export class PopupUpdateAdminComponent implements OnInit -{ - adminCopy: User; - newPassword: string = ""; - confirmNewPassword: string = "" ; - changePassword: boolean = false ; - hasError: boolean = false; - errorMessage: string = "" ; - - - constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data, - private messageService: MessageService, - private profilService: ProfilService ) { } - - - ngOnInit(): void - { - const admin0 = this.data.admin; - this.adminCopy = { - _id: admin0._id, - login: admin0.login, - hashPass: admin0.hashPass, - email: admin0.email, - role: { - name: admin0.role.name, - permission: admin0.role.permission, - isAccepted: admin0.role.isAccepted, - }, - profileImageUrl: admin0.profileImageUrl, - dateOfBirth: admin0.dateOfBirth, - gender: admin0.gender, - interests: [], - company: "", - isActive: admin0.isActive, - createdAt: admin0.createdAt, - updatedAt: admin0.updatedAt, - lastConnexion: admin0.lastConnexion - }; - for(let interest of admin0.interests) this.adminCopy.interests.push(interest); - } - - - onValider() - { - this.checkField(); - if(!this.hasError) - { - if(this.changePassword) this.adminCopy.hashPass = this.newPassword; - const data = { - login: this.adminCopy.login, - hashPass: this.adminCopy.hashPass, - email: this.adminCopy.email, - profileImageUrl: this.adminCopy.profileImageUrl, - }; - this.messageService - .put("user/update/"+this.profilService.getId(), data) - .subscribe( ret => this.onValiderCallback(ret), err => this.onValiderCallback(err) ); - } - } - - - onValiderCallback(retour: any) - { - if(retour.status !== "success") { - console.log(retour); - this.dialogRef.close(null); - } - else { - this.profilService.setProfileImageUrl(this.adminCopy.profileImageUrl); - this.dialogRef.close(this.adminCopy); - } - } - - - checkField() - { - if(this.adminCopy.login.length === 0) { - this.errorMessage = "Veuillez remplir le champ 'pseudo'" ; - this.hasError = true; - } - else if(this.adminCopy.email.length === 0) { - this.errorMessage = "Veuillez remplir le champ 'email'" ; - this.hasError = true; - } - else if(!this.isValidEmail(this.adminCopy.email)) { - this.errorMessage = "Email invalide" ; - this.hasError = true; - } - else if((this.changePassword) && (this.newPassword.length === 0)) { - this.errorMessage = "Veuillez remplir le champ 'mot de passe'" ; - this.hasError = true; - } - else if((this.changePassword) && (this.newPassword !== this.confirmNewPassword)) { - this.errorMessage = "Le mot de passe est différent de sa confirmation" ; - this.hasError = true; - } - else { - this.errorMessage = "" ; - this.hasError = false; - } - } - - - isValidEmail(email) - { - let re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(email); - } - -} diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.html b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.html deleted file mode 100644 index 2a7c484..0000000 --- a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Centres d'intérêt - - - - - - - {{interest}} - - - - - - - - - - - - {{interest}} - - - - - - diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.scss b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.scss deleted file mode 100644 index c7acb4b..0000000 --- a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -mat-form-field { - width: 100%; -} diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.spec.ts b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.spec.ts deleted file mode 100644 index 62f9051..0000000 --- a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { InputInterestsAdminComponent } from './input-interests-admin.component'; - -describe('InputInterestsAdminComponent', () => { - let component: InputInterestsAdminComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ InputInterestsAdminComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(InputInterestsAdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.ts b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.ts deleted file mode 100644 index 72ead85..0000000 --- a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.ts +++ /dev/null @@ -1,121 +0,0 @@ -import {Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {COMMA, ENTER} from "@angular/cdk/keycodes"; -import {FormControl} from "@angular/forms"; -import {Observable} from "rxjs"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {map, startWith} from "rxjs/operators"; -import {MatChipInputEvent} from "@angular/material/chips"; -import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; - - - -@Component({ - selector: 'app-input-interests-admin', - templateUrl: './input-interests-admin.component.html', - styleUrls: ['./input-interests-admin.component.scss'] -}) -export class InputInterestsAdminComponent implements OnInit -{ - selectable = true; - removable = true; - separatorKeysCodes: number[] = [ENTER, COMMA]; - formControl = new FormControl(); - filteredInterests: Observable; - @Input() myInterests: string[] = []; - allInterests: string[] = []; - @Output() eventEmitter = new EventEmitter(); - @ViewChild('tagInput') tagInput: ElementRef; - interestsNotSelected: string[] = []; - - - constructor( private messageService: MessageService ) {} - - - ngOnInit(): void - { - this.filteredInterests = this.formControl.valueChanges.pipe( - startWith(null), - map((fruit: string | null) => fruit ? this._filter(fruit) : this.interestsNotSelected.slice())); - - this.messageService - .get("misc/getInterests") - .subscribe( retour => { - - if(retour.status !== "success") { - console.log(retour); - } - else { - this.allInterests = []; - for(let elt of retour.data) - { - this.allInterests.push(elt.interest); - this.interestsNotSelected.push(elt.interest); - } - } - }); - } - - - add(event: MatChipInputEvent): void - { - const value = (event.value || '').trim(); - const index = this.interestsNotSelected.indexOf(value); - if (value && (index !== -1) && (!this.myInterests.includes(value))) - { - this.myInterests.push(value); - event.chipInput!.clear(); - this.formControl.setValue(null); - this.eventEmitter.emit(this.myInterests); - this.interestsNotSelected.splice(index, 1); - } - } - - - remove(interest: string): void - { - // supprimer 'interest' de 'myInterest' - const index = this.myInterests.indexOf(interest); - if (index >= 0) this.myInterests.splice(index, 1); - this.eventEmitter.emit(this.myInterests); - - // remmettre 'interest' dans 'interestsNotSelected' - if(!this.interestsNotSelected.includes(interest)) - { - const indexOfAutres = this.interestsNotSelected.indexOf("Autres"); - if(indexOfAutres !== -1) - { - this.interestsNotSelected.splice(indexOfAutres, 1); - if(interest !== "Autres") this.interestsNotSelected.push(interest); - this.interestsNotSelected.sort(); - this.interestsNotSelected.push("Autres"); - } - else { - this.interestsNotSelected.push(interest); - if(interest !== "Autres") this.interestsNotSelected.sort(); - } - } - } - - - selected(event: MatAutocompleteSelectedEvent): void - { - const value = event.option.viewValue; - if(!this.myInterests.includes(value)) - { - this.myInterests.push(value); - const index = this.interestsNotSelected.indexOf(value); - this.interestsNotSelected.splice(index, 1); - } - this.tagInput.nativeElement.value = ''; - this.formControl.setValue(null); - this.eventEmitter.emit(this.myInterests); - } - - - private _filter(value: string): string[] - { - const filterValue = value.toLowerCase(); - return this.interestsNotSelected.filter(fruit => fruit.toLowerCase().includes(filterValue)); - } - -} diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.html b/src/app/admin/userList/page-user-list/page-user-list.component.html deleted file mode 100644 index 25fe6f5..0000000 --- a/src/app/admin/userList/page-user-list/page-user-list.component.html +++ /dev/null @@ -1,193 +0,0 @@ -
-
- - - -

- - - - -
- - -
-
- - -
- Filtre -
- - - - -
- -
- - -
- - -
- - - Utilisateur -
- - Annonceur -
- - Admin - -
-
- - -
- actif
- non actif -
- - -
- Période de dernière connexion:   - - Date de début - - -   -   - - Date de fin - - -
- -
- -
-
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- power_settings_new - - - - Pseudo - {{user.login}} - Email - {{user.email}} - Date de naissance - - {{ user.dateOfBirth | date:'dd/LL/YYYY' }} - Âge - - {{user.age}} - Sexe - H - F - Centres d'intérêt - - {{interest}}, - {{interest}} - - Date de création - {{ user.createdAt | date:'dd/LL/YYYY à HH:mm:ss' }} - Dernière connexion - {{ user.lastConnexion | date:'dd/LL/YYYY à HH:mm:ss' }} - Accepté - -
Aucune vidéo ne correspond au filtre: "{{input.value}}"
-
- -
-

- -
-
diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.scss b/src/app/admin/userList/page-user-list/page-user-list.component.scss deleted file mode 100644 index bbeac05..0000000 --- a/src/app/admin/userList/page-user-list/page-user-list.component.scss +++ /dev/null @@ -1,99 +0,0 @@ -.myContainer { - min-height: 100vh; - font-size: small; -} - -// ---------------------------------------------------------- - -.filtersContainer { - width: 90%; - background-color: white; - padding: 10px 10px 10px 10px; -} - -.myRow { - margin-left: 1%; -} - -.textFilter { - width: 50%; - font-size: medium; - border-radius: 5px; -} - -.btnAjouter { - background-color: white; - border: solid 1px black; -} - -// ---------------------------------------------------------- - -table { - margin: 0 auto; - width: 94%; - font-size: small; -} -.darkTheme table { border: solid 2px white; } - -th.mat-sort-header-sorted { - color: black; -} - -td { - font-size: small; -} - -// ------------------------------------------------------------------------- - -::ng-deep .mat-radio-inner-circle { - color: black !important; - background-color: black !important; -} - -::ng-deep .mat-radio-outer-circle{ - color: black !important; - border: solid 1px gray !important; -} - -// ------------------------------------------------------------------------- - - -// aura -::ng-deep .mat-checkbox-ripple .mat-ripple-element { - background-color: grey !important; -} - -// contenu coche -::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background { - background-color: black !important; -} - -// indeterminate -::ng-deep .mat-checkbox .mat-checkbox-frame { - border: solid 1px black !important; - background-color: white !important; -} - - -// -------------------------------------------------------------------- - - -// rong gauche -::ng-deep .mat-slide-toggle-thumb { - background-color: white !important; -} - -// trait droite -::ng-deep .mat-slide-toggle-bar { - background-color: gray !important; -} - -// rond droite -::ng-deep .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb { - background-color: white !important; -} - -// trait gauche -::ng-deep .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar { - background-color: cornflowerblue !important; -} diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts b/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts deleted file mode 100644 index edbbffe..0000000 --- a/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PageUserListComponent } from './page-user-list.component'; - -describe('PageUserListComponent', () => { - let component: PageUserListComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PageUserListComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PageUserListComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.ts b/src/app/admin/userList/page-user-list/page-user-list.component.ts deleted file mode 100644 index 42e0dad..0000000 --- a/src/app/admin/userList/page-user-list/page-user-list.component.ts +++ /dev/null @@ -1,233 +0,0 @@ -import {AfterViewInit, Component, ViewChild} from '@angular/core'; -import {MatSort} from "@angular/material/sort"; -import {MatPaginator} from "@angular/material/paginator"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {MatDialog} from "@angular/material/dialog"; -import {MatSnackBar} from "@angular/material/snack-bar"; -import {MatTableDataSource} from "@angular/material/table"; -import {PopupDeleteUserComponent} from "../popup-delete-user/popup-delete-user.component"; -import {PopupCreateUserComponent} from "../popup-create-user/popup-create-user.component"; -import {MessageService} from "../../../utils/services/message/message.service"; - - - -@Component({ - selector: 'app-page-user-list', - templateUrl: './page-user-list.component.html', - styleUrls: ['./page-user-list.component.scss'] -}) -export class PageUserListComponent implements AfterViewInit -{ - displayedColumns: string[]; - displayedColumnsUser: string[] = [ 'isActive', 'login', 'email', 'dateOfBirth', 'age', 'sexe', 'interests', 'createdAt', 'lastConnexion' ]; - displayedColumnsAdvertiser: string[] = [ 'isActive', 'login', 'email', 'createdAt', 'lastConnexion', 'isAccepted' ]; - displayedColumnsAdmin: string[] = [ 'isActive', 'login', 'email', 'createdAt', 'lastConnexion' ]; - - tabUser: any[] = []; - tabAdvertiser: any[] = []; - tabAdmin: any[] = []; - - roleName: string = "user" ; - dataSource ; - @ViewChild(MatSort) sort: MatSort; - @ViewChild(MatPaginator) paginator: MatPaginator; - - active: boolean = true; - noActive: boolean = false; - startDate: Date = null; - endDate: Date = null; - - - constructor( public themeService: ThemeService, - public dialog: MatDialog, - private snackBar: MatSnackBar, - private messageService: MessageService ) { } - - - ngAfterViewInit(): void - { - this.messageService - .get("user/findAll") - .subscribe(ret => this.ngAfterViewInitCallback(ret), err => this.ngAfterViewInitCallback(err)); - } - - - ngAfterViewInitCallback(retour: any): void - { - if(retour.status !== "success") { - console.log(retour); - } - else { - for(let person of retour.data) - { - if(person.role.name === "user") { - person["age"] = this.getAge(person.dateOfBirth); - this.tabUser.push(person); - } - else if(person.role.name === "advertiser") this.tabAdvertiser.push(person); - else this.tabAdmin.push(person); - } - this.onFilter(); - } - } - - - applyFilter(event: Event): void - { - const filterValue = (event.target as HTMLInputElement).value; - this.dataSource.filter = filterValue.trim().toLowerCase(); - } - - - onDelete(user: any): void - { - const config = { - data: { user: user } - }; - this.dialog - .open(PopupDeleteUserComponent, config) - .afterClosed() - .subscribe( retour => { - - const config = { duration: 1000, panelClass: "custom-class" }; - let message = "" ; - if((retour === undefined) || (retour === null)) { - message = "Opération annulée" ; - } - else { - const index = this.dataSource.data.findIndex( elt => (elt.id === user.id)); - this.dataSource.data.splice(index, 1); - this.dataSource.data = this.dataSource.data; - this.dataSource = this.dataSource; - message = user.login + " a bien été supprimée ✔" ; - } - this.snackBar.open(message, "", config); - }); - } - - - onCreateUser(): void - { - const config = { width: '50%' }; - this.dialog - .open(PopupCreateUserComponent, config) - .afterClosed() - .subscribe( retour => { - - const config = { duration: 1000, panelClass: "custom-class" }; - if((retour === null) || (retour === undefined)) { - this.snackBar.open( "Opération annulée", "", config); - } - else { - this.snackBar.open( "L'utilisateur a bien été créé", "", config); - if(retour.role.name === "user") this.tabUser.push(retour); - else if(retour.role.name === "advertiser") this.tabAdvertiser.push(retour); - else if(retour.role.name === "admin") this.tabAdmin.push(retour); - this.onFilter(); - } - }); - } - - - onSliderIsActive(user: any): void - { - // il faut envoyer la négation de user.isActive - this.messageService - .put("user/update/"+user.id, { isActive: !user.isActive }) - .subscribe( - ret => {}, - err => { - console.log("onSliderIsActive"); - console.log(err); - } - ); - } - - - onSlideIsAccepted(user: any): void - { - // il faut envoyer la négation de user.role.isAccepted - const role0 = { - name: user.role.name, - permission: user.role.permission, - isAccepted: !user.role.isAccepted, - }; - this.messageService - .put("user/update/"+user.id, {role: role0}) - .subscribe( - ret => {}, - err => { - console.log("onSlideIsAccepted"); - console.log(err); - } - ); - } - - - getAge(date: Date): number - { - if((date === null) || (date === undefined)) return -1; - else { - const diff = Date.now() - (new Date(date)).getTime(); - const age = new Date(diff); - return Math.abs(age.getUTCFullYear() - 1970); - } - } - - - onFilter(): void - { - let tab1 = []; - if(this.roleName === "user") { - this.displayedColumns = this.displayedColumnsUser; - tab1 = this.tabUser; - } - else if(this.roleName === "advertiser") { - this.displayedColumns = this.displayedColumnsAdvertiser; - tab1 = this.tabAdvertiser; - } - else if(this.roleName === "admin") { - this.displayedColumns = this.displayedColumnsAdmin; - tab1 = this.tabAdmin; - } - - let tab2 = []; - for(let user of tab1) - { - let valide: boolean = true; - - if(user.isActive && this.active) valide = true; - else if((!user.isActive) && this.noActive) valide = true; - else valide = false; - if(valide) - { - if ((user.lastConnexion === null) && (this.startDate !== null)) valide = false; - else if ((user.lastConnexion === null) && (this.endDate !== null)) valide = false; - else if (this.startDate !== null) - { - if(this.startDate.getTime() > user.lastConnexion.getTime()) valide = false; - else if (this.endDate !== null) - { - if(this.endDate.getTime() < user.lastConnexion.getTime()) valide = false; - } - } - } - - if(valide) tab2.push(user); - } - - this.dataSource = new MatTableDataSource(tab2); - this.dataSource.sort = this.sort; - this.dataSource.paginator = this.paginator; - } - - - onNewStartDate(event): void { - this.startDate = new Date(event); - } - - onNewEndDate(event): void { - this.endDate = new Date(event); - } - -} diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.html b/src/app/admin/userList/popup-create-user/popup-create-user.component.html deleted file mode 100644 index dc7ac87..0000000 --- a/src/app/admin/userList/popup-create-user/popup-create-user.component.html +++ /dev/null @@ -1,160 +0,0 @@ -
- - -
- - Utilisateur
- Annonceur
- Admin -
-

- - -
- - -
-
- - -
- - -
- {{errorMessage}} -
- - -
- - -
- -
- - - - - - - - - -
-
- -

- -
- - -
- - - - Email - -
- - - - Pseudo - -
- - - - Mot de passe - -
- - - - Confirmation mot de passe - - - -
- - -
- - - - Date de naissance - -
- - - - Homme     - Femme - -

- - - -
- -
-
- - - - - - - - - - -
-
- -

- - - -
- - -
- - - Email - -
- - - Pseudo - -
- - - Entreprise - -
-
- - -
- - - Mot de passe - -
- - - Confirmation nouveau mot de passe - - -
- -
- - -
diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.scss b/src/app/admin/userList/popup-create-user/popup-create-user.component.scss deleted file mode 100644 index 4c8a0c6..0000000 --- a/src/app/admin/userList/popup-create-user/popup-create-user.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -.myContainer { - font-size: small; -} - -img { - margin: 0px 0px 10px 0px; - width: 10%; - height: 10%; - border: solid 2px black; - border-radius: 50%; - font-size: xxx-large; -} - -.leftCol { - border-right: solid 1px #dcdcdc; -} diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.spec.ts b/src/app/admin/userList/popup-create-user/popup-create-user.component.spec.ts deleted file mode 100644 index 9c57fcc..0000000 --- a/src/app/admin/userList/popup-create-user/popup-create-user.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PopupCreateUserComponent } from './popup-create-user.component'; - -describe('PopupCreateUserComponent', () => { - let component: PopupCreateUserComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PopupCreateUserComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PopupCreateUserComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.ts b/src/app/admin/userList/popup-create-user/popup-create-user.component.ts deleted file mode 100644 index 40ca5cd..0000000 --- a/src/app/admin/userList/popup-create-user/popup-create-user.component.ts +++ /dev/null @@ -1,127 +0,0 @@ -import {Component, Inject, OnInit} from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; - - - -@Component({ - selector: 'app-popup-create-user', - templateUrl: './popup-create-user.component.html', - styleUrls: ['./popup-create-user.component.scss'] -}) -export class PopupCreateUserComponent implements OnInit -{ - user: any; - hasError: boolean = false; - errorMessage: string = ""; - password: string = ""; - confirmPassword: string = ""; - - - constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data, - private messageService: MessageService ) { } - - - // Initialise l'utilisateur qui va être créé - ngOnInit(): void - { - this.user = { - _id: "", - login: "", - hashPass: "", - email: "", - role: { - name: "", - permission: 0, - isAccepted: false, - }, - profileImageUrl: "", - dateOfBirth: null, - gender: "man", - interests: [], - company: "", - isActive: false, - createdAt: new Date(), - updatedAt: new Date(), - lastConnexion: new Date() - }; - } - - - // Crée le nouvel utilisateur - onEnregistrer(): void - { - this.checkField(); - if(!this.hasError) - { - this.user.hashPass = this.password; - this.user.role = this.user.role.name; - this.messageService - .post("user/create", this.user) - .subscribe(ret => this.onEnregistrerCallback(ret), err => this.onEnregistrerCallback(err)); - } - } - - - // Callback de 'onEnregistrer' - onEnregistrerCallback(retour: any): void - { - if(retour.status !== "success") { - console.log(retour); - } - else { - this.dialogRef.close(retour.data); - } - } - - - // Check les champs saisies par l'utilisateur - checkField(): void - { - if(this.user.login.length === 0) { - this.errorMessage = "Veuillez remplir le champ 'pseudo'."; - this.hasError = true; - } - else if(this.user.email.length === 0) { - this.errorMessage = "Veuillez remplir le champ 'email'."; - this.hasError = true; - } - else if(!this.isValidEmail(this.user.email)) { - this.errorMessage = "Email invalide."; - this.hasError = true; - } - else if(this.password.length === 0) { - this.errorMessage = "Veuillez remplir le champ 'mot de passe'."; - this.hasError = true; - } - else if(this.password !== this.confirmPassword) { - this.errorMessage = "Le mot de passe est différent de sa confirmation."; - this.hasError = true; - } - else if((this.user.role.name === 'advertiser') && (this.user.company.length === 0)) { - this.errorMessage = "Veuillez remplir le champ 'entreprise'."; - this.hasError = true; - } - else { - this.errorMessage = "" ; - this.hasError = false; - } - } - - - // Indique si email a bien le format d'un email - isValidEmail(email): boolean - { - let re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(email); - } - - - // Récupère la liste des centres d'intérets (car celle-ci est remplie à l'aide d'un component intermédiaire) - onEventInputInterests(myInterets: string[]): void - { - this.user.interests = myInterets; - } - -} diff --git a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.html b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.html deleted file mode 100644 index 26e3854..0000000 --- a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.html +++ /dev/null @@ -1,8 +0,0 @@ - - Êtes-vous sûr de vouloir supprimer {{user.login}} ? - - - - - - diff --git a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.scss b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.spec.ts b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.spec.ts deleted file mode 100644 index 273cdc6..0000000 --- a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PopupDeleteUserComponent } from './popup-delete-user.component'; - -describe('PopupDeleteUserComponent', () => { - let component: PopupDeleteUserComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PopupDeleteUserComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PopupDeleteUserComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.ts b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.ts deleted file mode 100644 index 35e8d9e..0000000 --- a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import {Component, Inject, OnInit} from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; - - - -@Component({ - selector: 'app-popup-delete-user', - templateUrl: './popup-delete-user.component.html', - styleUrls: ['./popup-delete-user.component.scss'] -}) -export class PopupDeleteUserComponent implements OnInit -{ - user; - - constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data, - private messageService: MessageService ) { } - - ngOnInit(): void - { - this.user = this.data.user; - } - - onValidate(): void - { - // --- FAUX CODE --- - this.dialogRef.close(true); - - // --- VRAI CODE --- - /* - this.messageService - .sendMessage("user/delete", {"advert": this.advert}) - .subscribe( retour => { - - if(retour.status === "error") { - console.log(retour); - this.dialogRef.close(); - } - else { - this.dialogRef.close(true); - } - }); - */ - } - -} diff --git a/src/app/admin/utils/navbar-admin/navbar-admin.component.html b/src/app/admin/utils/navbar-admin/navbar-admin.component.html deleted file mode 100644 index a73059e..0000000 --- a/src/app/admin/utils/navbar-admin/navbar-admin.component.html +++ /dev/null @@ -1,37 +0,0 @@ - diff --git a/src/app/admin/utils/navbar-admin/navbar-admin.component.scss b/src/app/admin/utils/navbar-admin/navbar-admin.component.scss deleted file mode 100644 index 285d629..0000000 --- a/src/app/admin/utils/navbar-admin/navbar-admin.component.scss +++ /dev/null @@ -1,80 +0,0 @@ -.navbar { - background-color: black; - height: 60px; - font-size: medium; - color: white; -} - - -.navbar-expand-lg { - border-bottom: solid; - border-color: white; - border-bottom-width: 2px; -} - - -// PolyNotFound -.navbar-brand { - font-family: cursive; - font-weight: bold; - font-size: x-large; - margin-left: 15px; - color: white; -} - - -.monLi { - margin: 0px 10px 0px 10px; -} - - -.nav-link { - color: white; -} -.nav-link:hover { - color: grey; -} -.myActiveLink { - text-decoration: underline; -} - - -.btnDeconnexion { - font-size: medium; - margin: 0px 10px 0px 10px -} -.btnDeconnexion:hover { - color: grey; -} - - -img { - border: solid 2px white; - border-radius: 50px; - margin: 0px 10px 0px 15px; - width: 40px; - height: 40px; -} -img:hover { - cursor: pointer; -} - - -// -------------------------------------------------------------------- - - -::ng-deep .mat-slide-toggle-thumb { - background-color: #c8c8c8; -} - -::ng-deep .mat-slide-toggle-bar { - background-color: #ffffff; -} - -::ng-deep .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb { - background-color: #ffffff; -} - -::ng-deep .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar { - background-color: #646464; -} diff --git a/src/app/admin/utils/navbar-admin/navbar-admin.component.spec.ts b/src/app/admin/utils/navbar-admin/navbar-admin.component.spec.ts deleted file mode 100644 index 44f2cf6..0000000 --- a/src/app/admin/utils/navbar-admin/navbar-admin.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NavbarAdminComponent } from './navbar-admin.component'; - -describe('NavbarAdminComponent', () => { - let component: NavbarAdminComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ NavbarAdminComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(NavbarAdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/utils/navbar-admin/navbar-admin.component.ts b/src/app/admin/utils/navbar-admin/navbar-admin.component.ts deleted file mode 100644 index 5df617a..0000000 --- a/src/app/admin/utils/navbar-admin/navbar-admin.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import {Component} from '@angular/core'; -import {Router} from "@angular/router"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; -import {MessageService} from "../../../utils/services/message/message.service"; - - - -@Component({ - selector: 'app-navbar-admin', - templateUrl: './navbar-admin.component.html', - styleUrls: ['./navbar-admin.component.scss'] -}) -export class NavbarAdminComponent -{ - routes: string[] = [ - "/admin", // 0 - "/admin/userList", // 1 - "/admin/adList", // 2 - "/admin/myProfil", // 3 - ]; - - url = this.router.url; - - constructor( private router: Router, - public profilService: ProfilService, - private messageService: MessageService ) { } - - onDeconnexion(): void - { - this.messageService - .delete('user/logout') - .subscribe(retour => this.onDeconnexionCallback(retour), err => this.onDeconnexionCallback(err)); - } - - onDeconnexionCallback(retour: any): void - { - if(retour.status !== "success") console.log(retour); - } - -} diff --git a/src/app/advertiser/adList/input-interests-ad/input-interests-ad.component.ts b/src/app/advertiser/adList/input-interests-ad/input-interests-ad.component.ts index 617cc43..7ae81aa 100644 --- a/src/app/advertiser/adList/input-interests-ad/input-interests-ad.component.ts +++ b/src/app/advertiser/adList/input-interests-ad/input-interests-ad.component.ts @@ -5,7 +5,7 @@ import {Observable} from "rxjs"; import {map, startWith} from "rxjs/operators"; import {MatChipInputEvent} from "@angular/material/chips"; import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; -import {MessageService} from "../../../utils/services/message/message.service"; +import {MessageService} from "../../../utils/message/message.service"; diff --git a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html index 78dd263..dd9d1a4 100644 --- a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html +++ b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html @@ -25,7 +25,7 @@
- +
@@ -60,23 +60,24 @@ -
- Période de création:   - - Date de début - - -   -   - - Date de fin - +
+ + Période de date de création + + + + + + + +
@@ -171,9 +172,6 @@ - - Aucune vidéo ne correspond au filtre: "{{input.value}}" -
diff --git a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.scss b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.scss index 370e312..cf2b04d 100644 --- a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.scss +++ b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.scss @@ -50,7 +50,6 @@ td { } input { - width: 30%; font-size: large; border-radius: 5px; } diff --git a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts index 6adf0ed..a71bcc5 100644 --- a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts +++ b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts @@ -1,19 +1,17 @@ import {AfterViewInit, Component, OnInit, ViewChild} from '@angular/core'; import {MatSort} from "@angular/material/sort"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; import {MatTableDataSource} from "@angular/material/table"; -import {AdvertWithCountViews} from "../../../utils/interfaces/advert"; import {MatDialog} from "@angular/material/dialog"; import {PopupAddOrUpdateAdComponent} from "../popup-add-or-update-ad/popup-add-or-update-ad.component"; import {MatSnackBar} from "@angular/material/snack-bar"; import {PopupDeleteAdAdvertiserComponent} from "../popup-delete-ad-advertiser/popup-delete-ad-advertiser.component"; import {MatPaginator} from "@angular/material/paginator"; import {PopupVisualizeImagesAdvertiserComponent} from "../popup-visualize-images-advertiser/popup-visualize-images-advertiser.component"; -import {FictitiousAdvertsService} from "../../../utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service"; -import {FormControl} from "@angular/forms"; -import {FictitiousUtilsService} from "../../../utils/services/fictitiousDatas/fictitiousUtils/fictitious-utils.service"; -import {MessageService} from "../../../utils/services/message/message.service"; +import {FormControl, FormGroup} from "@angular/forms"; import {HttpParams} from "@angular/common/http"; +import {ThemeService} from "../../../utils/theme/theme.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {DatePipe} from "@angular/common"; @@ -25,15 +23,18 @@ import {HttpParams} from "@angular/common/http"; export class PageAdListAdvertiserComponent implements AfterViewInit { displayedColumns: string[] = [ 'isVisible', 'title', 'interests', 'createdAt', 'updatedAt', 'countViews', 'actions' ]; - tabAdvertWithCountViews: AdvertWithCountViews[] = []; + tabAdvertWithCountViews: any[] = []; dataSource; @ViewChild(MatSort) sort: MatSort; @ViewChild(MatPaginator) paginator: MatPaginator; visible: boolean = true; noVisible: boolean = true; - startDate: Date = null; - endDate: Date = null; + filteredText: string = "" ; + campaignOne = new FormGroup({ + start: new FormControl(null), + end: new FormControl(null), + }); formControlInterests = new FormControl(); allVideoCategorie = []; @@ -41,8 +42,6 @@ export class PageAdListAdvertiserComponent implements AfterViewInit constructor( public themeService: ThemeService, - private fictitiousAdvertsService: FictitiousAdvertsService, - private fictitiousUtilsService: FictitiousUtilsService, public dialog: MatDialog, private snackBar: MatSnackBar, private messageService: MessageService ) { } @@ -87,21 +86,14 @@ export class PageAdListAdvertiserComponent implements AfterViewInit if(retour.data.length !== 0) { for(let advert of retour.data) this.tabAdvertWithCountViews.push(this.advertToAdvertWithCountViews(advert)); - this.dataSource = new MatTableDataSource(); + this.dataSource = new MatTableDataSource(); this.onFilter(); } } } - applyFilter(event: Event): void - { - const filterValue = (event.target as HTMLInputElement).value; - this.dataSource.filter = filterValue.trim().toLowerCase(); - } - - - onVisualizeImages(advert: AdvertWithCountViews) + onVisualizeImages(advert: any) { if(advert.images.length !== 0) { @@ -156,7 +148,7 @@ export class PageAdListAdvertiserComponent implements AfterViewInit } - onUpdate(advertToUpdate: AdvertWithCountViews): void + onUpdate(advertToUpdate: any): void { const config = { width: '75%', @@ -190,7 +182,7 @@ export class PageAdListAdvertiserComponent implements AfterViewInit } - onDelete(advert: AdvertWithCountViews): void + onDelete(advert: any): void { const config = { data: { advert: advert } @@ -219,30 +211,43 @@ export class PageAdListAdvertiserComponent implements AfterViewInit onFilter(): void { + const startDate = this.campaignOne.get("start").value; + const endDate = this.campaignOne.get("end").value; + if(this.dataSource === null || this.dataSource === undefined) this.dataSource = new MatTableDataSource(); this.dataSource.data = []; for(let advert of this.tabAdvertWithCountViews) { - let valide: boolean = true; - - if(advert.isVisible && this.visible) valide = true; - else if((!advert.isVisible) && this.noVisible) valide = true; - else valide = false; + // filtre textuelle + let valide: boolean = this.isTextFiltrationValid(advert); + // filtre visible if(valide) { - if ((advert.createdAt === null) && (this.startDate !== null)) valide = false; - else if ((advert.createdAt === null) && (this.endDate !== null)) valide = false; - else if (this.startDate !== null) + if(advert.isVisible && this.visible) valide = true; + else if((!advert.isVisible) && this.noVisible) valide = true; + else valide = false; + } + + // filtre date + if(valide) + { + if ((advert.createdAt === null) && (startDate !== null)) valide = false; + else if ((advert.createdAt === null) && (endDate !== null)) valide = false; + else if (startDate !== null) { - if(this.startDate.getTime() > advert.createdAt.getTime()) valide = false; - else if (this.endDate !== null) + let timeCreatedAt = 0; + if(advert.createdAt !== null) timeCreatedAt = (new Date(advert.createdAt)).getTime(); + + if(startDate.getTime() > timeCreatedAt) valide = false; + else if (endDate !== null) { - if(this.endDate.getTime() < advert.createdAt.getTime()) valide = false; + if(endDate.getTime() < timeCreatedAt) valide = false; } } } + // filtre interests if(valide) { if(this.formControlInterests.value !== null) { for (let interest of this.formControlInterests.value) { @@ -263,12 +268,16 @@ export class PageAdListAdvertiserComponent implements AfterViewInit } - onNewStartDate(event): void { - this.startDate = new Date(event); - } - - onNewEndDate(event): void { - this.endDate = new Date(event); + isTextFiltrationValid(advert): boolean + { + let datePipe = new DatePipe('en-GB'); + if(advert.title.includes(this.filteredText)) return true; + const createdAt = datePipe.transform(new Date(advert.createdAt), 'dd/MM/yyyy à HH:mm:ss'); + if(createdAt.includes(this.filteredText)) return true; + const updatedAt = datePipe.transform(new Date(advert.updatedAt), 'dd/MM/yyyy à HH:mm:ss'); + if(updatedAt.includes(this.filteredText)) return true; + if(advert.countViews.toString().includes(this.filteredText)) return true; + return false; } @@ -287,7 +296,7 @@ export class PageAdListAdvertiserComponent implements AfterViewInit } - advertToAdvertWithCountViews(advert): AdvertWithCountViews + advertToAdvertWithCountViews(advert) { return { id: advert.id, @@ -306,4 +315,10 @@ export class PageAdListAdvertiserComponent implements AfterViewInit } } + + onEffacerDate(): void { + this.campaignOne.setValue({start: null, end: null }); + this.onFilter(); + } + } diff --git a/src/app/advertiser/adList/popup-add-or-update-ad/popup-add-or-update-ad.component.ts b/src/app/advertiser/adList/popup-add-or-update-ad/popup-add-or-update-ad.component.ts index 32831f9..e927f68 100644 --- a/src/app/advertiser/adList/popup-add-or-update-ad/popup-add-or-update-ad.component.ts +++ b/src/app/advertiser/adList/popup-add-or-update-ad/popup-add-or-update-ad.component.ts @@ -1,13 +1,12 @@ import {Component, Inject, OnInit} from '@angular/core'; -import {Advert} from "../../../utils/interfaces/advert"; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; -const ADVERT_VIDE: Advert = { +const ADVERT_VIDE = { _id: "", userId: "", title: "", diff --git a/src/app/advertiser/adList/popup-delete-ad-advertiser/popup-delete-ad-advertiser.component.ts b/src/app/advertiser/adList/popup-delete-ad-advertiser/popup-delete-ad-advertiser.component.ts index 1de96ef..c137557 100644 --- a/src/app/advertiser/adList/popup-delete-ad-advertiser/popup-delete-ad-advertiser.component.ts +++ b/src/app/advertiser/adList/popup-delete-ad-advertiser/popup-delete-ad-advertiser.component.ts @@ -1,6 +1,6 @@ import {Component, Inject, OnInit} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; +import {MessageService} from "../../../utils/message/message.service"; diff --git a/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts b/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts index 1e65834..80f5e09 100644 --- a/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts +++ b/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts @@ -1,7 +1,6 @@ import {Component, Inject, OnInit} from '@angular/core'; -import {ThemeService} from "../../../utils/services/theme/theme.service"; import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from "@angular/material/dialog"; -import {Advert} from "../../../utils/interfaces/advert"; +import {ThemeService} from "../../../utils/theme/theme.service"; @@ -12,7 +11,7 @@ import {Advert} from "../../../utils/interfaces/advert"; }) export class PopupVisualizeAdAdvertiserComponent implements OnInit { - advert: Advert; + advert: any; constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data, diff --git a/src/app/advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component.ts b/src/app/advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component.ts index de60d59..ee16328 100644 --- a/src/app/advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component.ts +++ b/src/app/advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component.ts @@ -1,11 +1,10 @@ import { Component, OnInit } from '@angular/core'; -import {User} from "../../../utils/interfaces/user"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; import {MatDialog} from "@angular/material/dialog"; import {MatSnackBar} from "@angular/material/snack-bar"; import {PopupUpdateAdvertiserComponent} from "../popup-update-advertiser/popup-update-advertiser.component"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {ProfilService} from "../../../utils/profil/profil.service"; @@ -16,7 +15,7 @@ import {ProfilService} from "../../../utils/services/profil/profil.service"; }) export class PageProfilAdvertiserComponent implements OnInit { - advertiser: User = { + advertiser = { _id: "", login: "", hashPass: "", diff --git a/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts b/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts index 8d4de8a..b93fdef 100644 --- a/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts +++ b/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts @@ -1,8 +1,7 @@ import {Component, Inject, OnInit} from '@angular/core'; -import {User} from "../../../utils/interfaces/user"; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {ProfilService} from "../../../utils/profil/profil.service"; @@ -13,7 +12,7 @@ import {ProfilService} from "../../../utils/services/profil/profil.service"; }) export class PopupUpdateAdvertiserComponent implements OnInit { - advertiserCopy: User; + advertiserCopy; newPassword: string = ""; confirmNewPassword: string = "" ; changePassword: boolean = false ; diff --git a/src/app/advertiser/pages-popularity/pages-popularity.component.html b/src/app/advertiser/pages-popularity/pages-popularity.component.html index 62ae0e1..6792d30 100644 --- a/src/app/advertiser/pages-popularity/pages-popularity.component.html +++ b/src/app/advertiser/pages-popularity/pages-popularity.component.html @@ -48,23 +48,23 @@ - - début - - -   -   - - - - fin - + + Période de date de création + + + + + +   -   pas d'affichage - +   -   diff --git a/src/app/advertiser/pages-popularity/pages-popularity.component.ts b/src/app/advertiser/pages-popularity/pages-popularity.component.ts index 991b8fa..66007ee 100644 --- a/src/app/advertiser/pages-popularity/pages-popularity.component.ts +++ b/src/app/advertiser/pages-popularity/pages-popularity.component.ts @@ -1,13 +1,11 @@ import { Component, OnInit } from '@angular/core'; -import {FormControl} from "@angular/forms"; +import {FormControl, FormGroup} from "@angular/forms"; import {ChartDataSets} from "chart.js"; import {Label} from "ng2-charts"; import { Router} from "@angular/router"; -import {FictitiousAdvertsService} from "../../utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service"; -import {FictitiousVideosService} from "../../utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service"; -import {ThemeService} from "../../utils/services/theme/theme.service"; -import {MessageService} from "../../utils/services/message/message.service"; import {HttpParams} from "@angular/common/http"; +import {ThemeService} from "../../utils/theme/theme.service"; +import {MessageService} from "../../utils/message/message.service"; @@ -30,13 +28,16 @@ export class PagesPopularityComponent implements OnInit allInterests: string[] = []; - startDate: Date = null; - endDate: Date = null; + oneDay: number = 24*60*60*1000; + oneWeek: number = 7*24*60*60*1000; + + campaignOne = new FormGroup({ + start: new FormControl(new Date(((new Date()).getTime() - this.oneWeek))), + end: new FormControl(new Date()), + }); step: number = 1; stepUnity: string = "jour" ; - oneDay: number = 24*60*60*1000; - oneWeek: number = 7*24*60*60*1000; lineChartData: ChartDataSets[] = []; lineChartLabels: Label[] = []; @@ -53,8 +54,6 @@ export class PagesPopularityComponent implements OnInit constructor( private router: Router, public themeService: ThemeService, - private fictitiousAdvertsService: FictitiousAdvertsService, - private fictitiousVideosService: FictitiousVideosService, private messageService: MessageService ) {} @@ -63,6 +62,18 @@ export class PagesPopularityComponent implements OnInit ngOnInit(): void { + // Initialisation de campaignOne + let today00h00Date = new Date(); + today00h00Date.setHours(0); + today00h00Date.setMinutes(0); + today00h00Date.setSeconds(0); + today00h00Date.setMilliseconds(0); + this.campaignOne = new FormGroup({ + start: new FormControl(new Date(today00h00Date.getTime() - this.oneWeek)), + end: new FormControl(today00h00Date), + }); + + // Sera excuté si on est sur la page 'adsPopularity' // Remplie l'attribut 'allCoupleNameViews' if(this.router.url.includes("ads")) @@ -74,6 +85,7 @@ export class PagesPopularityComponent implements OnInit .subscribe(ret => this.afterReceivingAds(ret), err => this.afterReceivingAds(err)); } + // Sera excuté si on est sur la page 'subjectsPopularity' // Remplie l'attribut 'allCoupleNameViews' else if(this.router.url.includes("subjects")) @@ -87,7 +99,6 @@ export class PagesPopularityComponent implements OnInit } else { this.allInterests = retour.data.map(x => x.interest); - this.allInterests.sort(); this.messageService .get("video/findAll") .subscribe(ret => this.afterReceivingVideos(ret), err => this.afterReceivingVideos(err)); @@ -168,18 +179,20 @@ export class PagesPopularityComponent implements OnInit this.lineChartData = []; this.lineChartLabels = []; - if(this.step <= 0) this.step = 0; - if((this.endDate === null) || (this.endDate === undefined)) this.endDate = new Date(); - if((this.startDate === null) || (this.startDate === undefined)) this.startDate = new Date(this.endDate.getTime() - this.oneWeek); // date d'il y a une semaine + let startDate = this.campaignOne.get("start").value; + let endDate = this.campaignOne.get("end").value; + if(this.step <= 0) this.step = 1; + if((endDate === null) || (endDate === undefined)) endDate = new Date(); + if((startDate === null) || (startDate === undefined)) startDate = new Date(endDate.getTime() - this.oneWeek); // date d'il y a une semaine - const startTime = this.startDate.getTime(); - const endTime = this.endDate.getTime(); + const startTime = startDate.getTime(); + const endTime = endDate.getTime(); // --- remplissage de 'lineChartLabels' --- let dataWithZeros = []; let time = startTime; - const intervals = []; + let intervals = []; while(time <= endTime) { dataWithZeros.push(0); @@ -190,7 +203,7 @@ export class PagesPopularityComponent implements OnInit intervals.push(time); - // --- remplissage de 'lineChartLabels' --- + // --- remplissage de 'lineChartData' --- for(let coupleNameViews of this.formControl.value) { let data = dataWithZeros.slice(); @@ -201,11 +214,14 @@ export class PagesPopularityComponent implements OnInit { const time0 = (new Date(date0)).getTime(); - if(time0 > endTime) break; + if(time0 > (endTime+this.oneDay)) break; - if((startTime <= time0) && (time0 <= endTime)) + if((startTime <= time0) && (time0 <= (endTime+this.oneDay))) { while((index < intervals.length) && (time0 >= intervals[index])) index += 1; + console.log("index:" + index); + //console.log("index < intervals.length : " + (index < intervals.length)); + //console.log("time0 >= intervals[index] : " + (time0 >= intervals[index])); index = index - 1; data[index] += 1; } @@ -214,16 +230,7 @@ export class PagesPopularityComponent implements OnInit this.lineChartData.push({"data": data.slice(), "label": label}); } this.isDisplayable = true; - } - - - onNewStartDate(event): void { - this.startDate = new Date(event); - } - - - onNewEndDate(event): void { - this.endDate = new Date(event); + console.log(this.lineChartLabels); } @@ -260,12 +267,13 @@ export class PagesPopularityComponent implements OnInit let newMonth = oldDate.getMonth() + this.step; const newYear = oldDate.getFullYear() + (newMonth / 12); newMonth = newMonth % 12; - const day = this.startDate.getDate(); + const startDate = this.campaignOne.get("start").value; + const day = startDate.getDate(); if((newMonth === 1) && ([29, 30, 31].includes(day))) { // si fevrier et si jour n'existe pas newDate = new Date(newYear, newMonth, 28); } - else if((day === 31) && ([3, 5, 9, 10].includes(newMonth))) { // si 31 et mois à 30 jours + else if((day === 31) && ([3, 5, 8, 10].includes(newMonth))) { // si 31 et mois à 30 jours newDate = new Date(newYear, newMonth, 30); } else { diff --git a/src/app/advertiser/utils/navbar-advertiser/navbar-advertiser.component.ts b/src/app/advertiser/utils/navbar-advertiser/navbar-advertiser.component.ts index 7f403db..a2cf5d4 100644 --- a/src/app/advertiser/utils/navbar-advertiser/navbar-advertiser.component.ts +++ b/src/app/advertiser/utils/navbar-advertiser/navbar-advertiser.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import {Router} from "@angular/router"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; -import {MessageService} from "../../../utils/services/message/message.service"; +import {ProfilService} from "../../../utils/profil/profil.service"; +import {MessageService} from "../../../utils/message/message.service"; @@ -36,6 +36,7 @@ export class NavbarAdvertiserComponent onDeconnexionCallback(retour: any): void { if(retour.status !== "success") console.log(retour); + this.profilService.setRole(""); } } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index df9fee2..bb73ad4 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,51 +1,41 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import {PageLoginComponent} from './beforeConnexion/login/page-login/page-login.component'; +import {PageLoginComponent} from "./beforeConnexion/login/page-login/page-login.component"; import {PageRegisterComponent} from "./beforeConnexion/register/page-register/page-register.component"; import {PageSearchComponent} from "./user/search/page-search/page-search.component"; import {PageMyPlaylistsComponent} from "./user/myPlaylists/page-my-playlists/page-my-playlists.component"; +import {PageProfilUserComponent} from "./user/myProfil/page-profil-user/page-profil-user.component"; +import {PageWatchingVideoComponent} from "./user/watching/page-watching-video/page-watching-video.component"; import {PageHistoryUserComponent} from "./user/history/page-history-user/page-history-user.component"; import {PageAdListAdvertiserComponent} from "./advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component"; -import {PageProfilUserComponent} from "./user/myProfil/page-profil-user/page-profil-user.component"; -import {PageProfilAdvertiserComponent} from "./advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component"; -import {PageProfilAdminComponent} from "./admin/myProfil/page-profil-admin/page-profil-admin.component"; -import {PageAdListAdminComponent} from "./admin/adList/page-ad-list-admin/page-ad-list-admin.component"; -import {PageUserListComponent} from "./admin/userList/page-user-list/page-user-list.component"; -import {PageWatchingVideoComponent} from "./user/watching/page-watching-video/page-watching-video.component"; import {PagesPopularityComponent} from "./advertiser/pages-popularity/pages-popularity.component"; +import {PageProfilAdvertiserComponent} from "./advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component"; +import {UserGuard} from "./utils/guards/user/user.guard"; +import {AdvertiserGuard} from "./utils/guards/advertiser/advertiser.guard"; const routes: Routes = [ - // Before connexion { path: '', component: PageLoginComponent }, { path: 'login', component: PageLoginComponent }, { path: 'register', component: PageRegisterComponent }, // User - { path: 'user', component: PageSearchComponent }, - { path: 'user/search', component: PageSearchComponent }, - { path: 'user/myPlaylists', component: PageMyPlaylistsComponent }, - { path: 'user/history', component: PageHistoryUserComponent }, - { path: 'user/myProfil', component: PageProfilUserComponent }, - { path: 'user/watching', component: PageWatchingVideoComponent }, + { path: 'user', component: PageSearchComponent, canActivate: [UserGuard] }, + { path: 'user/search', component: PageSearchComponent, canActivate: [UserGuard] }, + { path: 'user/myPlaylists', component: PageMyPlaylistsComponent, canActivate: [UserGuard] }, + { path: 'user/history', component: PageHistoryUserComponent, canActivate: [UserGuard] }, + { path: 'user/myProfil', component: PageProfilUserComponent, canActivate: [UserGuard] }, + { path: 'user/watching', component: PageWatchingVideoComponent, canActivate: [UserGuard] }, // Advertiser - { path: 'advertiser', component: PageAdListAdvertiserComponent }, - { path: 'advertiser/adList', component: PageAdListAdvertiserComponent }, - { path: 'advertiser/myProfil', component: PageProfilAdvertiserComponent }, - { path: 'advertiser/adsPopularity', component: PagesPopularityComponent }, - { path: 'advertiser/subjectsPopularity', component: PagesPopularityComponent }, - - // Admin - { path: 'admin', component: PageUserListComponent }, - { path: 'admin/userList', component: PageUserListComponent }, - { path: 'admin/adList', component: PageAdListAdminComponent }, - { path: 'admin/myProfil', component: PageProfilAdminComponent }, - + { path: 'advertiser', component: PageAdListAdvertiserComponent, canActivate: [AdvertiserGuard] }, + { path: 'advertiser/adList', component: PageAdListAdvertiserComponent, canActivate: [AdvertiserGuard] }, + { path: 'advertiser/myProfil', component: PageProfilAdvertiserComponent, canActivate: [AdvertiserGuard] }, + { path: 'advertiser/adsPopularity', component: PagesPopularityComponent, canActivate: [AdvertiserGuard] }, + { path: 'advertiser/subjectsPopularity', component: PagesPopularityComponent, canActivate: [AdvertiserGuard] }, ]; - @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] diff --git a/src/app/app.component.html b/src/app/app.component.html index 0680b43..d5d92f3 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1 +1,2 @@ + diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 04c26ec..ab837bf 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -20,16 +20,16 @@ describe('AppComponent', () => { expect(app).toBeTruthy(); }); - it(`should have as title 'frontend'`, () => { + it(`should have as title 'userAndAdvertiser'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('frontend'); + expect(app.title).toEqual('userAndAdvertiser'); }); it('should render title', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); - const compiled = fixture.nativeElement; - expect(compiled.querySelector('.content span').textContent).toContain('frontend app is running!'); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('.content span')?.textContent).toContain('userAndAdvertiser app is running!'); }); }); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 2cc7859..945afdf 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -6,7 +6,5 @@ import { Component } from '@angular/core'; styleUrls: ['./app.component.scss'] }) export class AppComponent { - title = 'frontend'; - - themeIsLight = true; + title = 'userAndAdvertiser'; } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 133f928..3455b4f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -3,124 +3,101 @@ import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; -import { PageLoginComponent } from './beforeConnexion/login/page-login/page-login.component'; -import { PageRegisterComponent } from './beforeConnexion/register/page-register/page-register.component'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {MatSlideToggleModule} from '@angular/material/slide-toggle'; +import {BrowserAnimationsModule} from "@angular/platform-browser/animations"; +import {MatSlideToggleModule} from "@angular/material/slide-toggle"; import {FormsModule, ReactiveFormsModule} from "@angular/forms"; -import { PageSearchComponent } from './user/search/page-search/page-search.component'; import {HttpClientModule} from "@angular/common/http"; -import { PopupConfirmationComponent } from './beforeConnexion/register/popup-confirmation/popup-confirmation.component'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatButtonModule} from "@angular/material/button"; -import { AdvertComponent } from './user/utils/components/advert/advert.component'; -import { VideoGridComponent } from './user/search/video-grid/video-grid.component'; import {MatIconModule} from "@angular/material/icon"; -import { PopupAddVideoToPlaylistsComponent } from './user/utils/components/popup-add-video-to-playlists/popup-add-video-to-playlists.component'; +import {MatDialogModule} from "@angular/material/dialog"; +import {MatButtonModule} from "@angular/material/button"; import {MatInputModule} from "@angular/material/input"; -import {MatDividerModule} from "@angular/material/divider"; import {MatCheckboxModule} from "@angular/material/checkbox"; import {MatFormFieldModule} from "@angular/material/form-field"; +import {MatDividerModule} from "@angular/material/divider"; import {MatSnackBarModule} from "@angular/material/snack-bar"; import {MatGridListModule} from "@angular/material/grid-list"; -import { PageMyPlaylistsComponent } from './user/myPlaylists/page-my-playlists/page-my-playlists.component'; -import { PlaylistListComponent } from './user/myPlaylists/playlist-list/playlist-list.component'; -import {VideoListComponent} from "./user/myPlaylists/video-list/video-list.component"; -import { PopupCreateOrUpdatePlaylistComponent } from './user/myPlaylists/popup-create-or-update-playlist/popup-create-or-update-playlist.component'; -import { PageHistoryUserComponent } from './user/history/page-history-user/page-history-user.component'; -import {MatTableModule} from '@angular/material/table'; -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import {MatTableModule} from "@angular/material/table"; import {MatSortModule} from "@angular/material/sort"; -import { PageAdListAdvertiserComponent } from './advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component'; -import { PopupDeleteAdAdvertiserComponent } from './advertiser/adList/popup-delete-ad-advertiser/popup-delete-ad-advertiser.component'; -import { PopupAddOrUpdateAdComponent } from './advertiser/adList/popup-add-or-update-ad/popup-add-or-update-ad.component'; -import { PopupVisualizeAdAdvertiserComponent } from './advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component'; -import { InputInterestsAdComponent } from './advertiser/adList/input-interests-ad/input-interests-ad.component'; import {MatChipsModule} from "@angular/material/chips"; -import {MatAutocompleteModule} from "@angular/material/autocomplete"; import {MatSelectModule} from "@angular/material/select"; -import { PopupVisualizeImagesAdvertiserComponent } from './advertiser/adList/popup-visualize-images-advertiser/popup-visualize-images-advertiser.component'; -import {IvyCarouselModule} from "angular-responsive-carousel"; -import { DragAndDropComponent } from './advertiser/adList/drag-and-drop/drag-and-drop.component'; -import { DragAndDropDirective } from './advertiser/utils/dragAndDrop/drag-and-drop.directive'; -import { PageProfilUserComponent } from './user/myProfil/page-profil-user/page-profil-user.component'; -import { NavbarUserComponent } from './user/utils/components/navbar-user/navbar-user.component'; -import { NavbarAdvertiserComponent } from './advertiser/utils/navbar-advertiser/navbar-advertiser.component'; -import { NavbarAdminComponent } from './admin/utils/navbar-admin/navbar-admin.component'; -import { PageProfilAdvertiserComponent } from './advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component'; -import { PopupUpdateAdvertiserComponent } from './advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component'; -import { PopupUpdateUserComponent } from './user/myProfil/popup-update-user/popup-update-user.component'; -import { NavbarBeforeConnexionComponent } from './beforeConnexion/utils/navbar-before-connexion/navbar-before-connexion.component'; +import {MatAutocompleteModule} from "@angular/material/autocomplete"; import {MatRadioModule} from "@angular/material/radio"; -import { InputInterestsProfilComponent } from './user/myProfil/input-interests-profil/input-interests-profil.component'; -import { PageProfilAdminComponent } from './admin/myProfil/page-profil-admin/page-profil-admin.component'; -import { PopupUpdateAdminComponent } from './admin/myProfil/popup-update-admin/popup-update-admin.component'; -import {MatStepperModule} from "@angular/material/stepper"; -import { InputInterestsRegisterComponent } from './beforeConnexion/register/input-interests-register/input-interests-register.component'; import {MatPaginatorModule} from "@angular/material/paginator"; -import { PageAdListAdminComponent } from './admin/adList/page-ad-list-admin/page-ad-list-admin.component'; -import { PopupDeleteAdAdminComponent } from './admin/adList/popup-delete-ad-admin/popup-delete-ad-admin.component'; -import { PopupVisualizeImagesAdminComponent } from './admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component'; -import { PageUserListComponent } from './admin/userList/page-user-list/page-user-list.component'; -import { PopupDeleteUserComponent } from './admin/userList/popup-delete-user/popup-delete-user.component'; -import { PopupCreateUserComponent } from './admin/userList/popup-create-user/popup-create-user.component'; -import { InputInterestsAdminComponent } from './admin/userList/input-interests-admin/input-interests-admin.component'; -import { PageWatchingVideoComponent } from './user/watching/page-watching-video/page-watching-video.component'; import {MatDatepickerModule} from "@angular/material/datepicker"; -import { PagesPopularityComponent } from './advertiser/pages-popularity/pages-popularity.component'; import { ChartsModule } from 'ng2-charts'; -import { PopupDeletePlaylistComponent } from './user/myPlaylists/popup-delete-playlist/popup-delete-playlist.component'; -import { PopupForgottenPasswordComponent } from './beforeConnexion/login/popup-forgotten-password/popup-forgotten-password.component'; - +import {DragAndDropComponent} from "./advertiser/adList/drag-and-drop/drag-and-drop.component"; +import {InputInterestsAdComponent} from "./advertiser/adList/input-interests-ad/input-interests-ad.component"; +import {PageAdListAdvertiserComponent} from "./advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component"; +import {PopupAddOrUpdateAdComponent} from "./advertiser/adList/popup-add-or-update-ad/popup-add-or-update-ad.component"; +import {PopupDeleteAdAdvertiserComponent} from "./advertiser/adList/popup-delete-ad-advertiser/popup-delete-ad-advertiser.component"; +import {PopupVisualizeAdAdvertiserComponent} from "./advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component"; +import {PopupVisualizeImagesAdvertiserComponent} from "./advertiser/adList/popup-visualize-images-advertiser/popup-visualize-images-advertiser.component"; +import {NavbarAdvertiserComponent} from "./advertiser/utils/navbar-advertiser/navbar-advertiser.component"; +import {DragAndDropDirective} from "./advertiser/utils/dragAndDrop/drag-and-drop.directive"; +import {PageProfilAdvertiserComponent} from "./advertiser/myProfil/page-profil-advertiser/page-profil-advertiser.component"; +import {PopupUpdateAdvertiserComponent} from "./advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component"; +import {PagesPopularityComponent} from "./advertiser/pages-popularity/pages-popularity.component"; +import {NavbarUserComponent} from "./user/utils/components/navbar-user/navbar-user.component"; +import {PageHistoryUserComponent} from "./user/history/page-history-user/page-history-user.component"; +import {PageMyPlaylistsComponent} from "./user/myPlaylists/page-my-playlists/page-my-playlists.component"; +import {PlaylistListComponent} from "./user/myPlaylists/playlist-list/playlist-list.component"; +import {PopupCreateOrUpdatePlaylistComponent} from "./user/myPlaylists/popup-create-or-update-playlist/popup-create-or-update-playlist.component"; +import {PopupDeletePlaylistComponent} from "./user/myPlaylists/popup-delete-playlist/popup-delete-playlist.component"; +import {VideoListComponent} from "./user/myPlaylists/video-list/video-list.component"; +import {InputInterestsProfilComponent} from "./user/myProfil/input-interests-profil/input-interests-profil.component"; +import {PageProfilUserComponent} from "./user/myProfil/page-profil-user/page-profil-user.component"; +import {PopupUpdateUserComponent} from "./user/myProfil/popup-update-user/popup-update-user.component"; +import {PageSearchComponent} from "./user/search/page-search/page-search.component"; +import {VideoGridComponent} from "./user/search/video-grid/video-grid.component"; +import {PageWatchingVideoComponent} from "./user/watching/page-watching-video/page-watching-video.component"; +import {AdvertComponent} from "./user/utils/components/advert/advert.component"; +import {PopupAddVideoToPlaylistsComponent} from "./user/utils/components/popup-add-video-to-playlists/popup-add-video-to-playlists.component"; +import {PageLoginComponent} from "./beforeConnexion/login/page-login/page-login.component"; +import {PopupForgottenPasswordComponent} from "./beforeConnexion/login/popup-forgotten-password/popup-forgotten-password.component"; +import {InputInterestsRegisterComponent} from "./beforeConnexion/register/input-interests-register/input-interests-register.component"; +import {PageRegisterComponent} from "./beforeConnexion/register/page-register/page-register.component"; +import {PopupConfirmationComponent} from "./beforeConnexion/register/popup-confirmation/popup-confirmation.component"; +import {NavbarBeforeConnexionComponent} from "./beforeConnexion/utils/navbar-before-connexion/navbar-before-connexion.component"; +import {MatStepperModule} from "@angular/material/stepper"; +import {MAT_DATE_LOCALE, MatNativeDateModule} from "@angular/material/core"; @NgModule({ - declarations: [ - AppComponent, - PageLoginComponent, - PageRegisterComponent, - PageSearchComponent, - PopupConfirmationComponent, - AdvertComponent, - VideoGridComponent, - PopupAddVideoToPlaylistsComponent, - PageMyPlaylistsComponent, - VideoListComponent, - PlaylistListComponent, - VideoListComponent, - PopupCreateOrUpdatePlaylistComponent, - PageHistoryUserComponent, - PageAdListAdvertiserComponent, - PopupDeleteAdAdvertiserComponent, - PopupAddOrUpdateAdComponent, - PopupVisualizeAdAdvertiserComponent, - InputInterestsAdComponent, - PopupVisualizeImagesAdvertiserComponent, - DragAndDropComponent, - DragAndDropDirective, - PageProfilUserComponent, - NavbarUserComponent, - NavbarAdvertiserComponent, - NavbarAdminComponent, - PageProfilAdvertiserComponent, - PopupUpdateAdvertiserComponent, - PopupUpdateUserComponent, - NavbarBeforeConnexionComponent, - InputInterestsProfilComponent, - PageProfilAdminComponent, - PopupUpdateAdminComponent, - InputInterestsRegisterComponent, - PageAdListAdminComponent, - PopupDeleteAdAdminComponent, - PopupVisualizeImagesAdminComponent, - PageUserListComponent, - PopupDeleteUserComponent, - PopupCreateUserComponent, - InputInterestsAdminComponent, - PageWatchingVideoComponent, - PagesPopularityComponent, - PopupDeletePlaylistComponent, - PopupForgottenPasswordComponent, - ], + declarations: [ + AppComponent, + DragAndDropDirective, + NavbarBeforeConnexionComponent, + PageLoginComponent, + PopupForgottenPasswordComponent, + InputInterestsRegisterComponent, + PageRegisterComponent, + PopupConfirmationComponent, + NavbarAdvertiserComponent, + DragAndDropComponent, + InputInterestsAdComponent, + PageAdListAdvertiserComponent, + PopupAddOrUpdateAdComponent, + PopupDeleteAdAdvertiserComponent, + PopupVisualizeAdAdvertiserComponent, + PopupVisualizeImagesAdvertiserComponent, + PageProfilAdvertiserComponent, + PopupUpdateAdvertiserComponent, + PagesPopularityComponent, + NavbarUserComponent, + PageHistoryUserComponent, + PageMyPlaylistsComponent, + PlaylistListComponent, + PopupCreateOrUpdatePlaylistComponent, + PopupDeletePlaylistComponent, + VideoListComponent, + InputInterestsProfilComponent, + PageProfilUserComponent, + PopupUpdateUserComponent, + PageSearchComponent, + VideoGridComponent, + PageWatchingVideoComponent, + AdvertComponent, + PopupAddVideoToPlaylistsComponent + ], imports: [ BrowserModule, AppRoutingModule, @@ -138,20 +115,19 @@ import { PopupForgottenPasswordComponent } from './beforeConnexion/login/popup-f MatSnackBarModule, MatGridListModule, MatTableModule, - NgbModule, MatSortModule, MatChipsModule, ReactiveFormsModule, MatAutocompleteModule, MatSelectModule, - IvyCarouselModule, MatRadioModule, - MatStepperModule, MatPaginatorModule, MatDatepickerModule, - ChartsModule + ChartsModule, + MatStepperModule, + MatNativeDateModule ], - providers: [], + providers: [{ provide: MAT_DATE_LOCALE, useValue: 'en-GB' }], bootstrap: [AppComponent] }) export class AppModule { } diff --git a/src/app/beforeConnexion/login/page-login/page-login.component.spec.ts b/src/app/beforeConnexion/login/page-login/page-login.component.spec.ts index 5cb4241..a4ee677 100644 --- a/src/app/beforeConnexion/login/page-login/page-login.component.spec.ts +++ b/src/app/beforeConnexion/login/page-login/page-login.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PageLoginComponent } from './page-login.component'; -describe('PageConnexionComponent', () => { +describe('PageLoginComponent', () => { let component: PageLoginComponent; let fixture: ComponentFixture; diff --git a/src/app/beforeConnexion/login/page-login/page-login.component.ts b/src/app/beforeConnexion/login/page-login/page-login.component.ts index 6ee3e78..0764280 100644 --- a/src/app/beforeConnexion/login/page-login/page-login.component.ts +++ b/src/app/beforeConnexion/login/page-login/page-login.component.ts @@ -1,18 +1,18 @@ import {Component, OnInit} from '@angular/core'; -import {MessageService} from "../../../utils/services/message/message.service"; import {Router} from "@angular/router"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; import {MatDialog} from "@angular/material/dialog"; import {PopupForgottenPasswordComponent} from "../popup-forgotten-password/popup-forgotten-password.component"; import {MatSnackBar} from "@angular/material/snack-bar"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; +import {ProfilService} from "../../../utils/profil/profil.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; @Component({ - selector: 'app-page-login', - templateUrl: './page-login.component.html', - styleUrls: ['./page-login.component.scss'] + selector: 'app-page-login', + templateUrl: './page-login.component.html', + styleUrls: ['./page-login.component.scss'] }) export class PageLoginComponent implements OnInit { @@ -33,8 +33,8 @@ export class PageLoginComponent implements OnInit ngOnInit(): void {} - onSeConnecter(): void - { + onSeConnecter(): void + { this.checkError(); if(!this.hasError) @@ -47,10 +47,10 @@ export class PageLoginComponent implements OnInit .post('user/auth', data) .subscribe( retour => this.onSeConnecterCallback(retour), err => this.onSeConnecterCallback(err)); } - } + } - onSeConnecterCallback(retour): void + onSeConnecterCallback(retour: any): void { if(retour.status !== "success") { console.log(retour); @@ -60,9 +60,15 @@ export class PageLoginComponent implements OnInit else { this.profilService.setId(retour.data.id); this.profilService.setProfileImageUrl(retour.data.profileImageUrl); - if(retour.data.role.name === "user") this.router.navigateByUrl( '/user/search'); - else if(retour.data.role.name === "advertiser") this.router.navigateByUrl( '/advertiser/adList'); - else if(retour.data.role.name === "admin" || retour.data.role.name === "superAdmin") this.router.navigateByUrl( '/admin/userList'); + if(retour.data.role.name === "user") { + this.profilService.setRole("user"); + this.router.navigateByUrl( '/user/search'); + } + else if(retour.data.role.name === "advertiser") { + this.profilService.setRole("advertiser"); + this.router.navigateByUrl( '/advertiser/adList'); + } + //else if(retour.data.role.name === "admin" || retour.data.role.name === "superAdmin") this.router.navigateByUrl( '/admin/userList'); } } diff --git a/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.scss b/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.scss index c7acb4b..e69de29 100644 --- a/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.scss +++ b/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.scss @@ -1,3 +0,0 @@ -mat-form-field { - width: 100%; -} diff --git a/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.ts b/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.ts index 537cf45..8dba84e 100644 --- a/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.ts +++ b/src/app/beforeConnexion/register/input-interests-register/input-interests-register.component.ts @@ -2,10 +2,10 @@ import {Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild} f import {COMMA, ENTER} from "@angular/cdk/keycodes"; import {FormControl} from "@angular/forms"; import {Observable} from "rxjs"; -import {MessageService} from "../../../utils/services/message/message.service"; import {map, startWith} from "rxjs/operators"; import {MatChipInputEvent} from "@angular/material/chips"; import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; +import {MessageService} from "../../../utils/message/message.service"; diff --git a/src/app/beforeConnexion/register/page-register/page-register.component.html b/src/app/beforeConnexion/register/page-register/page-register.component.html index 4d7b629..fb6e3ac 100644 --- a/src/app/beforeConnexion/register/page-register/page-register.component.html +++ b/src/app/beforeConnexion/register/page-register/page-register.component.html @@ -11,7 +11,7 @@
- + Utilisateur standard    Annonceur @@ -64,21 +64,21 @@ Pseudo - +
Mot de passe - +
Confirmation mot de passe - +
@@ -89,12 +89,12 @@ Email - +
- + Homme     Femme @@ -105,7 +105,8 @@ Date de naissance + (ngModelChange)="user.dateOfBirth = $event" + [ngModelOptions]="{standalone: true}"> @@ -127,35 +128,35 @@ Entreprise - +
Pseudo - +
Email - +
Mot de passe - +
Confirmation mot de passe - + diff --git a/src/app/beforeConnexion/register/page-register/page-register.component.ts b/src/app/beforeConnexion/register/page-register/page-register.component.ts index 833a656..788c8be 100644 --- a/src/app/beforeConnexion/register/page-register/page-register.component.ts +++ b/src/app/beforeConnexion/register/page-register/page-register.component.ts @@ -1,17 +1,16 @@ import { Component } from '@angular/core'; -import {MessageService} from "../../../utils/services/message/message.service"; +import {PopupConfirmationComponent} from "../popup-confirmation/popup-confirmation.component"; +import {MessageService} from "../../../utils/message/message.service"; import {Router} from "@angular/router"; import {MatDialog} from "@angular/material/dialog"; -import {PopupConfirmationComponent} from "../popup-confirmation/popup-confirmation.component"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {User} from "../../../utils/interfaces/user"; +import {ThemeService} from "../../../utils/theme/theme.service"; @Component({ - selector: 'app-page-register', - templateUrl: './page-register.component.html', - styleUrls: ['./page-register.component.scss'] + selector: 'app-page-register', + templateUrl: './page-register.component.html', + styleUrls: ['./page-register.component.scss'] }) export class PageRegisterComponent { @@ -19,7 +18,7 @@ export class PageRegisterComponent confirmPassword: string = ""; hasError: boolean = false; errorMessage: string = ""; - user: User = { + user = { _id: "", login: "", hashPass: "", diff --git a/src/app/beforeConnexion/register/popup-confirmation/popup-confirmation.component.ts b/src/app/beforeConnexion/register/popup-confirmation/popup-confirmation.component.ts index 2152f9b..59e3325 100644 --- a/src/app/beforeConnexion/register/popup-confirmation/popup-confirmation.component.ts +++ b/src/app/beforeConnexion/register/popup-confirmation/popup-confirmation.component.ts @@ -1,12 +1,10 @@ import {Component, Inject} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; - - @Component({ - selector: 'app-popup-confirmation', - templateUrl: './popup-confirmation.component.html', - styleUrls: ['./popup-confirmation.component.scss'] + selector: 'app-popup-confirmation', + templateUrl: './popup-confirmation.component.html', + styleUrls: ['./popup-confirmation.component.scss'] }) export class PopupConfirmationComponent { diff --git a/src/app/beforeConnexion/utils/navbar-before-connexion/navbar-before-connexion.component.ts b/src/app/beforeConnexion/utils/navbar-before-connexion/navbar-before-connexion.component.ts index 3085e5c..4a3f05e 100644 --- a/src/app/beforeConnexion/utils/navbar-before-connexion/navbar-before-connexion.component.ts +++ b/src/app/beforeConnexion/utils/navbar-before-connexion/navbar-before-connexion.component.ts @@ -1,6 +1,5 @@ import {Component, Input} from '@angular/core'; - @Component({ selector: 'app-navbar-before-connexion', templateUrl: './navbar-before-connexion.component.html', diff --git a/src/app/user/history/page-history-user/page-history-user.component.ts b/src/app/user/history/page-history-user/page-history-user.component.ts index 53ec37d..5485ec1 100644 --- a/src/app/user/history/page-history-user/page-history-user.component.ts +++ b/src/app/user/history/page-history-user/page-history-user.component.ts @@ -1,12 +1,10 @@ import {AfterViewInit, Component, ViewChild} from '@angular/core'; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {MessageService} from "../../../utils/services/message/message.service"; import {MatTableDataSource} from "@angular/material/table"; import {MatSort} from "@angular/material/sort"; import {MatPaginator} from "@angular/material/paginator"; -import {FictitiousVideosService} from "../../../utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service"; -import {VideoAll} from "../../../utils/interfaces/video"; import {Router} from "@angular/router"; +import {MessageService} from "../../../utils/message/message.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; @@ -25,7 +23,6 @@ export class PageHistoryUserComponent implements AfterViewInit constructor( public themeService: ThemeService, private messageService: MessageService, - private fictitiousVideosService: FictitiousVideosService, private router: Router ) { } @@ -93,7 +90,7 @@ export class PageHistoryUserComponent implements AfterViewInit } - onVideo(video: VideoAll): void + onVideo(video): void { this.messageService .put("video/update/"+video._id, {watchedDate: true}) diff --git a/src/app/user/myPlaylists/page-my-playlists/page-my-playlists.component.ts b/src/app/user/myPlaylists/page-my-playlists/page-my-playlists.component.ts index 877dde8..0b94523 100644 --- a/src/app/user/myPlaylists/page-my-playlists/page-my-playlists.component.ts +++ b/src/app/user/myPlaylists/page-my-playlists/page-my-playlists.component.ts @@ -1,8 +1,7 @@ import { Component, OnInit } from '@angular/core'; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {Advert} from "../../../utils/interfaces/advert"; -import {MessageService} from "../../../utils/services/message/message.service"; import {HttpParams} from "@angular/common/http"; +import {ThemeService} from "../../../utils/theme/theme.service"; +import {MessageService} from "../../../utils/message/message.service"; @@ -13,7 +12,7 @@ import {HttpParams} from "@angular/common/http"; }) export class PageMyPlaylistsComponent implements OnInit { - ad: Advert; // pub + ad; // pub playlist: any; // la playlist sélectionnée diff --git a/src/app/user/myPlaylists/playlist-list/playlist-list.component.ts b/src/app/user/myPlaylists/playlist-list/playlist-list.component.ts index f97fa1e..9d9dbc2 100644 --- a/src/app/user/myPlaylists/playlist-list/playlist-list.component.ts +++ b/src/app/user/myPlaylists/playlist-list/playlist-list.component.ts @@ -1,12 +1,10 @@ import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {PlaylistDB} from "../../../utils/interfaces/playlist"; import {MatDialog} from "@angular/material/dialog"; import {MatSnackBar} from "@angular/material/snack-bar"; import {PopupCreateOrUpdatePlaylistComponent} from "../popup-create-or-update-playlist/popup-create-or-update-playlist.component"; -import {FictitiousVideosService} from "../../../utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service"; import {PopupDeletePlaylistComponent} from "../popup-delete-playlist/popup-delete-playlist.component"; -import {MessageService} from "../../../utils/services/message/message.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; +import {MessageService} from "../../../utils/message/message.service"; @@ -17,17 +15,16 @@ import {MessageService} from "../../../utils/services/message/message.service"; }) export class PlaylistListComponent implements OnInit { - allPlaylists: PlaylistDB[] = []; // toutes les playlists - @Output() eventEmitter = new EventEmitter(); // pour envoyer au parent la playlist selectionner + allPlaylists: any[] = []; // toutes les playlists + @Output() eventEmitter = new EventEmitter(); // pour envoyer au parent la playlist selectionner search: string = "" ; // contenu de la barre de recherche - tabPlaylist: PlaylistDB[] = []; // playlist affichées - playlistFocusedOn: PlaylistDB; + tabPlaylist: any[] = []; // playlist affichées + playlistFocusedOn: any; constructor( public themeService: ThemeService, public dialog: MatDialog, public snackBar: MatSnackBar, - private fictitiousVideosService: FictitiousVideosService, private messageService: MessageService ) { } @@ -94,7 +91,7 @@ export class PlaylistListComponent implements OnInit // click sur update playlist - onUpdatePlaylist(playlistToUpdate: PlaylistDB): void + onUpdatePlaylist(playlistToUpdate): void { const config = { data: { @@ -127,7 +124,7 @@ export class PlaylistListComponent implements OnInit // click sur supprimer playlist - onDeletePlaylist(playlist: PlaylistDB): void + onDeletePlaylist(playlist): void { const config = {data: playlist}; this.dialog @@ -155,7 +152,7 @@ export class PlaylistListComponent implements OnInit // retourne la class CSS de conteneur de playlist - getClassOfPlaylistContainer(playlist: PlaylistDB): string + getClassOfPlaylistContainer(playlist): string { if(playlist === this.playlistFocusedOn) return "row btnPlaylist btnPlaylistFocus" ; else return "row btnPlaylist" ; diff --git a/src/app/user/myPlaylists/popup-create-or-update-playlist/popup-create-or-update-playlist.component.ts b/src/app/user/myPlaylists/popup-create-or-update-playlist/popup-create-or-update-playlist.component.ts index a6ce4b6..1be479b 100644 --- a/src/app/user/myPlaylists/popup-create-or-update-playlist/popup-create-or-update-playlist.component.ts +++ b/src/app/user/myPlaylists/popup-create-or-update-playlist/popup-create-or-update-playlist.component.ts @@ -1,7 +1,6 @@ import {Component, Inject, OnInit} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {PlaylistDB} from "../../../utils/interfaces/playlist"; +import {MessageService} from "../../../utils/message/message.service"; @@ -19,7 +18,6 @@ export class PopupCreateOrUpdatePlaylistComponent implements OnInit action: string = ""; - constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data, private messageService: MessageService) { } diff --git a/src/app/user/myPlaylists/popup-delete-playlist/popup-delete-playlist.component.ts b/src/app/user/myPlaylists/popup-delete-playlist/popup-delete-playlist.component.ts index 2cc06ec..dda9f5b 100644 --- a/src/app/user/myPlaylists/popup-delete-playlist/popup-delete-playlist.component.ts +++ b/src/app/user/myPlaylists/popup-delete-playlist/popup-delete-playlist.component.ts @@ -1,6 +1,6 @@ import {Component, Inject, OnInit} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../utils/services/message/message.service"; +import {MessageService} from "../../../utils/message/message.service"; @Component({ selector: 'app-popup-delete-playlist', diff --git a/src/app/user/myPlaylists/video-list/video-list.component.ts b/src/app/user/myPlaylists/video-list/video-list.component.ts index 0919e1a..25c4edb 100644 --- a/src/app/user/myPlaylists/video-list/video-list.component.ts +++ b/src/app/user/myPlaylists/video-list/video-list.component.ts @@ -1,10 +1,10 @@ import {Component, Input, OnChanges, SimpleChanges} from '@angular/core'; -import {ThemeService} from "../../../utils/services/theme/theme.service"; import {AddVideoToPlaylistsService} from "../../utils/services/addVideoToPlaylists/add-video-to-playlists.service"; -import {MessageService} from "../../../utils/services/message/message.service"; import {MatSnackBar} from "@angular/material/snack-bar"; import {Router} from "@angular/router"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; +import {ProfilService} from "../../../utils/profil/profil.service"; diff --git a/src/app/user/myProfil/input-interests-profil/input-interests-profil.component.ts b/src/app/user/myProfil/input-interests-profil/input-interests-profil.component.ts index 8ceb7c1..873052a 100644 --- a/src/app/user/myProfil/input-interests-profil/input-interests-profil.component.ts +++ b/src/app/user/myProfil/input-interests-profil/input-interests-profil.component.ts @@ -2,10 +2,10 @@ import {Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild} f import {COMMA, ENTER} from "@angular/cdk/keycodes"; import {FormControl} from "@angular/forms"; import {Observable} from "rxjs"; -import {MessageService} from "../../../utils/services/message/message.service"; import {map, startWith} from "rxjs/operators"; import {MatChipInputEvent} from "@angular/material/chips"; import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; +import {MessageService} from "../../../utils/message/message.service"; diff --git a/src/app/user/myProfil/page-profil-user/page-profil-user.component.ts b/src/app/user/myProfil/page-profil-user/page-profil-user.component.ts index 33ed891..be4615f 100644 --- a/src/app/user/myProfil/page-profil-user/page-profil-user.component.ts +++ b/src/app/user/myProfil/page-profil-user/page-profil-user.component.ts @@ -1,11 +1,10 @@ import { Component, OnInit } from '@angular/core'; -import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {User} from "../../../utils/interfaces/user"; import {MatDialog} from "@angular/material/dialog"; import {MatSnackBar} from "@angular/material/snack-bar"; import {PopupUpdateUserComponent} from "../popup-update-user/popup-update-user.component"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {ProfilService} from "../../../utils/profil/profil.service"; @@ -16,7 +15,7 @@ import {ProfilService} from "../../../utils/services/profil/profil.service"; }) export class PageProfilUserComponent implements OnInit { - user: User = { + user = { _id: "", login: "", hashPass: "", diff --git a/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts b/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts index 0e1c5d3..4c91d19 100644 --- a/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts +++ b/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts @@ -1,8 +1,7 @@ import {Component, Inject, OnInit} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {User} from "../../../utils/interfaces/user"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {ProfilService} from "../../../utils/services/profil/profil.service"; +import {MessageService} from "../../../utils/message/message.service"; +import {ProfilService} from "../../../utils/profil/profil.service"; @@ -13,7 +12,7 @@ import {ProfilService} from "../../../utils/services/profil/profil.service"; }) export class PopupUpdateUserComponent implements OnInit { - userCopy: User; + userCopy; newPassword: string = ""; confirmNewPassword: string = "" ; changePassword: boolean = false ; diff --git a/src/app/user/search/page-search/page-search.component.html b/src/app/user/search/page-search/page-search.component.html index 0039bdd..86e2b0f 100644 --- a/src/app/user/search/page-search/page-search.component.html +++ b/src/app/user/search/page-search/page-search.component.html @@ -69,7 +69,7 @@
- +
diff --git a/src/app/user/search/page-search/page-search.component.ts b/src/app/user/search/page-search/page-search.component.ts index 7ab145f..60b9826 100644 --- a/src/app/user/search/page-search/page-search.component.ts +++ b/src/app/user/search/page-search/page-search.component.ts @@ -1,9 +1,8 @@ import { Component, OnInit } from '@angular/core'; -import {MessageService} from "../../../utils/services/message/message.service"; -import {VideoAll} from "../../../utils/interfaces/video"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; import {HttpParams} from "@angular/common/http"; import {ActivatedRoute} from "@angular/router"; +import {MessageService} from "../../../utils/message/message.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; @@ -22,7 +21,7 @@ let TAB_PLATEFORM = [ export class PageSearchComponent implements OnInit { tabPlateform = TAB_PLATEFORM; - tabVideo: VideoAll[] = []; + tabVideo: any[] = []; search: string = ""; ad1: any; ad2: any; diff --git a/src/app/user/search/video-grid/video-grid.component.ts b/src/app/user/search/video-grid/video-grid.component.ts index 6e13887..11dea65 100644 --- a/src/app/user/search/video-grid/video-grid.component.ts +++ b/src/app/user/search/video-grid/video-grid.component.ts @@ -1,8 +1,7 @@ -import {Component, Input, OnChanges, OnInit, SimpleChanges} from '@angular/core'; -import {VideoAll} from "../../../utils/interfaces/video"; +import {Component, Input, OnChanges, SimpleChanges} from '@angular/core'; import {AddVideoToPlaylistsService} from "../../utils/services/addVideoToPlaylists/add-video-to-playlists.service"; import {Router} from "@angular/router"; -import {MessageService} from "../../../utils/services/message/message.service"; +import {MessageService} from "../../../utils/message/message.service"; @@ -13,7 +12,7 @@ import {MessageService} from "../../../utils/services/message/message.service"; }) export class VideoGridComponent implements OnChanges { - @Input() tabVideo: VideoAll[] = []; + @Input() tabVideo: any[] = []; @Input() search: string = ""; @Input() sources: string = ""; @Input() indexPage: number = 0; @@ -38,7 +37,7 @@ export class VideoGridComponent implements OnChanges } - onAddToPlaylist(video: VideoAll): void + onAddToPlaylist(video): void { this.addVideoToPlaylistsService.run(video.videoId, video.source, video.interest); } @@ -51,7 +50,7 @@ export class VideoGridComponent implements OnChanges } - onVideo(video: VideoAll): void + onVideo(video): void { const data = { source: video.source, interest: video.interest }; this.messageService @@ -60,7 +59,7 @@ export class VideoGridComponent implements OnChanges } - onVideoCallback(retour: any, video: VideoAll): void + onVideoCallback(retour: any, video): void { if(retour.status !== "success") { console.log(retour); diff --git a/src/app/user/utils/components/navbar-user/navbar-user.component.ts b/src/app/user/utils/components/navbar-user/navbar-user.component.ts index 5947c0b..5eef45d 100644 --- a/src/app/user/utils/components/navbar-user/navbar-user.component.ts +++ b/src/app/user/utils/components/navbar-user/navbar-user.component.ts @@ -1,7 +1,7 @@ import {Component} from '@angular/core'; import {Router} from "@angular/router"; -import {ProfilService} from "../../../../utils/services/profil/profil.service"; -import {MessageService} from "../../../../utils/services/message/message.service"; +import {ProfilService} from "../../../../utils/profil/profil.service"; +import {MessageService} from "../../../../utils/message/message.service"; @@ -36,6 +36,7 @@ export class NavbarUserComponent onDeconnexionCallback(retour: any): void { if(retour.status !== "success") console.log(retour); + this.profilService.setRole(""); } } diff --git a/src/app/user/utils/components/popup-add-video-to-playlists/popup-add-video-to-playlists.component.ts b/src/app/user/utils/components/popup-add-video-to-playlists/popup-add-video-to-playlists.component.ts index 6a2d58d..cfa0119 100644 --- a/src/app/user/utils/components/popup-add-video-to-playlists/popup-add-video-to-playlists.component.ts +++ b/src/app/user/utils/components/popup-add-video-to-playlists/popup-add-video-to-playlists.component.ts @@ -1,6 +1,6 @@ import {Component, Inject, OnInit} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; -import {MessageService} from "../../../../utils/services/message/message.service"; +import {MessageService} from "../../../../utils/message/message.service"; diff --git a/src/app/user/utils/services/addVideoToPlaylists/add-video-to-playlists.service.ts b/src/app/user/utils/services/addVideoToPlaylists/add-video-to-playlists.service.ts index 50a5606..e9df3c4 100644 --- a/src/app/user/utils/services/addVideoToPlaylists/add-video-to-playlists.service.ts +++ b/src/app/user/utils/services/addVideoToPlaylists/add-video-to-playlists.service.ts @@ -1,9 +1,8 @@ import { Injectable } from '@angular/core'; -import {MessageService} from "../../../../utils/services/message/message.service"; import {MatDialog} from "@angular/material/dialog"; import {PopupAddVideoToPlaylistsComponent} from "../../components/popup-add-video-to-playlists/popup-add-video-to-playlists.component"; import {MatSnackBar} from "@angular/material/snack-bar"; -import {FictitiousVideosService} from "../../../../utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service"; +import {MessageService} from "../../../../utils/message/message.service"; @@ -20,7 +19,6 @@ export class AddVideoToPlaylistsService constructor( private messageService: MessageService, public dialog: MatDialog, - private fictitiousVideosService: FictitiousVideosService, private snackBar: MatSnackBar ) { } diff --git a/src/app/user/watching/page-watching-video/page-watching-video.component.ts b/src/app/user/watching/page-watching-video/page-watching-video.component.ts index b632ac6..4115a7a 100644 --- a/src/app/user/watching/page-watching-video/page-watching-video.component.ts +++ b/src/app/user/watching/page-watching-video/page-watching-video.component.ts @@ -1,14 +1,10 @@ import { Component, OnInit } from '@angular/core'; -import {VideoAll} from "../../../utils/interfaces/video"; -import {MessageService} from "../../../utils/services/message/message.service"; -import {FictitiousVideosService} from "../../../utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service"; -import {FictitiousAdvertsService} from "../../../utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service"; -import {ThemeService} from "../../../utils/services/theme/theme.service"; import {ActivatedRoute, Router} from "@angular/router"; import {AddVideoToPlaylistsService} from "../../utils/services/addVideoToPlaylists/add-video-to-playlists.service"; -import {PlaylistDB} from "../../../utils/interfaces/playlist"; import {DomSanitizer, SafeResourceUrl} from "@angular/platform-browser"; import {HttpParams} from "@angular/common/http"; +import {MessageService} from "../../../utils/message/message.service"; +import {ThemeService} from "../../../utils/theme/theme.service"; @@ -54,8 +50,6 @@ export class PageWatchingVideoComponent implements OnInit constructor( private messageService: MessageService, - private fictitiousVideosService: FictitiousVideosService, - private fictitiousAdvertsService: FictitiousAdvertsService, public themeService: ThemeService, private activatedRoute: ActivatedRoute, private router: Router, @@ -243,7 +237,7 @@ export class PageWatchingVideoComponent implements OnInit // retourne la classe CSS de videoCell - getClassOfVideoCell(video0: VideoAll): string + getClassOfVideoCell(video0): string { if(video0 === this.video) return "videoCell videoCellFocus" ; else return "videoCell" ; diff --git a/src/app/utils/guards/advertiser/advertiser.guard.spec.ts b/src/app/utils/guards/advertiser/advertiser.guard.spec.ts new file mode 100644 index 0000000..7c2e7d1 --- /dev/null +++ b/src/app/utils/guards/advertiser/advertiser.guard.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AdvertiserGuard } from './advertiser.guard'; + +describe('AdvertiserGuard', () => { + let guard: AdvertiserGuard; + + beforeEach(() => { + TestBed.configureTestingModule({}); + guard = TestBed.inject(AdvertiserGuard); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); +}); diff --git a/src/app/utils/guards/advertiser/advertiser.guard.ts b/src/app/utils/guards/advertiser/advertiser.guard.ts new file mode 100644 index 0000000..9278df5 --- /dev/null +++ b/src/app/utils/guards/advertiser/advertiser.guard.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from '@angular/router'; +import { Observable } from 'rxjs'; +import {ProfilService} from "../../profil/profil.service"; + +@Injectable({ + providedIn: 'root' +}) +export class AdvertiserGuard implements CanActivate +{ + + constructor(private profilService: ProfilService, private router: Router) {} + + canActivate( route: ActivatedRouteSnapshot, + state: RouterStateSnapshot ): Observable | Promise | boolean | UrlTree + { + if(this.profilService.getRole() === "advertiser") return true; + else { + this.router.navigateByUrl("login"); + return false; + } + } + +} diff --git a/src/app/utils/guards/user/user.guard.spec.ts b/src/app/utils/guards/user/user.guard.spec.ts new file mode 100644 index 0000000..a657320 --- /dev/null +++ b/src/app/utils/guards/user/user.guard.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UserGuard } from './user.guard'; + +describe('UserGuard', () => { + let guard: UserGuard; + + beforeEach(() => { + TestBed.configureTestingModule({}); + guard = TestBed.inject(UserGuard); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); +}); diff --git a/src/app/utils/guards/user/user.guard.ts b/src/app/utils/guards/user/user.guard.ts new file mode 100644 index 0000000..5f4508c --- /dev/null +++ b/src/app/utils/guards/user/user.guard.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from '@angular/router'; +import { Observable } from 'rxjs'; +import {ProfilService} from "../../profil/profil.service"; + +@Injectable({ + providedIn: 'root' +}) +export class UserGuard implements CanActivate +{ + + constructor(private profilService: ProfilService, private router: Router) {} + + canActivate( route: ActivatedRouteSnapshot, + state: RouterStateSnapshot ): Observable | Promise | boolean | UrlTree + { + if(this.profilService.getRole() === "user") return true; + else { + this.router.navigateByUrl("login"); + return false; + } + } + +} diff --git a/src/app/utils/interfaces/advert.ts b/src/app/utils/interfaces/advert.ts deleted file mode 100644 index 55da7c0..0000000 --- a/src/app/utils/interfaces/advert.ts +++ /dev/null @@ -1,39 +0,0 @@ -export interface Advert -{ - _id: string, - userId: string, - title: string, - url: string, - images: { - url: string, - description: string, - }[], - interests: string[], - comment: string, - views: Date[], - isVisible: boolean, - isActive: boolean, - createdAt: Date, - updatedAt: Date, -} - - - -export interface AdvertWithCountViews { - id: string, - userId: string, - title: string, - url: string, - images: { - url: string, - description: string, - }[], - interests: string[], - comment: string, - views: Date[], - countViews: number, - isVisible: boolean, - isActive: boolean, - createdAt: Date, - updatedAt: Date, -} diff --git a/src/app/utils/interfaces/playlist.ts b/src/app/utils/interfaces/playlist.ts deleted file mode 100644 index 4ffa611..0000000 --- a/src/app/utils/interfaces/playlist.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface PlaylistDB -{ - _id: string, - userId: string, - name: string, - videoIds: string[], - isActive: boolean - createdAt: Date, - updatedAt: Date -} diff --git a/src/app/utils/interfaces/user.ts b/src/app/utils/interfaces/user.ts deleted file mode 100644 index f46977f..0000000 --- a/src/app/utils/interfaces/user.ts +++ /dev/null @@ -1,33 +0,0 @@ -export interface User -{ - _id: string, - email: string, - hashPass: string, - login: string, - role: { - name: string, - permission: number, - isAccepted: boolean, - }, - profileImageUrl: string, - dateOfBirth: Date, - gender: string, - interests: any[], - company: string, - isActive: boolean, - lastConnexion: Date, - createdAt: Date, - updatedAt: Date -} - - -interface VideoCategorie -{ - id: number - interest: string - categories: { - id: string - name: string - source: string - } -} diff --git a/src/app/utils/interfaces/video.ts b/src/app/utils/interfaces/video.ts deleted file mode 100644 index 1c93427..0000000 --- a/src/app/utils/interfaces/video.ts +++ /dev/null @@ -1,32 +0,0 @@ -export interface VideoDB -{ - _id: string, - userId: string, - videoId: string, - source: string, - tags: string[], - interest: string, - watchedDates: Date[], - createdAt: Date, - updatedAt: Date -} - - -export interface VideoAll -{ - _id: string, - userId: string, - videoId: string, - source: string, - tags: String[], - interest: string, - watchedDates: Date[], - createdAt: Date, - updatedAt: Date - - title: string, - views: number, - publishedAt: Date, - description: string, - imageUrl: string -} diff --git a/src/app/utils/services/message/message.service.spec.ts b/src/app/utils/message/message.service.spec.ts similarity index 100% rename from src/app/utils/services/message/message.service.spec.ts rename to src/app/utils/message/message.service.spec.ts diff --git a/src/app/utils/services/message/message.service.ts b/src/app/utils/message/message.service.ts similarity index 94% rename from src/app/utils/services/message/message.service.ts rename to src/app/utils/message/message.service.ts index a50e75c..c20d5b1 100644 --- a/src/app/utils/services/message/message.service.ts +++ b/src/app/utils/message/message.service.ts @@ -1,9 +1,7 @@ import { Injectable } from '@angular/core'; import {HttpClient, HttpParams} from "@angular/common/http"; -import {environment} from "../../../../environments/environment"; import {Observable} from "rxjs"; - - +import {environment} from "../../../environments/environment"; @Injectable({ providedIn: 'root' diff --git a/src/app/utils/services/profil/profil.service.spec.ts b/src/app/utils/profil/profil.service.spec.ts similarity index 100% rename from src/app/utils/services/profil/profil.service.spec.ts rename to src/app/utils/profil/profil.service.spec.ts diff --git a/src/app/utils/profil/profil.service.ts b/src/app/utils/profil/profil.service.ts new file mode 100644 index 0000000..5f1ec73 --- /dev/null +++ b/src/app/utils/profil/profil.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class ProfilService +{ + + getId(): string { + return localStorage.getItem('id'); + } + + getRole(): string { + return localStorage.getItem('role'); + } + + getProfileImageUrl(): string { + return localStorage.getItem('profileImageUrl'); + } + + setId(id: string): void { + localStorage.setItem('id', id); + } + + setRole(role: string): void { + localStorage.setItem('role', role); + } + + setProfileImageUrl(profileImageUrl: string): void { + localStorage.setItem('profileImageUrl', profileImageUrl); + } + +} diff --git a/src/app/utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service.spec.ts b/src/app/utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service.spec.ts deleted file mode 100644 index 0cd9f3c..0000000 --- a/src/app/utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { FictitiousAdvertsService } from './fictitious-adverts.service'; - -describe('FictitiousAdvertsService', () => { - let service: FictitiousAdvertsService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(FictitiousAdvertsService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service.ts b/src/app/utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service.ts deleted file mode 100644 index 2dd7702..0000000 --- a/src/app/utils/services/fictitiousDatas/fictitiousAdverts/fictitious-adverts.service.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Injectable } from '@angular/core'; -import {Advert} from "../../../interfaces/advert"; -import {FictitiousUtilsService} from "../fictitiousUtils/fictitious-utils.service"; - - - -const TAB_ADVERT: Advert[] = [ - { - _id: "idNutella", - userId: "userId", - title: "pot de nutella XXL", - url: "https://www.nutella.com/fr/fr/", - images: [ - { url: "nutella_v_1.jpeg", description: "image nutella 1" }, - { url: "nutella_v_2.png", description: "image nutella 2" }, - { url: "nutella_v_3.jpg", description: "image nutella 3" } - ], - interests: [ "rock", "basket" ], - comment: "pub pour vacances de noêl", - views: [ - new Date(2021,10,1), - new Date(2021,10,2), - new Date(2021,10,3), - new Date(2021,10,3), - new Date(2021,10,5), - new Date(2021,10,5), - new Date(2021,10,5), - new Date(2021,10,5), - new Date(2021,10,5), - new Date(2021,10,7) - ], - isVisible: true, - isActive: true, - createdAt: new Date(), - updatedAt: new Date(), - }, - { - _id: "idRolex", - userId: "userId", - title: "Rolex", - url: "https://www.rolex.com", - images: [ - { url: "rolex_v_1.jpg", description: "rolex 1" }, - { url: "rolex_v_2.png", description: "rolex 2" }, - ], - interests: [ "rock", "rap" ], - comment: "pub pour cette année", - views: [ - new Date(2021,10,5), - new Date(2021,10,6), - new Date(2021,10,7), - new Date(2021,10,8), - new Date(2021,10,8), - new Date(2021,10,8), - new Date(2021,10,25), - new Date(2021,10,25), - new Date(2021,10,25), - new Date(2021,10,27) - ], - isVisible: true, - isActive: true, - createdAt: new Date(), - updatedAt: new Date(), - }, - { - _id: "idAlbion", - userId: "userId", - title: "Albion new version", - url: "https://www.rolex.com", - images: [ - { url: "rolex_v_1.jpg", description: "albion 1" }, - { url: "rolex_v_2.png", description: "albion 2" }, - ], - interests: [ "rock", "rap" ], - comment: "pub pour cette année", - views: [ - new Date(2021,10,3), - new Date(2021,10,4), - new Date(2021,10,4), - new Date(2021,10,5), - new Date(2021,10,5), - new Date(2021,10,6), - new Date(2021,10,6), - new Date(2021,10,8), - new Date(2021,10,8), - new Date(2021,10,8) - ], - isVisible: true, - isActive: true, - createdAt: new Date(), - updatedAt: new Date(), - } -]; - - - -@Injectable({ - providedIn: 'root' -}) -export class FictitiousAdvertsService -{ - - constructor(private fictitiousUtilsService: FictitiousUtilsService) {} - - - getAdvert(): Advert - { - const idx = Math.floor(Math.random() * TAB_ADVERT.length); - let advert = Object.assign({}, TAB_ADVERT[idx]); - advert._id = advert._id + this.fictitiousUtilsService.makeid(5); - advert.interests = advert.interests.slice(); - advert.isVisible = (Math.random() < 0.5); - return advert; - } - - - getTabAdvert(n: number): Advert[] - { - let tabAdvert = []; - for(let i=0 ; i { - let service: FictitiousUsersService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(FictitiousUsersService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/utils/services/fictitiousDatas/fictitiousUsers/fictitious-users.service.ts b/src/app/utils/services/fictitiousDatas/fictitiousUsers/fictitious-users.service.ts deleted file mode 100644 index e629e97..0000000 --- a/src/app/utils/services/fictitiousDatas/fictitiousUsers/fictitious-users.service.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Injectable } from '@angular/core'; -import {User} from "../../../interfaces/user"; -import {FictitiousUtilsService} from "../fictitiousUtils/fictitious-utils.service"; - - - -const USER: User = { - _id: "ririId", - login: "Riri", - hashPass: "agourgroou", - email: "riri@gmail.com", - role: { - name: "user", - permission: 0, - isAccepted: true, - - }, - profileImageUrl: "https://www.figurines-goodies.com/1185-thickbox_default/huey-duck-tales-disney-funko-pop.jpg", - dateOfBirth: new Date(), - gender: "man", - interests: ["foot", "jeux-vidéo"], - company: "", - isActive: true, - lastConnexion: new Date(), - createdAt: new Date(), - updatedAt: new Date() -}; - -const ADVERTISER: User = { - _id: "fifiId", - login: "Fifi", - hashPass: "agourgroou", - email: "fifi@gmail.com", - role: { - name: "advertiser", - permission: 5, - isAccepted: true, - - }, - profileImageUrl: "https://www.figurines-goodies.com/1188-large_default/dewey-duck-tales-disney-funko-pop.jpg", - dateOfBirth: null, - gender: "", - interests: [], - company: "My company", - isActive: true, - lastConnexion: new Date(), - createdAt: new Date(), - updatedAt: new Date(), -}; - -const ADMIN: User = { - _id: "loulouId", - login: "Loulou", - hashPass: "agourgroou", - email: "loulou@gmail.com", - role: { - name: "admin", - permission: 5, - isAccepted: true, - }, - profileImageUrl: "https://www.reference-gaming.com/assets/media/product/41195/figurine-pop-duck-tales-n-309-loulou.jpg?format=product-cover-large&k=1519639530", - dateOfBirth: null, - gender: "", - interests: [], - company: "", - isActive: true, - lastConnexion: new Date(), - createdAt: new Date(), - updatedAt: new Date(), -}; - - - -@Injectable({ - providedIn: 'root' -}) -export class FictitiousUsersService -{ - - constructor(private fictitiousUtilsService: FictitiousUtilsService) { } - - private getUserOrAdvertiserOrAdmin(modele: User): User - { - const res = Object.assign({}, modele); - res._id += this.fictitiousUtilsService.makeid(5); - res.login += (Math.floor(Math.random() * 1000)).toString(); - res.email = res.login + "@gmail.com" ; - res.role.isAccepted = (Math.random() < 0.5); - res.isActive = (Math.random() < 0.5); - res.dateOfBirth = this.fictitiousUtilsService.randomDate(new Date(1900, 0, 1), new Date()); - res.lastConnexion = this.fictitiousUtilsService.randomDate(new Date(2000, 0, 1), new Date()); - return res; - } - - getUser(): User { - return this.getUserOrAdvertiserOrAdmin(USER); - } - - getAdvertiser(): User { - return this.getUserOrAdvertiserOrAdmin(ADVERTISER); - } - - getAdmin(): User { - return this.getUserOrAdvertiserOrAdmin(ADMIN); - } - - getTabUser(n: number): User[] - { - const res: User[] = []; - for(let i=0 ; i { - let service: FictitiousUtilsService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(FictitiousUtilsService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/utils/services/fictitiousDatas/fictitiousUtils/fictitious-utils.service.ts b/src/app/utils/services/fictitiousDatas/fictitiousUtils/fictitious-utils.service.ts deleted file mode 100644 index 4c06ecf..0000000 --- a/src/app/utils/services/fictitiousDatas/fictitiousUtils/fictitious-utils.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injectable } from '@angular/core'; - - -@Injectable({ - providedIn: 'root' -}) -export class FictitiousUtilsService -{ - - makeid(length) - { - let res = ''; - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for( let i = 0; i < length; i++ ) { - const k = Math.floor(Math.random() * characters.length); - res += characters.charAt(k); - } - return res; - } - - - randomDate(start, end): Date - { - return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())); - } - - - getTags(): string[] - { - return [ "musique", "rap", "rock", "sport", "foot", "basket", "tennis", "film", "action", "aventure", "horreur", "romance", "comedie"]; - } - -} diff --git a/src/app/utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service.spec.ts b/src/app/utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service.spec.ts deleted file mode 100644 index e604845..0000000 --- a/src/app/utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { FictitiousVideosService } from './fictitious-videos.service'; - -describe('FictitiousVideosService', () => { - let service: FictitiousVideosService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(FictitiousVideosService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service.ts b/src/app/utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service.ts deleted file mode 100644 index e0e0b4a..0000000 --- a/src/app/utils/services/fictitiousDatas/fictitiousVideos/fictitious-videos.service.ts +++ /dev/null @@ -1,289 +0,0 @@ -import { Injectable } from '@angular/core'; -import {VideoAll} from "../../../interfaces/video"; -import {PlaylistDB} from "../../../interfaces/playlist"; -import {FictitiousUtilsService} from "../fictitiousUtils/fictitious-utils.service"; - - - -const TAB_VIDEO: VideoAll[] = [ - { - _id: "Mowgli", - //videoId: "https://www.youtube.com/watch?v=medPORJ8KO0", - videoId: "medPORJ8KO0", - userId: "userId", - source: "youtube", - tags: [ "rap", "musique" ], - interest: "PNL", - watchedDates: [ - new Date(2021, 10, 15), - new Date(2021, 10, 16), - new Date(2021, 10, 17), - new Date(2021, 10, 18), - new Date(2021, 10, 19), - new Date(2021, 10, 20), - ], - createdAt: new Date(), - updatedAt: new Date(), - - title: "PNL - Mowgli", - views: 999999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/CaeH7TRnI3s/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCr4TMUqy_Lqi9_zh7efICrF_V_Vw", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. " - }, - { - _id: "Mexico", - //videoId: "https://www.youtube.com/watch?v=LZx6oeNeoWM", - videoId: "LZx6oeNeoWM", - userId: "userId", - source: "youtube", - tags: [ "rap", "musique" ], - interest: "PNL", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "PNL - Mexico", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/LZx6oeNeoWM/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAIJsokYSLBB3TrnKhX5V1beCTrpQ", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. " - }, - { - _id: "Luz de luna", - //videoId: "https://www.youtube.com/watch?v=fGoPhSV2Jic", - videoId: "fGoPhSV2Jic", - userId: "userId", - source: "youtube", - tags: [ "rap", "musique" ], - interest: "PNL", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "PNL - Luz de luna", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/fGoPhSV2Jic/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBICz3ZfnjAXQNZQniiCTRLbdyLcg", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. " - }, - { - _id: "Blanka", - //videoId: "https://www.youtube.com/watch?v=u8bHjdljyLw", - videoId: "u8bHjdljyLw", - userId: "userId", - source: "youtube", - tags: [ "rap", "musique" ], - interest: "PNL", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "PNL - Blanka", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/PCwZnN4zDiY/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCaA-xe5rkkYJbNCbSg0z27Lm1Hgw", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. " - }, - { - _id: "Mowgli 2", - //videoId: "https://www.dailymotion.com/video/x7ahxdn", - videoId: "x7ahxdn", - userId: "userId", - source: "dailymotion", - tags: [ "rap", "musique" ], - interest: "PNL", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "PNL - Mowgli 2", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/tno1qRfO894/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCOBBR6c3woXXIbOSdU06quQcN7pw", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. " - }, - { - _id: "Etre humain", - //videoId: "https://www.youtube.com/watch?v=gfVo39B92Ow", - videoId: "gfVo39B92Ow", - userId: "userId", - source: "youtube", - tags: [ "rap", "musique" ], - interest: "Nekfeu", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "PNL - Etre humain", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/gfVo39B92Ow/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCPJpBqTYk5Nj3RSgase3GdbT7_Pg", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. " - }, - { - _id: "Humanoide", - //videoId: "https://www.youtube.com/watch?v=MiyIg__WNOw", - videoId: "MiyIg__WNOw", - userId: "userId", - source: "youtube", - tags: [ "rap", "musique" ], - interest: "Nekfeu", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "Nekfeu - Humanoide", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/MiyIg__WNOw/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDboAq0TRqXBFGgXdpOD_HOsRZucw", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. ", - }, - { - _id: "Dernier soupir", - //videoId: "https://youtu.be/0GqjIF-4QQM?list=PLqeKQSn3LuAmpF-uIu39RIQRQkUzVol5l", - videoId: "0GqjIF-4QQM", - userId: "userId", - source: "youtube", - tags: [ "rap", "musique" ], - interest: "Nekfeu", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "Nekfeu - Dernier soupir", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/-S5IKBvT34c/hqdefault.jpg?sqp=-oaymwEcCOADEI4CSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC1kVCIB2bQGmOH74I5puXIhn7HRQ", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. ", - }, - { - _id: "Les prélis", - //videoId: "https://www.dailymotion.com/video/x4trtkd", - videoId: "x4trtkd", - userId: "userId", - source: "dailymotion", - tags: [ "rap", "musique" ], - interest: "Columbine", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "Columbine - Les prélis", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://s2.dmcdn.net/v/HPPjj1NtysAaAttYk/x240", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. ", - }, - { - _id: "Pierre feuille ciseau", - //videoId: "https://www.dailymotion.com/video/x6agl6i", - videoId: "x6agl6i", - userId: "userId", - source: "dailymotion", - tags: [ "rap", "musique" ], - interest: "Columbine", - watchedDates: [new Date()], - createdAt: new Date(), - updatedAt: new Date(), - - title: "Columbine - Pierre feuille ciseau", - views: 999999, - publishedAt: new Date(), - imageUrl: "https://i.ytimg.com/vi/tTo7CrPlbpI/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAhC5bWURH9R8Icdkv6LWRgsW2G-Q", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. ", - }, -]; - - - -@Injectable({ - providedIn: 'root' -}) -export class FictitiousVideosService -{ - - constructor(private fictitiousUtilsService: FictitiousUtilsService) {} - - - getVideoAll(): VideoAll - { - const index = Math.floor(Math.random() * TAB_VIDEO.length); - return TAB_VIDEO[index]; - } - - - getVideoByVideoId(videoId: string): VideoAll - { - return TAB_VIDEO.find(video => video.videoId === videoId); - } - - - getTabVideoAll(nbVideo: number): VideoAll[] - { - let tabVideo = []; - for(let i=0 ; i x._id), - isActive: true, - createdAt: new Date(), - updatedAt: new Date() - }); - } - - return tabPlaylist; - } - - - getNoRandomTabPlaylistDB(nbPlaylist: number): PlaylistDB[] - { - let tabPlaylist: PlaylistDB[] = []; - - for(let i = 0; i < nbPlaylist; i++) - { - const videoIds = []; - for(let j=0 ; j - - - diff --git a/src/polyfills.ts b/src/polyfills.ts index 3e93392..373f538 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -57,9 +57,9 @@ /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. +import 'zone.js'; // Included with Angular CLI. + /*************************************************************************************************** * APPLICATION IMPORTS */ -import '@angular/localize/init'; diff --git a/src/proxy.conf.json b/src/proxy.conf.json deleted file mode 100644 index f1e4285..0000000 --- a/src/proxy.conf.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "/api/*": { - "target": "http://localhost:3000", - "secure": false, - "logLevel": "debug" - } -} diff --git a/src/styles.scss b/src/styles.scss index 80de7ef..90d4ee0 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,57 +1 @@ -@import "~@angular/material/prebuilt-themes/indigo-pink.css"; - ---root { - --dark-color: #f0f0f0; -} -html, body { height: 100%; } -body { margin: 0; } - - -.lightTheme { - background: url("assets/lightBackground.jpg") no-repeat center center fixed; - font-color: black; - border-color: black; - font-size: small; -} - - -.darkTheme { - background: url("assets/darkBackground.webp") no-repeat center center fixed; - font-color: white; - border-color: white; - font-size: small; -} - - -.lightTheme, .darkTheme { - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} - - -.custom-dialog-container .mat-dialog-container { - margin: 0px 0px 0px 0px; - padding: 0px 0px 0px 0px; -} - - -// ------------------------------------------------------------------------- - - -// aura -::ng-deep .mat-checkbox-ripple .mat-ripple-element { - background-color: grey !important; -} - -// contenu coche -::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background { - background-color: black !important; -} - -// indeterminate -::ng-deep .mat-checkbox .mat-checkbox-frame { - border: solid 1px black !important; - background-color: white !important; -} +/* You can add global styles to this file, and also import other style files */ diff --git a/src/test.ts b/src/test.ts index 50193eb..b4dd603 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,6 +1,6 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -import 'zone.js/dist/zone-testing'; +import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, @@ -17,8 +17,10 @@ declare const require: { // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + platformBrowserDynamicTesting(), + { teardown: { destroyAfterEach: true }}, ); + // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 277c8eb..0000000 --- a/tslint.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "extends": "tslint:recommended", - "rulesDirectory": [ - "codelyzer" - ], - "rules": { - "align": { - "options": [ - "parameters", - "statements" - ] - }, - "array-type": false, - "arrow-return-shorthand": true, - "curly": true, - "deprecation": { - "severity": "warning" - }, - "eofline": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": { - "options": [ - "spaces" - ] - }, - "max-classes-per-file": false, - "max-line-length": [ - true, - 140 - ], - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-empty": false, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-non-null-assertion": true, - "no-redundant-jsdoc": true, - "no-switch-case-fall-through": true, - "no-var-requires": false, - "object-literal-key-quotes": [ - true, - "as-needed" - ], - "quotemark": [ - true, - "single" - ], - "semicolon": { - "options": [ - "always" - ] - }, - "space-before-function-paren": { - "options": { - "anonymous": "never", - "asyncArrow": "always", - "constructor": "never", - "method": "never", - "named": "never" - } - }, - "typedef": [ - true, - "call-signature" - ], - "typedef-whitespace": { - "options": [ - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, - { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - } - ] - }, - "variable-name": { - "options": [ - "ban-keywords", - "check-format", - "allow-pascal-case" - ] - }, - "whitespace": { - "options": [ - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type", - "check-typecast" - ] - }, - "component-class-suffix": true, - "contextual-lifecycle": true, - "directive-class-suffix": true, - "no-conflicting-lifecycle": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-inputs-metadata-property": true, - "no-output-native": true, - "no-output-on-prefix": true, - "no-output-rename": true, - "no-outputs-metadata-property": true, - "template-banana-in-box": true, - "template-no-negated-async": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ] - } -}