diff --git a/app/app.class.js b/app/app.class.js new file mode 100644 index 0000000..83b7040 --- /dev/null +++ b/app/app.class.js @@ -0,0 +1,136 @@ +'use strict' + +// Depedencies +let chokidar = require( 'chokidar' ), + path = require( 'path' ), + colors = require( 'colors' ), + ip = require( 'ip' ), + socket_io_client = require( 'socket.io-client' ) + +/** + * App class + */ +class App +{ + /** + * Constructor + */ + constructor( options ) + { + this.set_options( options ) + this.set_args() + this.set_watcher() + this.set_socket() + } + + /** + * Set options + */ + set_options( options ) + { + // No option + if( typeof options !== 'object' ) + options = {} + + // Defaults + if( typeof options.domain === 'undefined' ) + options.domain = ip.address() + + if( typeof options.port === 'undefined' ) + options.port = 3000 + + // Save + this.options = options + } + + /** + * Set args + * Test missing arg + */ + set_args() + { + // Set up + this.arguments = process.argv.slice( 2 ) + + // Missing project slug + if( this.arguments.length === 0 ) + { + // Stop process + console.log( 'Missing arguments: first argument should be the projet slug'.red ) + process.exit() + } + + // Wrong project slug + if( !this.arguments[ 0 ].match( /^[a-z_-][a-z0-9_-]+$/ ) ) + { + // Stop process + console.log( 'Wrong arguments: projet slug'.red ) + process.exit() + } + } + + /** + * Set socket + * Connect to site + */ + set_socket() + { + // Set up + this.socket = socket_io_client( `http://${this.options.domain}:${this.options.port}` ) + + // Connect event + this.socket.on( 'connect', () => + { + console.log( 'connected' ) + this.socket.emit( 'start_project', { slug : this.arguments[ 0 ] } ) + } ) + } + + /** + * Set watcher + * Listen to modifications on file and folders + */ + set_watcher() + { + // Set up + this.watcher = chokidar.watch( + process.cwd(), + { + ignored : /[\/\\]\./, + ignoreInitial : true + } + ) + + // Add event + this.watcher.on( 'add', ( path ) => + { + console.log( 'add:'.green.bold, path ) + } ) + + // Change event + this.watcher.on( 'change', ( path ) => + { + console.log( 'change:'.green.bold, path ) + } ) + + // Unlink event + this.watcher.on( 'unlink', ( path ) => + { + console.log( 'unlink:'.green.bold, path ) + } ) + + // AddDir event + this.watcher.on( 'addDir', ( path ) => + { + console.log( 'addDir:'.green.bold, path ) + } ) + + // UnlinkDir event + this.watcher.on( 'unlinkDir', ( path ) => + { + console.log( 'unlinkDir:'.green.bold, path ) + } ) + } +} + +module.exports = App \ No newline at end of file diff --git a/app/index.js b/app/index.js index 897bd65..3f06c73 100644 --- a/app/index.js +++ b/app/index.js @@ -1,41 +1,4 @@ -// Depedencies -var chokidar = require( 'chokidar' ), - path = require( 'path' ), - colors = require( 'colors' ); +'use strict' -// Working directory -var cwd = process.cwd(); - -// Watcher -var watcher = chokidar.watch( - cwd, - { - ignored : /[\/\\]\./, - ignoreInitial : true - } - ); - -watcher.on( 'add', ( path ) => -{ - console.log( 'add:'.green.bold, path ); -} ); - -watcher.on( 'change', ( path ) => -{ - console.log( 'change:'.green.bold, path ); -} ); - -watcher.on( 'unlink', ( path ) => -{ - console.log( 'unlink:'.green.bold, path ); -} ); - -watcher.on( 'addDir', ( path ) => -{ - console.log( 'addDir:'.green.bold, path ); -} ); - -watcher.on( 'unlinkDir', ( path ) => -{ - console.log( 'unlinkDir:'.green.bold, path ); -} ); \ No newline at end of file +let App = require( './app.class.js' ), + app = new App() \ No newline at end of file diff --git a/app/package.json b/app/package.json index ac80b83..e6b147f 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,8 @@ "homepage": "https://github.com/brunosimon/code-spectactor", "dependencies": { "chokidar": "^1.5.1", - "colors": "^1.1.2" + "colors": "^1.1.2", + "ip": "^1.1.3", + "socket.io-client": "^1.4.6" } } diff --git a/site/app.class.js b/site/app.class.js new file mode 100644 index 0000000..acca289 --- /dev/null +++ b/site/app.class.js @@ -0,0 +1,121 @@ +'use strict' + +// Dependencies +let express = require( 'express' ), + helmet = require( 'helmet' ), + http = require( 'http' ), + socket_io = require( 'socket.io' ), + colors = require( 'colors' ), + path = require( 'path' ), + ip = require( 'ip' ), + util = require( 'util' ) + +/** + * App class + */ +class App +{ + /** + * Constructor + */ + constructor( _options ) + { + this.set_options( _options ) + this.set_models() + this.set_express() + this.set_server() + this.set_socket() + } + + /** + * Set models + */ + set_models() + { + let Projects = require( './models/projects.class.js' ) + this.projects = new Projects() + + var project = this.projects.create_project( 'test' ) + + project.update_file( 'toto/tata/tete/tutu.txt', 'content 1' ) + project.update_file( 'toto/tata/lorem.txt', 'content 2' ) + project.update_file( 'toto/tata/ipsum.txt', 'content 3' ) + + project.delete_file( 'toto/tata/tete/tutu.txt' ) + project.delete_file( 'toto/tata/lorem.txt' ) + project.delete_file( 'toto/tata/ipsum.txt' ) + + console.log( util.inspect( project.folders, { depth: null, colors: true } ) ) + } + + /** + * Set options + */ + set_options( _options ) + { + // No option + if( typeof _options !== 'object' ) + _options = {} + + if( typeof _options.port === 'undefined' ) + _options.port = 3000 + + // Save + this.options = _options + } + + /** + * Set express + * Start express and set controllers + */ + set_express() + { + // Set up + this.express = express() + + // Controllers + this.express.use( '/codes', require( './controllers/index.js' ) ) + } + + /** + * Set server + */ + set_server() + { + // Set up + this.server = http.createServer( this.express ) + + // Start + this.server.listen( this.options.port, () => + { + // URL + let url = 'http://' + ip.address() + ':' + this.options.port + + console.log( colors.green( '---------------------------' ) ) + console.log( 'server'.green.bold + ' - ' + 'started'.cyan ) + console.log( 'server'.green.bold + ' - ' + url.cyan ) + } ) + } + + /** + * Set socket + */ + set_socket() + { + // Set up + this.io = socket_io.listen( this.server ) + + // Connection event + this.io.on( 'connection', ( socket ) => + { + console.log( 'socket'.green.bold + ' - ' + 'connect'.cyan + ' - ' + socket.id.cyan ) + + socket.on( 'start_project', ( data ) => + { + + } ) + } ) + } +} + +module.exports = App \ No newline at end of file diff --git a/site/index.js b/site/index.js index 782b194..3f06c73 100644 --- a/site/index.js +++ b/site/index.js @@ -1,31 +1,4 @@ -// Dependencies -var express = require( 'express' ), - helmet = require( 'helmet' ), - http = require( 'http' ), - socket_io = require( 'socket.io' ), - colors = require( 'colors' ), - path = require( 'path' ), - ip = require( 'ip' ); +'use strict' -// Express -var express = express(); - -express.use( '/codes', require( './controllers/index.js' ) ) - -// Server -var server = http.createServer( express ), - server_port = 3000; - -// Server -server.listen( server_port, function() -{ - // URL - var url = 'http://' + ip.address() + ':' + server_port; - - console.log( colors.green( '---------------------------' ) ); - console.log( 'server'.green.bold + ' - ' + 'started'.cyan ); - console.log( 'server'.green.bold + ' - ' + url.cyan ); -} ); - -// Socket -var io = socket_io.listen( server ); +let App = require( './app.class.js' ), + app = new App() \ No newline at end of file diff --git a/site/models/file.class.js b/site/models/file.class.js new file mode 100644 index 0000000..08345f8 --- /dev/null +++ b/site/models/file.class.js @@ -0,0 +1,34 @@ +'use strict' + +class File +{ + constructor( _name, _content ) + { + // Set up + this.name = _name + this.versions = [] + + // Create first version + if( typeof _content !== 'undefined' ) + this.create_version( _content ) + } + + create_version( content ) + { + // Create version + let version = {} + + // Set up + version.date = new Date() + version.content = content + + this.versions.push( version ) + } + + destructor() + { + console.log( 'destruct' ) + } +} + +module.exports = File \ No newline at end of file diff --git a/site/models/project.class.js b/site/models/project.class.js new file mode 100644 index 0000000..4918c97 --- /dev/null +++ b/site/models/project.class.js @@ -0,0 +1,135 @@ +'use strict' + +// Dependencies +let path = require( 'path' ), + util = require( 'util' ), + File = require( './file.class.js' ) + +class Project +{ + constructor() + { + this.folders = { + root: + { + name : 'root', + files : {}, + folders: {} + } + } + } + + update_file( _path, _content ) + { + // Set up + let normalize_path = path.normalize( _path ), + parsed_path = path.parse( normalize_path ) + + // Retrieve folder + let folder = this.get_folder( parsed_path.dir ) + + // Folder doesn't exist + if( !folder ) + { + // Create folders + folder = this.create_folder( parsed_path.dir ) + } + + // Retrieve file + let file = folder.files[ parsed_path.base ] + + // File doesn't exist + if( !file ) + { + file = new File( parsed_path.base ) + folder.files[ file.name ] = file + } + + file.create_version( _content ) + } + + get_folder( _path ) + { + let path_parts = _path.split( path.sep ), + folder = this.folders.root + + for( let _path_part of path_parts ) + { + folder = folder.folders[ _path_part ] + + // Folder not found + if(typeof folder === 'undefined') + return false + } + + return folder + } + + create_folder( _path ) + { + // Set up + let path_parts = _path.split( path.sep ), + folder = this.folders.root + + for( let _path_part of path_parts ) + { + // Temporary folder + let __folder = folder.folders[ _path_part ] + + // Folder doesn't exist + if( typeof __folder === 'undefined' ) + { + __folder = {} + __folder.name = _path_part + __folder.files = {} + __folder.folders = {} + + folder.folders[ _path_part ] = __folder + } + + folder = __folder + } + + return folder; + } + + // clean_folders() + // { + // // Empty all + // this.folders.all = {} + + // let clean_folder = function( folder ) + // { + // for( let _folder_name in folder.folders ) + // { + // clean_folder( folder.folders[ _folder_name ] ) + // } + // } + + // clean_folder( this.folders.root ) + // } + + delete_file( _path ) + { + // Set up + let normalize_path = path.normalize( _path ), + parsed_path = path.parse( normalize_path ) + + // Retrieve folder + let folder = this.get_folder( parsed_path.dir ) + + // Folder found + if( folder ) + { + let file = folder.files[ parsed_path.base ] + + // File found + if( file ) + { + delete folder.files[ parsed_path.base ] + } + } + } +} + +module.exports = Project \ No newline at end of file diff --git a/site/models/projects.class.js b/site/models/projects.class.js new file mode 100644 index 0000000..9301daf --- /dev/null +++ b/site/models/projects.class.js @@ -0,0 +1,38 @@ +'use strict' + +let Project = require( './project.class.js' ) + +class Projects +{ + constructor() + { + this.all = {} + } + + create_project( _slug ) + { + // Create project + let project = new Project( _slug ) + + // Save + this.all[ project.slug ] = project + + // Return + return project + } + + get_project_by_slug( _slug ) + { + // Find project + let project = this.all[ _slug ] + + // Found + if( project ) + return project + + // Not found + return false + } +} + +module.exports = Projects \ No newline at end of file diff --git a/test-folder/udshfiuhsdf/iuisduhfsdf b/test-folder/udshfiuhsdf/iuisduhfsdf index e69de29..c1f5866 100644 --- a/test-folder/udshfiuhsdf/iuisduhfsdf +++ b/test-folder/udshfiuhsdf/iuisduhfsdf @@ -0,0 +1 @@ +sdfsdfdsf \ No newline at end of file