1+ const stream = require ( 'stream' ) ;
2+ const await = require ( 'await' )
3+ const fs = require ( 'fs' ) ;
4+ const path = require ( 'path' ) ;
5+
6+ const db = require ( '../config/db.config.js' ) ;
7+ const Customer = db . Customer ;
8+
9+ const csv = require ( 'fast-csv' ) ;
10+ const Json2csvParser = require ( 'json2csv' ) . Parser ;
11+
12+ /**
13+ * Upload Single CSV file/ and Import data to MySQL/PostgreSQL database
14+ * @param {* } req
15+ * @param {* } res
16+ */
17+ exports . uploadFile = ( req , res ) => {
18+ try {
19+ const customers = [ ] ;
20+ fs . createReadStream ( __basedir + "/uploads/" + req . file . filename )
21+ . pipe ( csv . parse ( { headers : true } ) )
22+ . on ( 'error' , error => {
23+ console . error ( error ) ;
24+ throw error . message ;
25+ } )
26+ . on ( 'data' , row => {
27+ customers . push ( row ) ;
28+ console . log ( row ) ;
29+ } )
30+ . on ( 'end' , ( ) => {
31+ // Save customers to MySQL/PostgreSQL database
32+ Customer . bulkCreate ( customers ) . then ( ( ) => {
33+ const result = {
34+ status : "ok" ,
35+ filename : req . file . originalname ,
36+ message : "Upload Successfully!" ,
37+ }
38+
39+ res . json ( result ) ;
40+ } ) ;
41+ } ) ;
42+ } catch ( error ) {
43+ const result = {
44+ status : "fail" ,
45+ filename : req . file . originalname ,
46+ message : "Upload Error! message = " + error . message
47+ }
48+ res . json ( result ) ;
49+ }
50+ }
51+
52+ /**
53+ * Upload multiple Excel Files
54+ *
55+ * @param {* } req
56+ * @param {* } res
57+ */
58+ exports . uploadMultipleFiles = async ( req , res ) => {
59+ const messages = [ ] ;
60+
61+ for ( const file of req . files ) {
62+ try {
63+ // Parsing CSV Files to data array objects
64+ const csvParserStream = fs . createReadStream ( __basedir + "/uploads/" + file . filename )
65+ . pipe ( csv . parse ( { headers : true } ) ) ;
66+
67+ var end = new Promise ( function ( resolve , reject ) {
68+ let customers = [ ] ;
69+
70+ csvParserStream . on ( 'data' , object => {
71+ customers . push ( object ) ;
72+ console . log ( object ) ;
73+ } ) ;
74+ csvParserStream . on ( 'end' , ( ) => {
75+ resolve ( customers ) ;
76+ } ) ;
77+ csvParserStream . on ( 'error' , error => {
78+ console . error ( error ) ;
79+ reject
80+ } ) ; // or something like that. might need to close `hash`
81+ } ) ;
82+
83+ await ( async function ( ) {
84+ let customers = await end ;
85+
86+ // save customers to MySQL/PostgreSQL database
87+ await Customer . bulkCreate ( customers ) . then ( ( ) => {
88+ const result = {
89+ status : "ok" ,
90+ filename : file . originalname ,
91+ message : "Upload Successfully!" ,
92+ }
93+
94+ messages . push ( result ) ;
95+ } ) ;
96+ } ( ) ) ;
97+ } catch ( error ) {
98+ console . log ( error ) ;
99+
100+ const result = {
101+ status : "fail" ,
102+ filename : file . originalname ,
103+ message : "Error -> " + error . message
104+ }
105+ messages . push ( result ) ;
106+ }
107+ }
108+
109+ return res . json ( messages ) ;
110+ }
111+
112+
113+ exports . downloadFile = ( req , res ) => {
114+ Customer . findAll ( { attributes : [ 'id' , 'name' , 'address' , 'age' ] } ) . then ( objects => {
115+ const jsonCustomers = JSON . parse ( JSON . stringify ( objects ) ) ;
116+ const csvFields = [ 'Id' , 'Name' , 'Address' , 'Age' ] ;
117+ const json2csvParser = new Json2csvParser ( { csvFields } ) ;
118+ const csvData = json2csvParser . parse ( jsonCustomers ) ;
119+
120+ res . setHeader ( 'Content-disposition' , 'attachment; filename=customers.csv' ) ;
121+ res . set ( 'Content-Type' , 'text/csv' ) ;
122+ res . status ( 200 ) . end ( csvData ) ;
123+ } ) ;
124+ }
0 commit comments