[enh] The delete action should work
This commit is contained in:
		
							parent
							
								
									3ce2e4514d
								
							
						
					
					
						commit
						b0c6043741
					
				
							
								
								
									
										4
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								index.js
									
									
									
									
									
								
							| @ -29,8 +29,6 @@ dbInit.init({ | ||||
|   seed : process.env.DB_SEED | ||||
| }); | ||||
| 
 | ||||
| console.log( "exit") | ||||
| 
 | ||||
| const express = require('express'); | ||||
| const app = express(); | ||||
| 
 | ||||
| @ -71,7 +69,7 @@ app.post('/*', routes.add); | ||||
| app.get('/*', routes.main); | ||||
| app.patch('/*', routes.main); | ||||
| app.put('/*', routes.main); | ||||
| app.delete('/*', routes.main); | ||||
| app.delete('/delete/:id', routes.delete); | ||||
| 
 | ||||
| 
 | ||||
| app.listen(port, () => { | ||||
|  | ||||
							
								
								
									
										219
									
								
								public/js/app.js
									
									
									
									
									
								
							
							
						
						
									
										219
									
								
								public/js/app.js
									
									
									
									
									
								
							| @ -1,107 +1,128 @@ | ||||
| /* global initData, authorizationToken */ | ||||
| 
 | ||||
| // List of HTML entities for escaping.
 | ||||
| var htmlEscapes = { | ||||
|   '&': '&', | ||||
|   '<': '<', | ||||
|   '>': '>', | ||||
|   '"': '"', | ||||
|   "'": ''', | ||||
|   '/': '/' | ||||
| }; | ||||
| $(function(){ | ||||
|              | ||||
|   // List of HTML entities for escaping.
 | ||||
|   var htmlEscapes = { | ||||
|     '&': '&', | ||||
|     '<': '<', | ||||
|     '>': '>', | ||||
|     '"': '"', | ||||
|     "'": ''', | ||||
|     '/': '/' | ||||
|   }; | ||||
| 
 | ||||
| // Regex containing the keys listed immediately above.
 | ||||
| var htmlEscaper = /[&<>"'\/]/g; | ||||
|   // Regex containing the keys listed immediately above.
 | ||||
|   var htmlEscaper = /[&<>"'\/]/g; | ||||
| 
 | ||||
| // Escape a string for HTML interpolation.
 | ||||
| escape = function(string) { | ||||
|   return ('' + string).replace(htmlEscaper, function(match) { | ||||
|     return htmlEscapes[match]; | ||||
|   }); | ||||
| }; | ||||
| var urlRegex = /(\S+): (https?://[^\s]+)/g; | ||||
| url = function(string){ | ||||
|   return ''+string.replace(urlRegex, '<a target="_blank" href="$2">$1</a>'); | ||||
| }; | ||||
| var titleRegex = /^(.*\n)/; | ||||
| title = function(string){ | ||||
|   return ''+string.replace(titleRegex, '<b>$1</b>'); | ||||
| }; | ||||
| var cmdRegex = /```([^`]*?)```/g; | ||||
| cmd = function(string) { | ||||
|   return ''+string.replace(cmdRegex, '<span class="cmd">$1</span>'); | ||||
| }; | ||||
| date = function(string){ | ||||
|   var D = new Date(string); | ||||
|   return D.toLocaleDateString()+" "+D.toLocaleTimeString(); | ||||
| }; | ||||
| mailRegexp = /(.*)  <(.+@.+)>/; | ||||
| mail = function( string ){ | ||||
|   return ''+string.replace(mailRegexp, '<a href="mailto:$2">$1</a>'); | ||||
| }; | ||||
| function updatePage(data){ | ||||
|    | ||||
|   var content = ""; | ||||
|   var item = {}; | ||||
|   var id = ''; | ||||
|   // If the log entry is unique, simulate a search result
 | ||||
|   if( ! data['hits'] ){ | ||||
|     data = {hits:{hits:[data]}}; | ||||
|   } | ||||
|   $.each(data.hits.hits, (k,v)=>{ | ||||
|      | ||||
|     item = v._source; | ||||
|     id = v._id; | ||||
|     content += ` | ||||
|   // Escape a string for HTML interpolation.
 | ||||
|   escape = function(string) { | ||||
|     return ('' + string).replace(htmlEscaper, function(match) { | ||||
|       return htmlEscapes[match]; | ||||
|     }); | ||||
|   }; | ||||
|   var urlRegex = /(\S+): (https?://[^\s]+)/g; | ||||
|   url = function(string){ | ||||
|     return ''+string.replace(urlRegex, '<a target="_blank" href="$2">$1</a>'); | ||||
|   }; | ||||
|   var titleRegex = /^(.*\n)/; | ||||
|   title = function(string){ | ||||
|     return ''+string.replace(titleRegex, '<b>$1</b>'); | ||||
|   }; | ||||
|   var cmdRegex = /```([^`]*?)```/g; | ||||
|   cmd = function(string) { | ||||
|     return ''+string.replace(cmdRegex, '<span class="cmd">$1</span>'); | ||||
|   }; | ||||
|   date = function(string){ | ||||
|     var D = new Date(string); | ||||
|     return D.toLocaleDateString()+" "+D.toLocaleTimeString(); | ||||
|   }; | ||||
|   mailRegexp = /(.*)  <(.+@.+)>/; | ||||
|   mail = function( string ){ | ||||
|     return ''+string.replace(mailRegexp, `<a href="mailto:${string}">$1</a>`); | ||||
|   }; | ||||
|   function updatePage(data){ | ||||
| 
 | ||||
|     <div class="log row"> | ||||
|       <div class="meta col-lg-2 "> | ||||
| 	  <p class="server">  ${escape(item.server)} </p> | ||||
| 	  <a href="/log/${id}"> | ||||
| 	    ${date(escape(item.created_at))} <br/> | ||||
| 	  </a> | ||||
| 	  <div class="d-none d-lg-block"> | ||||
| 		  <p class="author">  ${mail(escape(item.author))} </p> | ||||
| 		  <p> | ||||
| 		    <a class="actions-toggle btn-link btn-sm">Actions</a> | ||||
| 		  </p> | ||||
| 		  <div class="actions btn-group btn-group-sm" role="group" aria-label="log actions"> | ||||
| 		    <a class="destroy btn btn btn-outline-secondary" href="/destroy/${id}">Remove</a> | ||||
| 		    <a class="edit btn btn btn-outline-secondary" href="/edit/${id}">Edit</a> | ||||
| 		  </div> | ||||
| 	  </div> | ||||
|       </div> | ||||
|       <div class="col-lg"> | ||||
|         <pre> ${cmd(title(url(escape(item.content))))}</pre> | ||||
|       </div> | ||||
|     </div> | ||||
|     `;
 | ||||
|   }); | ||||
|   $("#content").html(content); | ||||
|    | ||||
| } | ||||
| 
 | ||||
| $("input").on("keyup",function(e){ | ||||
|   const el = $(e.target); | ||||
|   const val = el.val(); | ||||
|   if( val.length < 3 ){ return; } | ||||
|   $.ajax("/search",{ | ||||
|     beforeSend: function(request) { | ||||
|     request.setRequestHeader("authorizationToken", authorizationToken); | ||||
|     }, | ||||
|     data: { | ||||
|       q:val, | ||||
|     var content = ""; | ||||
|     var item = {}; | ||||
|     var id = ''; | ||||
|     // If the log entry is unique, simulate a search result
 | ||||
|     if( ! data['hits'] ){ | ||||
|       data = {hits:{hits:[data]}}; | ||||
|     } | ||||
|   })   | ||||
|   .done(function(data) { | ||||
|     updatePage(data); | ||||
|   }) | ||||
|   .fail(function() { | ||||
|     alert( "error" ); | ||||
|     $.each(data.hits.hits, (k,v)=>{ | ||||
| 
 | ||||
|       item = v._source; | ||||
|       id = v._id; | ||||
|       content += ` | ||||
| 
 | ||||
|       <div class="log row"> | ||||
|         <div class="meta col-lg-2 "> | ||||
|         <p class="server">  ${escape(item.server)} </p> | ||||
|         <a href="/log/${id}"> | ||||
|           ${date(escape(item.created_at))} <br/> | ||||
|         </a> | ||||
|         <div class="d-none d-lg-block"> | ||||
|             <p class="author">  ${mail(escape(item.author))} </p> | ||||
|             <p> | ||||
|               <a class="actions-toggle btn-link btn-sm">Actions</a> | ||||
|             </p> | ||||
|             <div class="actions btn-group btn-group-sm" role="group" aria-label="log actions"> | ||||
|               <a class="delete btn btn btn-outline-secondary" href="/delete/${id}">Remove</a> | ||||
|               <a class="edit btn btn btn-outline-secondary" href="/edit/${id}">Edit</a> | ||||
|             </div> | ||||
|         </div> | ||||
|         </div> | ||||
|         <div class="col-lg"> | ||||
|           <pre> ${cmd(title(url(escape(item.content))))}</pre> | ||||
|         </div> | ||||
|       </div> | ||||
|       `;
 | ||||
|     }); | ||||
|     $("#content").html(content); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   $("input").on("keyup",function(e){ | ||||
|     const el = $(e.target); | ||||
|     const val = el.val(); | ||||
|     if( val.length < 3 ){ return; } | ||||
|     $.ajax("/search",{ | ||||
|       beforeSend: function(request) { | ||||
|       request.setRequestHeader("authorizationToken", authorizationToken); | ||||
|       }, | ||||
|       data: { | ||||
|         q:val, | ||||
|       } | ||||
|     })   | ||||
|     .done(function(data) { | ||||
|       updatePage(data); | ||||
|     }) | ||||
|     .fail(function() { | ||||
|       alert( "error" ); | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   updatePage( initData ); | ||||
| 
 | ||||
|   $(".actions-toggle").on("click",(e) => { var el=e.target; $(el).parent().siblings('.actions').show(); $(el).hide(); } ) | ||||
| 
 | ||||
|   $('.delete').on('click', (e) => {  | ||||
|     const el = $(e.target); | ||||
|     const url = el.attr('href'); | ||||
|     $.ajax(url,{ | ||||
|       method: "DELETE", | ||||
|       beforeSend: function(request) { | ||||
|         request.setRequestHeader("authorizationToken", authorizationToken); | ||||
|       } | ||||
|     })   | ||||
|     .done(function(data) { | ||||
|      $(el).parents('.log').remove(); | ||||
|     }) | ||||
|     .fail(function() { | ||||
|       alert( "error" ); | ||||
|     }); | ||||
|     return false; | ||||
|   }); | ||||
| 
 | ||||
| }); | ||||
| 
 | ||||
| updatePage( initData ); | ||||
| 
 | ||||
| $(".actions-toggle").on("click",(e) => { var el=e.target; $(el).parent().siblings('.actions').show(); $(el).hide(); } ) | ||||
| 
 | ||||
|  | ||||
| @ -54,6 +54,53 @@ const routes = { | ||||
|           res.json({"health":0,"msg":"Lost connection to ES"}); | ||||
|       }); | ||||
|     }, | ||||
|     delete: (req,res) => { | ||||
|       const id= req.params.id; | ||||
|       // Reindex the doc to the "trash" index
 | ||||
|       var log = client.reindex({ | ||||
|         refresh: true, | ||||
|         max_docs: 1, | ||||
|         body: { | ||||
|           source: { | ||||
|             index: 'changelog', | ||||
|             query: { | ||||
|               term: { | ||||
|                 _id: id | ||||
|               } | ||||
|             }           | ||||
|           }, | ||||
|           dest: { | ||||
|             index: 'changelog-trash', | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|       .then( (results, err) => { | ||||
|          | ||||
|           console.log(`reindexing success for id ${id}`) | ||||
|           // Remove it from the original index
 | ||||
|           return client.delete({ | ||||
|             index: "changelog", | ||||
|             id: id | ||||
|           }); | ||||
| 
 | ||||
|         }, (e) => { | ||||
| 
 | ||||
|           console.log("reindexing error") | ||||
|           res.status(400); | ||||
|           res.end("error"); | ||||
| 
 | ||||
|       }) | ||||
|       .then( (results, err) => { | ||||
|          | ||||
|           console.log(`Delete success for id ${id}`) | ||||
|           res.end("ok"); | ||||
| 
 | ||||
|         },(results, err) => { | ||||
|           console.log(`Delete error for id ${id}`) | ||||
|           res.status(400); | ||||
|           res.end("error");       | ||||
|       }); | ||||
|     }, | ||||
|     add: (req, res) => { | ||||
| 
 | ||||
|       const body = req.body; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user