mirror of
				https://codeberg.org/buzzcode2007/FCC-Project-URLShortener.git
				synced 2025-05-21 03:06:34 +00:00 
			
		
		
		
	Create the API and management
This commit is contained in:
		
							parent
							
								
									02709cccf4
								
							
						
					
					
						commit
						31e074a5a8
					
				
					 3 changed files with 213 additions and 0 deletions
				
			
		
							
								
								
									
										97
									
								
								scripts/database/URLs.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										97
									
								
								scripts/database/URLs.js
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,97 @@ | |||
| const Mongoose = require(`mongoose`); | ||||
| const DBManagement = require(`./management`).DBManagement; | ||||
| const URLs = require(`../utilities/URLs`).URLs; | ||||
| const CustomErrors = require(`../utilities/errors`).CustomErrors; | ||||
| const HashTools = require(`../utilities/hash`).HashTools; | ||||
| 
 | ||||
| class URLManage extends DBManagement { | ||||
| 	/* | ||||
| 		Begin the URL management and connection.  | ||||
| 	*/ | ||||
| 	constructor () { | ||||
| 		super(`localhost:27017`); | ||||
| 
 | ||||
| 		this.schema = new Mongoose.Schema({ | ||||
| 			"original": {"type": String, "required": true},  | ||||
| 			"shortened": {"type": String, "required": true} | ||||
| 		}); | ||||
| 
 | ||||
| 		this[`state`].then(() => {this.model = this[`connection`].model(`URL`, this[`schema`]);}) | ||||
| 	}; | ||||
| 
 | ||||
| 	/* | ||||
| 		Open the original URL given an identifier.  | ||||
| 		 | ||||
| 		@param {string} ID the ID | ||||
| 		@param {function} done the callback function when successful | ||||
| 		@return {string} the original URL | ||||
| 	*/ | ||||
| 	open (ID, done) { | ||||
| 		this.state.then(() => { | ||||
| 			this.model.findOne({"shortened": ID}).then((DATA) => { | ||||
| 				console.log((DATA) ? `Lengthened shortened URL with ID ${ID} to ${DATA[`original`]}.` : `No shortened URL with ID ${ID}.`); | ||||
| 				return done((DATA) ? DATA[`original`] : null); | ||||
| 			}).catch((ERR) => { | ||||
| 				throw ERR; | ||||
| 			}) | ||||
| 		}).catch((ERROR) => {throw new CustomErrors.DBProblem(ERROR.message)}); | ||||
| 	}; | ||||
| 
 | ||||
| 	/* | ||||
| 		Search for a short link given a URL.  | ||||
| 
 | ||||
| 		@param {string} URL the URL to shorten | ||||
| 		@param {function} done the callback function when successful | ||||
| 		@return {string} ID the ID | ||||
| 	*/ | ||||
| 	search(URL, done) { | ||||
| 		// Throw an error for an incorrect URL. 
 | ||||
| 		if (!URLs.test(URL)) { | ||||
| 			throw new CustomErrors.URL(null, URL); | ||||
| 		}; | ||||
| 
 | ||||
| 		this.state.then(() => { | ||||
| 			this.model.findOne({"original": URL}).then((DATA) => { | ||||
| 				console.log((DATA) ? `The ID ${DATA[`shortened`]} refers to ${URL}.` : `No ID pertains to ${URL}.`); | ||||
| 				return done((DATA) ? DATA[`shortened`] : null); | ||||
| 			}).catch((ERR) => { | ||||
| 				throw ERR; | ||||
| 			}); | ||||
| 		}).catch((ERROR) => {throw new CustomErrors.DBProblem(ERROR.message)}) | ||||
| 	}; | ||||
| 
 | ||||
| 	/* | ||||
| 		Shorten the URL.  | ||||
| 
 | ||||
| 		@param {string} URL the URL to shorten | ||||
| 		@param {function} done the callback function | ||||
| 		@return {string} ID the ID | ||||
| 	*/ | ||||
| 	create(URL, done) { | ||||
| 		// Throw an error for an incorrect URL. 
 | ||||
| 		if (!URLs.test(URL)) { | ||||
| 			throw new CustomErrors.URL(null, URL); | ||||
| 		}; | ||||
| 		 | ||||
| 		let ENTRY = {"original": URL}; | ||||
| 		const save = (ID) => { | ||||
| 			(ID) | ||||
| 				? done(ID) | ||||
| 				: HashTools.digest(URL, {"output": "Number"}).then((HASH) => { | ||||
| 					ENTRY[`shortened`] = HASH; | ||||
| 		 | ||||
| 					let DOCUMENT = new this.model(ENTRY); | ||||
| 		 | ||||
| 					this.state.then(() => { | ||||
| 						DOCUMENT.save().then((DATA) => {done(HASH)}).catch((ERR) => {throw ERR;}) | ||||
| 					}).catch((ERROR) => {throw new CustomErrors.DBProblem(ERROR.message)}); | ||||
| 				}); | ||||
| 		} | ||||
| 
 | ||||
| 		this.search((ENTRY[`original`]), save); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| module.exports = {URLManage}; | ||||
							
								
								
									
										21
									
								
								scripts/database/management.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								scripts/database/management.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| const Mongoose = require(`mongoose`); | ||||
| const CustomErrors = require(`../utilities/errors`).CustomErrors; | ||||
| 
 | ||||
| class DBManagement { | ||||
|     /* | ||||
|         Begin the connection.  | ||||
| 
 | ||||
|         @param {string} DOMAIN the domain | ||||
|         @param {string} DBNAME the database name | ||||
|     */ | ||||
|     constructor (DOMAIN, DBNAME) { | ||||
|         const throwError = (ERROR) => {throw ERROR;}; | ||||
| 
 | ||||
|         this[`state`] = Mongoose.connect(`mongodb://${DOMAIN}/${(DBNAME) ? DBNAME : ""}`, { useNewUrlParser: true, useUnifiedTopology: true }).then((CONNECTION) => { | ||||
|                 this[`connection`] = CONNECTION.connection; | ||||
|                 console.log(`Connection successful.`); | ||||
|         }).catch(throwError); | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| module.exports = {DBManagement}; | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue