├── server
├── public
│ ├── script.js
│ ├── fav.png
│ ├── style.css
│ ├── admin.js
│ ├── user.js
│ └── pitchFinder.js
├── .gitignore
├── db
│ ├── connect.js
│ └── seed.js
├── models
│ ├── Books.js
│ ├── Session.js
│ ├── Room.js
│ └── User.js
├── middleware
│ ├── auth.js
│ └── renderer.js
├── package.json
├── server.js
├── routes
│ └── api.js
└── package-lock.json
├── favicon.ico
├── public
├── favicon.ico
├── manifest.json
└── index.html
├── src
├── api
│ └── api.js
├── App.css
├── index.js
├── components
│ ├── RoomModal
│ │ └── RoomModal.js
│ ├── Confirm
│ │ └── Confim.js
│ ├── Modal
│ │ └── Modal.js
│ ├── AdminView
│ │ └── AdminView.js
│ ├── ModalNav
│ │ └── ModalNav.js
│ ├── App
│ │ └── App.js
│ ├── UserView
│ │ └── UserView.js
│ ├── LoginForm
│ │ └── LoginForm.js
│ ├── UserCreateForm
│ │ └── UserCreateForm.js
│ ├── NavBar
│ │ └── NavBar.js
│ ├── UsersList
│ │ └── UsersList.js
│ ├── BookCreateForm
│ │ └── BookCreateForm.js
│ ├── BooksList
│ │ └── BooksList.js
│ ├── RoomList
│ │ └── RoomList.js
│ ├── RoomEdit
│ │ └── RoomEdit.js
│ └── RoomControls
│ │ └── RoomControls.js
├── contexts
│ ├── appContext.js
│ ├── adminContext.js
│ └── userContext.js
├── logo.svg
└── serviceWorker.js
├── .gitignore
├── index.html
├── semantic.json
├── package.json
├── main.js
└── README.md
/server/public/script.js:
--------------------------------------------------------------------------------
1 | // alert("Connected")
2 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CannonFodderr/audiosystem/HEAD/favicon.ico
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CannonFodderr/audiosystem/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | assets/
3 | server.cert
4 | server.key
5 | .env
6 | .rnd
7 | .mp3
--------------------------------------------------------------------------------
/server/public/fav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CannonFodderr/audiosystem/HEAD/server/public/fav.png
--------------------------------------------------------------------------------
/src/api/api.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | export const serverAPI = axios.create({
4 | baseURL: '/api'
5 | });
--------------------------------------------------------------------------------
/server/public/style.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | padding: 0;
3 | margin: 0;
4 | box-sizing: border-box;
5 | }
6 | body {
7 | background: #3e3e3e;
8 | color: #fff;
9 | }
10 |
11 | audio{
12 | width: 100%;
13 | }
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": ".",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/server/db/connect.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const env = require('dotenv').config();
3 |
4 | module.exports = mongoose.connect(process.env.DEV_DB_URL, { useNewUrlParser: true })
5 | .then(() => {
6 | console.log(`Connected to db`);
7 | return true;
8 | })
9 | .catch((err) => {
10 | console.log(err);
11 | return false;
12 | });
13 | mongoose.set('useCreateIndex', true);
--------------------------------------------------------------------------------
/server/models/Books.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 |
3 | const bookSchema = new mongoose.Schema({
4 | name: {
5 | type: String,
6 | unique: true
7 | },
8 | author: {
9 | type: String
10 | },
11 | parts: {
12 | type: [String]
13 | },
14 | path: String
15 | });
16 |
17 | const Book = mongoose.model('Book', bookSchema);
18 | module.exports = Book;
--------------------------------------------------------------------------------
/server/middleware/auth.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | isLoggedIn(req, res, next) {
3 | if (req.user && req.user != 'undefined') {
4 | return next();
5 | }
6 | return res.redirect('/login');
7 | },
8 | isAdmin(req, res, next) {
9 | if(req.user && req.user.isAdmin){
10 | return next();
11 | }
12 | return res.redirect('/logout');
13 | }
14 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /server/assets/
6 | /.pnp
7 | .pnp.js
8 | server.cert
9 | server.key
10 | .env
11 | .mp3
12 | # testing
13 | /coverage
14 | auditorio-win32-x64
15 | release-builds
16 | # production
17 | /build
18 | release-builds/
19 | # misc
20 | .DS_Store
21 | .env.local
22 | .env.development.local
23 | .env.test.local
24 | .env.production.local
25 |
26 | npm-debug.log*
27 | yarn-debug.log*
28 | yarn-error.log*
29 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
12 |
13 | Audio System
14 |
15 |
16 | Audio System Server
17 | Serving on local IP address, PORT 8080
18 | Connected to DB
19 |
20 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | animation: App-logo-spin infinite 20s linear;
7 | height: 40vmin;
8 | }
9 |
10 | .App-header {
11 | background-color: #282c34;
12 | min-height: 100vh;
13 | display: flex;
14 | flex-direction: column;
15 | align-items: center;
16 | justify-content: center;
17 | font-size: calc(10px + 2vmin);
18 | color: white;
19 | }
20 |
21 | .App-link {
22 | color: #61dafb;
23 | }
24 |
25 | @keyframes App-logo-spin {
26 | from {
27 | transform: rotate(0deg);
28 | }
29 | to {
30 | transform: rotate(360deg);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import 'semantic-ui-css/semantic.min.css';
4 | import App from './components/App/App';
5 | import {AppContextStore} from './contexts/appContext';
6 |
7 | ReactDOM.hydrate(
8 |
9 |
10 | ,
11 | document.getElementById('root'));
12 |
13 | // If you want your app to work offline and load faster, you can change
14 | // unregister() to register() below. Note this comes with some pitfalls.
15 | // Learn more about service workers: http://bit.ly/CRA-PWA
16 | // serviceWorker.unregister();
17 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "server.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "node server.js"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "body-parser": "^1.18.3",
14 | "ejs": "^2.6.1",
15 | "express": "^4.16.4",
16 | "express-session": "^1.15.6",
17 | "mongoose": "^5.4.9",
18 | "passport": "^0.4.0",
19 | "passport-local": "^1.0.0",
20 | "passport-local-mongoose": "^5.0.1",
21 | "peer": "^0.2.10"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/RoomModal/RoomModal.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react';
2 | import {Modal, Header} from 'semantic-ui-react';
3 |
4 | class RoomModalTemplate extends Component{
5 | render(){
6 | return(
7 | this.props.handleModalClose() }>
8 |
9 |
10 | {this.props.content}
11 |
12 |
13 | )
14 | }
15 | }
16 |
17 | export default RoomModalTemplate;
--------------------------------------------------------------------------------
/src/components/Confirm/Confim.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import {Confirm, Button} from 'semantic-ui-react';
3 |
4 | class ConfirmTemplate extends Component{
5 | constructor(props){
6 | super(props);
7 | }
8 | render(){
9 | return(
10 |
11 | this.props.handleConfirm()}
14 | onCancel={() => this.props.handleCancel()}
15 | onClose={() => this.props.handleCancel()}
16 | header={this.props.header}
17 | content={this.props.content}
18 | />
19 |
20 | )
21 | }
22 | }
23 |
24 |
25 | export default ConfirmTemplate;
--------------------------------------------------------------------------------
/server/models/Session.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 |
3 |
4 | const SessionSchema = new mongoose.Schema({
5 | user: {
6 | type: mongoose.Schema.Types.ObjectId,
7 | ref: 'User',
8 | required: true
9 | },
10 | date: {
11 | type: mongoose.Schema.Types.Date,
12 | default: Date.now()
13 | },
14 | room: {
15 | type: mongoose.Schema.Types.ObjectId,
16 | ref: 'Room',
17 | required: true
18 | },
19 | book: {
20 | type: mongoose.Schema.Types.ObjectId,
21 | ref: 'Book',
22 | required: true
23 | },
24 | part: {
25 | type: String,
26 | required: true
27 | }
28 | });
29 |
30 |
31 |
32 | const Session = mongoose.model('Session', SessionSchema);
33 | module.exports = Session;
--------------------------------------------------------------------------------
/server/models/Room.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const passportLocalMongoose = require('passport-local-mongoose');
3 |
4 | const roomSchema = new mongoose.Schema({
5 | password: {
6 | type: String,
7 | },
8 | username: {
9 | type: String,
10 | },
11 | isAdmin: {
12 | type: Boolean,
13 | default: false
14 | },
15 | currentUser: {
16 | type: mongoose.Schema.Types.ObjectId,
17 | ref: 'User',
18 | default: null
19 | },
20 | currentBook: {
21 | type: mongoose.Schema.Types.ObjectId,
22 | ref: 'Book',
23 | default: null
24 | },
25 | currentPart: {
26 | type: String,
27 | default: null
28 | }
29 | });
30 |
31 | roomSchema.plugin(passportLocalMongoose);
32 |
33 | const Room = mongoose.model('Room', roomSchema);
34 | module.exports = Room;
35 |
--------------------------------------------------------------------------------
/src/contexts/appContext.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react';
2 | import {serverAPI} from '../api/api';
3 | const Context = React.createContext();
4 |
5 | export class AppContextStore extends Component{
6 | state = {
7 | room: null
8 | }
9 | setRoom = room => {
10 | this.setState({room});
11 | }
12 | fetchRoomData = loginData => {
13 | serverAPI.post('/login', loginData)
14 | .then((res) => {
15 | if(res.data.room){
16 | this.setRoom(res.data.room)
17 | }
18 | });
19 | }
20 | render(){
21 | return(
22 |
26 | {this.props.children}
27 |
28 | )
29 | }
30 | }
31 |
32 |
33 | export default Context;
--------------------------------------------------------------------------------
/server/middleware/renderer.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOMServer from 'react-dom/server'
3 |
4 | // import our main App component
5 | import App from '../src/App';
6 |
7 | const path = require("path");
8 | const fs = require("fs");
9 |
10 | export default (req, res, next) => {
11 |
12 | // point to the html file created by CRA's build tool
13 | const filePath = path.resolve(__dirname, '..', '..', 'build', 'index.html');
14 |
15 | fs.readFile(filePath, 'utf8', (err, htmlData) => {
16 | if (err) {
17 | console.error('err', err);
18 | return res.status(404).end()
19 | }
20 |
21 | // render the app as a string
22 | const html = ReactDOMServer.renderToString();
23 |
24 | // inject the rendered app into our html and send it
25 | return res.send(
26 | htmlData.replace(
27 | '',
28 | `${html}
`
29 | )
30 | );
31 | });
32 | }
--------------------------------------------------------------------------------
/server/models/User.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 |
3 | const UserSchema = new mongoose.Schema({
4 | firstName: {
5 | type: String,
6 | },
7 | lastName: {
8 | type: String
9 | },
10 | email: {
11 | type: String,
12 | unique: true,
13 | },
14 | isAdmin: {
15 | type: Boolean,
16 | default: false,
17 | },
18 | currentRoom: {
19 | type: mongoose.Schema.Types.ObjectId,
20 | ref: 'Room',
21 | default: null
22 | },
23 | currentBook: {
24 | type: mongoose.Schema.Types.ObjectId,
25 | ref: 'Book',
26 | default: null
27 | },
28 | lastChapter: {
29 | type: String,
30 | },
31 | bookList: {
32 | type: [mongoose.Schema.Types.ObjectId],
33 | ref: 'BookList'
34 | },
35 | sessions: {
36 | type: [mongoose.Schema.Types.ObjectId],
37 | ref: 'Sessions'
38 | }
39 | });
40 |
41 | const User = mongoose.model('User', UserSchema);
42 | module.exports = User;
--------------------------------------------------------------------------------
/src/components/Modal/Modal.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react';
2 | import {Modal, Header, Button, Icon, Segment} from 'semantic-ui-react';
3 |
4 | class ModalTemplate extends Component{
5 | renderTriggerButton = () => {
6 | return (
7 |
8 |
9 |
14 |
15 |
16 | )
17 | }
18 | render(){
19 | return(
20 |
21 |
22 |
23 | {this.props.content}
24 |
25 |
26 | )
27 | }
28 | }
29 |
30 | export default ModalTemplate;
--------------------------------------------------------------------------------
/semantic.json:
--------------------------------------------------------------------------------
1 | {
2 | "base": "semantic\\",
3 | "paths": {
4 | "source": {
5 | "config": "src/theme.config",
6 | "definitions": "src/definitions/",
7 | "site": "src/site/",
8 | "themes": "src/themes/"
9 | },
10 | "output": {
11 | "packaged": "dist\\",
12 | "uncompressed": "dist\\components\\",
13 | "compressed": "dist\\components\\",
14 | "themes": "dist\\themes\\"
15 | },
16 | "clean": "dist/"
17 | },
18 | "permission": false,
19 | "autoInstall": false,
20 | "rtl": false,
21 | "components": ["reset", "site", "button", "container", "divider", "flag", "header", "icon", "image", "input", "label", "list", "loader", "rail", "reveal", "segment", "step", "breadcrumb", "form", "grid", "menu", "message", "table", "ad", "card", "comment", "feed", "item", "statistic", "accordion", "calendar", "checkbox", "dimmer", "dropdown", "embed", "modal", "nag", "placeholder", "popup", "progress", "slider", "rating", "search", "shape", "sidebar", "sticky", "tab", "text", "toast", "transition", "api", "form", "state", "visibility"],
22 | "version": "2.7.1"
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/AdminView/AdminView.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import RoomList from '../RoomList/RoomList';
3 | import UsersList from '../UsersList/UsersList';
4 | import BooksList from '../BooksList/BooksList';
5 | import NavBar from '../NavBar/NavBar';
6 | import adminContext from '../../contexts/adminContext';
7 |
8 | class AdminView extends React.Component{
9 | renderDisplayContent = () => {
10 | if(!this.context.activeMenuItem){
11 | return Loading...
12 | }
13 | if(this.context.activeMenuItem === "Rooms"){
14 | return
15 | }
16 | if(this.context.activeMenuItem === "Books"){
17 | return
18 | }
19 | if(this.context.activeMenuItem === "Users"){
20 | return
21 | }
22 | }
23 | render(){
24 | return(
25 |
26 |
27 | {this.renderDisplayContent()}
28 |
29 | )
30 | }
31 | }
32 | AdminView.contextType = adminContext;
33 | export default AdminView;
--------------------------------------------------------------------------------
/src/components/ModalNav/ModalNav.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react';
2 | import {Modal, Header, Button, Icon, Segment} from 'semantic-ui-react';
3 | import adminContext from '../../contexts/adminContext';
4 |
5 |
6 | class ModalNavTemplate extends Component{
7 | renderTriggerButton = () => {
8 | return (
9 |
10 |
11 |
16 |
17 |
18 | )
19 | }
20 | render(){
21 | return(
22 | this.context.dispalyNavModal(false) }>
23 |
24 |
25 | {this.props.content}
26 |
27 |
28 | )
29 | }
30 | }
31 |
32 | ModalNavTemplate.contextType = adminContext;
33 | export default ModalNavTemplate;
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "korenmern",
3 | "version": "0.1.0",
4 | "private": true,
5 | "main": "main.js",
6 | "productName": "Audio System",
7 | "dependencies": {
8 | "axios": "^0.18.0",
9 | "cors": "^2.8.5",
10 | "dotenv": "^6.2.0",
11 | "formidable": "^1.2.1",
12 | "ip": "^1.1.5",
13 | "peerjs": "^0.3.20",
14 | "pitchfinder": "^2.0.9",
15 | "react": "^16.7.0",
16 | "react-dom": "^16.7.0",
17 | "react-scripts": "^2.1.5",
18 | "react-semantic-ui-range": "^0.6.2",
19 | "semantic-ui-css": "^2.4.1",
20 | "semantic-ui-react": "^0.85.0"
21 | },
22 | "scripts": {
23 | "start": "electron main.js",
24 | "build": "react-scripts build",
25 | "build-start": "npm run build && electron main.js",
26 | "package-win": "electron-packager . --overwrite --ignore=.mp3 --platform=win32 --arch=x64 --asar --prune=true --out=release-builds --version-string.CompanyName=CE --version-string.FileDescription=CE --version-string.ProductName=\"Audio System\"",
27 | "package-win-with-assets": "electron-packager . --overwrite --platform=win32 --arch=x64 --asar --prune=true --out=release-builds --version-string.CompanyName=CE --version-string.FileDescription=CE --version-string.ProductName=\"Audio System\""
28 | },
29 | "eslintConfig": {
30 | "extends": "react-app"
31 | },
32 | "browserslist": [
33 | ">0.2%",
34 | "not dead",
35 | "not ie <= 11",
36 | "not op_mini all"
37 | ],
38 | "devDependencies": {
39 | "electron": "^4.0.5",
40 | "webpack-cli": "^3.2.3"
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/components/App/App.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react';
2 | import ModalTemplate from '../Modal/Modal';
3 | import LoginForm from '../LoginForm/LoginForm';
4 | import appContext from '../../contexts/appContext';
5 | import UserView from '../UserView/UserView';
6 | import AdminView from '../AdminView/AdminView';
7 | import {AdminContextStore} from '../../contexts/adminContext';
8 | import {UserContextStore} from '../../contexts/userContext';
9 |
10 | class App extends Component{
11 | renderApp = () => {
12 | if(!this.context.room){
13 | return(
14 |
15 | } actions="" />
16 |
17 | )
18 | }
19 | if(this.context.room.isAdmin === false){
20 | return (
21 |
22 |
23 |
24 |
25 |
26 | )
27 | }
28 | if(this.context.room.isAdmin === true){
29 | return (
30 |
35 | )
36 | }
37 | }
38 | render(){
39 | return(
40 |
41 | {this.renderApp()}
42 |
43 | )
44 | }
45 | }
46 |
47 | App.contextType = appContext;
48 | export default App;
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
15 |
16 |
25 | React App
26 |
27 |
28 |
29 |
30 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/src/components/UserView/UserView.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react';
2 | import {Button, Icon} from 'semantic-ui-react';
3 | import userContext from '../../contexts/userContext';
4 |
5 |
6 |
7 | class UserView extends Component{
8 | renderView = () => {
9 | let room = this.props.room;
10 | if(!room || !room.currentUser || !room.currentBook || !room.currentPart ){
11 | return (
12 |