product.controller.js 10.4 KB
Newer Older
Jiwon Yoon's avatar
Jiwon Yoon committed
1
import Product from "../schemas/Product.js";
kusang96's avatar
dd    
kusang96 committed
2
3
4
5
6
7
import multer from 'multer';

const upload = multer({ dest: 'uploads/' })

const imageUpload = upload.fields([
    { name: 'main_image' },
kusang96's avatar
kusang96 committed
8
    { name: 'detail_image' }
kusang96's avatar
kusang96 committed
9
])
Jiwon Yoon's avatar
Jiwon Yoon committed
10
11
12

const regist = async (req, res) => {
    try {
kusang96's avatar
kusang96 committed
13
        const { pro_name, price, stock, main_category, sub_category, description, colors, sizes } = req.body
kusang96's avatar
dd    
kusang96 committed
14
15
16
17
18
19
20
21
        const main_img = req.files['main_image'][0]
        const detail_img = req.files['detail_image']
        const main_imgUrl = main_img.filename
        const detail_imgUrls = []
        detail_img.forEach(file => {
            detail_imgUrls.push(file.filename)
        })
        const newProduct = await new Product({
kusang96's avatar
kusang96 committed
22
            pro_name, price, stock, main_category, sub_category, description, main_imgUrl, detail_imgUrls, colors, sizes
Jiwon Yoon's avatar
Jiwon Yoon committed
23
24
25
        }).save()
        res.json(newProduct)
    } catch (error) {
kusang96's avatar
dd    
kusang96 committed
26
        res.status(500).send('제품 정보 등록에 실패하였습니다. 다시 진행해 주십시오.')
Jiwon Yoon's avatar
Jiwon Yoon committed
27
28
29
    }
}

kusang96's avatar
kusang96 committed
30
const getToHome = async (req, res) => {
kusang96's avatar
0115    
kusang96 committed
31
    try {
kusang96's avatar
kusang96 committed
32
        const bestProduct = await Product.find({}).sort({ purchase: -1 }).limit(6)
kusang96's avatar
0115    
kusang96 committed
33
        const newProduct = await Product.find({}).sort({ createdAt: -1 }).limit(6)
kusang96's avatar
kusang96 committed
34
        res.json({ bestProduct, newProduct })
kusang96's avatar
0115    
kusang96 committed
35
36
37
38
39
    } catch {
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}

kusang96's avatar
kusang96 committed
40
const getAll = async (req, res) => {
41
    const per = 9;
이재연's avatar
0113    
이재연 committed
42
    try {
kusang96's avatar
kusang96 committed
43
44
        if (req.query.product) {
            const productslist = await Product.find({ pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 })
45
46
            const length = productslist.length
            const productPiece = await Product.find({ pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
kusang96's avatar
kusang96 committed
47
48
49
            if (productslist.length == 0) {
                res.status(404).send('상품을 찾을 수 없습니다.')
            } else {
Kim, Subin's avatar
Kim, Subin committed
50
                res.json({ productPiece, length })
kusang96's avatar
kusang96 committed
51
52
53
            }
        } else {
            const productslist = await Product.find({}).sort({ createdAt: -1 })
54
55
            const length = productslist.length
            const productPiece = await Product.find({}).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
Kim, Subin's avatar
Kim, Subin committed
56
57
            console.log("products=", productPiece)
            res.json({ productPiece, length })
kusang96's avatar
kusang96 committed
58
        }
이재연's avatar
0113    
이재연 committed
59
60
61
62
63
    } catch (error) {
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}

kusang96's avatar
kusang96 committed
64
65
const getlist = (req, res) => {
    try {
Kim, Subin's avatar
Kim, Subin committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
        if (req.str && req.length) {
            const str = req.str
            const productsPiece = req.productsPiece
            const length = req.length
            res.json({ productsPiece, length, str })
        } else if (req.str) {
            const str = req.str
            const productsPiece = req.productsPiece
            res.json({ productsPiece, str })
        } else {
            const productsPiece = req.productsPiece
            const length = req.length
            res.json({ productsPiece, length })
        }
kusang96's avatar
kusang96 committed
80
81
82
83
    } catch (error) {
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}
이재연's avatar
dd    
이재연 committed
84

이재연's avatar
0113    
이재연 committed
85
const categoryId = async (req, res, next, category) => {
86
    const per = 9;
Kim, Subin's avatar
Kim, Subin committed
87
    console.log("query=",req.query)
이재연's avatar
0113    
이재연 committed
88
    try {
Kim, Subin's avatar
Kim, Subin committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
        if (req.query.product && req.query.method) {
            let method = ''
            let methodStr = ''
            switch (req.query.method) {
                case "purchase":
                    method = "purchase"
                    methodStr = '인기상품'
                    break;
                case "newest":
                    method = "createdAt"
                    methodStr = '신상품'
                    break;
                case "lowest":
                    method = "price"
                    methodStr = '낮은가격'
                    break;
                case "highest":
                    method = "price"
                    methodStr = '높은가격'
                    break;
            }
            req.str = methodStr
            if (req.query.method == 'lowest') {
                let productslist = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: 1 })
                let length = productslist.length
                req.length = length
                let productsPiece = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: 1 }).skip((req.query.page - 1) * per).limit(per)
                req.productsPiece = productsPiece
kusang96's avatar
kusang96 committed
117
            } else {
Kim, Subin's avatar
Kim, Subin committed
118
119
                let productslist = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: -1 })
                let length = productslist.length
120
                req.length = length
Kim, Subin's avatar
Kim, Subin committed
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
                let productsPiece = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: -1 }).skip((req.query.page - 1) * per).limit(per)
                req.productsPiece = productsPiece
            }
        } else if (req.query.method) {
            let method = ''
            let methodStr = ''
            switch (req.query.method) {
                case "purchase":
                    method = "purchase"
                    methodStr = '인기상품'
                    break;
                case "newest":
                    method = "createdAt"
                    methodStr = '신상품'
                    break;
                case "lowest":
                    method = "price"
                    methodStr = '낮은가격'
                    break;
                case "highest":
                    method = "price"
                    methodStr = '높은가격'
                    break;
            }
            req.str = methodStr
            if (req.query.method == 'lowest') {
                let productsPiece = await Product.find({ main_category: category }).sort({ [method]: 1 }).skip((req.query.page - 1) * per).limit(per)
                req.productsPiece = productsPiece
            } else {
                let productsPiece = await Product.find({ main_category: category }).sort({ [method]: -1 }).skip((req.query.page - 1) * per).limit(per)
151
                req.productsPiece = productsPiece
kusang96's avatar
kusang96 committed
152
            }
Kim, Subin's avatar
Kim, Subin committed
153
154
155
156
157
158
        } else if (req.query.product) {
            const productslist = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 })
            const length = productslist.length
            req.length = length
            const productsPiece = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
            req.productsPiece = productsPiece
kusang96's avatar
kusang96 committed
159
        } else {
Kim, Subin's avatar
Kim, Subin committed
160
            console.log("else")
Kim, Subin's avatar
Kim, Subin committed
161
            const productslist = await Product.find({ main_category: category }).sort({ createdAt: -1 })
162
163
            const length = productslist.length
            req.length = length
Kim, Subin's avatar
Kim, Subin committed
164
            const productsPiece = await Product.find({ main_category: category }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
165
            req.productsPiece = productsPiece
kusang96's avatar
kusang96 committed
166
        }
이재연's avatar
0113    
이재연 committed
167
168
169
170
171
        next()
    } catch (error) {
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}
이재연's avatar
dd    
이재연 committed
172

박상호's avatar
박상호 committed
173
const subname = async (req, res) => {
174
    const per = 9;
kusang96's avatar
kusang96 committed
175
    try {
Kim, Subin's avatar
Kim, Subin committed
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
        if (req.query.method) {
            let method = ''
            let methodStr = ''
            switch (req.query.method) {
                case "purchase":
                    method = "purchase"
                    methodStr = '인기상품'
                    break;
                case "newest":
                    method = "createdAt"
                    methodStr = '신상품'
                    break;
                case "lowest":
                    method = "price"
                    methodStr = '낮은가격'
                    break;
                case "highest":
                    method = "price"
                    methodStr = '높은가격'
                    break;
            }
            let str = methodStr
            if (req.query.method == 'lowest') {
                let productsPiece = await Product.find({ sub_category: req.query.subname }).sort({ [method]: 1 }).skip((req.query.page - 1) * per).limit(per)
                res.send({ productsPiece, str })
            } else {
                let productsPiece = await Product.find({ sub_category: req.query.subname }).sort({ [method]: -1 }).skip((req.query.page - 1) * per).limit(per)
                res.send({ productsPiece, str })
            }
        } else {
            const productslist = await Product.find({ sub_category: req.query.subname }).sort({ createdAt: -1 })
            const length = productslist.length
            const productsPiece = await Product.find({ sub_category: req.query.subname }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
            res.send({ productsPiece, length })
        }
이재연's avatar
dd    
이재연 committed
211
    } catch (error) {
kusang96's avatar
kusang96 committed
212
        res.status(500).send('상품을 불러오지 못했습니다.')
이재연's avatar
dd    
이재연 committed
213
214
215
    }
}

216
217
218
219
220
221
const plusPurchase = async (req, res) => {
    const { products } = req.body
    try {
        for (let i = 0; i < products.length; i++) {
            const count = products[i].count
            const product = await Product.findOne(
박상호's avatar
박상호 committed
222
                { _id: products[i].productId._id }
223
224
            )
            const purchase = product.purchase
225
            const stock = product.stock
226
227
            await Product.updateOne(
                { _id: products[i].productId._id },
kusang96's avatar
kusang96 committed
228
229
230
231
232
233
                {
                    $set:
                    {
                        purchase: count + purchase,
                        stock: stock - count
                    }
234
                }
235
236
            )
        }
237
        res.send("구매수 늘리기, 재고수 줄이기 성공")
238
239
240
241
    } catch (error) {
        res.status(500).send('구매숫자를 늘리지 못함')
    }
}
이재연's avatar
dd    
이재연 committed
242

kusang96's avatar
kusang96 committed
243
244
245
246
247
248
249
250
251
252
253
254
255
256
const deletePro = async (req, res) => {
    const pro_id = req.query.pro_id
    try {
        const productOne = await Product.findById(pro_id)
        if (productOne) {
            await Product.remove({ _id: pro_id })
        }
        res.send('삭제 성공')
    } catch (error) {
        res.status(500).send('삭제할 상품을 찾지 못하거나 삭제 중 문제가 발생했습니다.')
    }
}

export default { imageUpload, regist, getToHome, getAll, categoryId, getlist, subname, plusPurchase, deletePro }