commit
c8b64c21ff
@ -0,0 +1,25 @@ |
||||
module.exports = { |
||||
parser: '@typescript-eslint/parser', |
||||
parserOptions: { |
||||
project: 'tsconfig.json', |
||||
tsconfigRootDir: __dirname, |
||||
sourceType: 'module', |
||||
}, |
||||
plugins: ['@typescript-eslint/eslint-plugin'], |
||||
extends: [ |
||||
'plugin:@typescript-eslint/recommended', |
||||
'plugin:prettier/recommended', |
||||
], |
||||
root: true, |
||||
env: { |
||||
node: true, |
||||
jest: true, |
||||
}, |
||||
ignorePatterns: ['.eslintrc.js'], |
||||
rules: { |
||||
'@typescript-eslint/interface-name-prefix': 'off', |
||||
'@typescript-eslint/explicit-function-return-type': 'off', |
||||
'@typescript-eslint/explicit-module-boundary-types': 'off', |
||||
'@typescript-eslint/no-explicit-any': 'off', |
||||
}, |
||||
}; |
@ -0,0 +1,56 @@ |
||||
# compiled output |
||||
/dist |
||||
/node_modules |
||||
/build |
||||
|
||||
# Logs |
||||
logs |
||||
*.log |
||||
npm-debug.log* |
||||
pnpm-debug.log* |
||||
yarn-debug.log* |
||||
yarn-error.log* |
||||
lerna-debug.log* |
||||
|
||||
# OS |
||||
.DS_Store |
||||
|
||||
# Tests |
||||
/coverage |
||||
/.nyc_output |
||||
|
||||
# IDEs and editors |
||||
/.idea |
||||
.project |
||||
.classpath |
||||
.c9/ |
||||
*.launch |
||||
.settings/ |
||||
*.sublime-workspace |
||||
|
||||
# IDE - VSCode |
||||
.vscode/* |
||||
!.vscode/settings.json |
||||
!.vscode/tasks.json |
||||
!.vscode/launch.json |
||||
!.vscode/extensions.json |
||||
|
||||
# dotenv environment variable files |
||||
.env |
||||
.env.development.local |
||||
.env.test.local |
||||
.env.production.local |
||||
.env.local |
||||
|
||||
# temp directory |
||||
.temp |
||||
.tmp |
||||
|
||||
# Runtime data |
||||
pids |
||||
*.pid |
||||
*.seed |
||||
*.pid.lock |
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html) |
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json |
@ -0,0 +1,4 @@ |
||||
{ |
||||
"singleQuote": true, |
||||
"trailingComma": "all" |
||||
} |
@ -0,0 +1,73 @@ |
||||
<p align="center"> |
||||
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="200" alt="Nest Logo" /></a> |
||||
</p> |
||||
|
||||
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 |
||||
[circleci-url]: https://circleci.com/gh/nestjs/nest |
||||
|
||||
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p> |
||||
<p align="center"> |
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a> |
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a> |
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a> |
||||
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a> |
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a> |
||||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a> |
||||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a> |
||||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a> |
||||
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a> |
||||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a> |
||||
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a> |
||||
</p> |
||||
<!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer) |
||||
[![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)--> |
||||
|
||||
## Description |
||||
|
||||
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. |
||||
|
||||
## Installation |
||||
|
||||
```bash |
||||
$ npm install |
||||
``` |
||||
|
||||
## Running the app |
||||
|
||||
```bash |
||||
# development |
||||
$ npm run start |
||||
|
||||
# watch mode |
||||
$ npm run start:dev |
||||
|
||||
# production mode |
||||
$ npm run start:prod |
||||
``` |
||||
|
||||
## Test |
||||
|
||||
```bash |
||||
# unit tests |
||||
$ npm run test |
||||
|
||||
# e2e tests |
||||
$ npm run test:e2e |
||||
|
||||
# test coverage |
||||
$ npm run test:cov |
||||
``` |
||||
|
||||
## Support |
||||
|
||||
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). |
||||
|
||||
## Stay in touch |
||||
|
||||
- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) |
||||
- Website - [https://nestjs.com](https://nestjs.com/) |
||||
- Twitter - [@nestframework](https://twitter.com/nestframework) |
||||
|
||||
## License |
||||
|
||||
Nest is [MIT licensed](LICENSE). |
@ -0,0 +1,8 @@ |
||||
{ |
||||
"$schema": "https://json.schemastore.org/nest-cli", |
||||
"collection": "@nestjs/schematics", |
||||
"sourceRoot": "src", |
||||
"compilerOptions": { |
||||
"deleteOutDir": true |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,82 @@ |
||||
{ |
||||
"name": "csv-import", |
||||
"version": "0.0.1", |
||||
"description": "", |
||||
"author": "", |
||||
"private": true, |
||||
"license": "UNLICENSED", |
||||
"scripts": { |
||||
"build": "nest build", |
||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", |
||||
"start": "nest start", |
||||
"start:dev": "nest start --watch", |
||||
"start:debug": "nest start --debug --watch", |
||||
"start:prod": "node dist/main", |
||||
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", |
||||
"test": "jest", |
||||
"test:watch": "jest --watch", |
||||
"test:cov": "jest --coverage", |
||||
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", |
||||
"test:e2e": "jest --config ./test/jest-e2e.json" |
||||
}, |
||||
"dependencies": { |
||||
"@nestjs/common": "^10.3.3", |
||||
"@nestjs/core": "^10.0.0", |
||||
"@nestjs/jwt": "^10.2.0", |
||||
"@nestjs/passport": "^10.0.3", |
||||
"@nestjs/platform-express": "^10.3.3", |
||||
"@nestjs/typeorm": "^10.0.2", |
||||
"@types/passport-jwt": "^4.0.1", |
||||
"bcryptjs": "^2.4.3", |
||||
"class-transformer": "^0.5.1", |
||||
"class-validator": "^0.14.1", |
||||
"csv-parser": "^3.0.0", |
||||
"fs": "^0.0.1-security", |
||||
"multer": "^1.4.5-lts.1", |
||||
"passport-jwt": "^4.0.1", |
||||
"pg": "^8.11.3", |
||||
"reflect-metadata": "^0.2.0", |
||||
"rxjs": "^7.8.1", |
||||
"typeorm": "^0.3.20" |
||||
}, |
||||
"devDependencies": { |
||||
"@nestjs/cli": "^10.0.0", |
||||
"@nestjs/schematics": "^10.0.0", |
||||
"@nestjs/testing": "^10.0.0", |
||||
"@types/express": "^4.17.17", |
||||
"@types/jest": "^29.5.2", |
||||
"@types/node": "^20.3.1", |
||||
"@types/supertest": "^6.0.0", |
||||
"@typescript-eslint/eslint-plugin": "^6.0.0", |
||||
"@typescript-eslint/parser": "^6.0.0", |
||||
"eslint": "^8.42.0", |
||||
"eslint-config-prettier": "^9.0.0", |
||||
"eslint-plugin-prettier": "^5.0.0", |
||||
"jest": "^29.5.0", |
||||
"prettier": "^3.0.0", |
||||
"source-map-support": "^0.5.21", |
||||
"supertest": "^6.3.3", |
||||
"ts-jest": "^29.1.0", |
||||
"ts-loader": "^9.4.3", |
||||
"ts-node": "^10.9.1", |
||||
"tsconfig-paths": "^4.2.0", |
||||
"typescript": "^5.1.3" |
||||
}, |
||||
"jest": { |
||||
"moduleFileExtensions": [ |
||||
"js", |
||||
"json", |
||||
"ts" |
||||
], |
||||
"rootDir": "src", |
||||
"testRegex": ".*\\.spec\\.ts$", |
||||
"transform": { |
||||
"^.+\\.(t|j)s$": "ts-jest" |
||||
}, |
||||
"collectCoverageFrom": [ |
||||
"**/*.(t|j)s" |
||||
], |
||||
"coverageDirectory": "../coverage", |
||||
"testEnvironment": "node" |
||||
} |
||||
} |
@ -0,0 +1,4 @@ |
||||
@Patch('data/edit/:id') |
||||
updateProduct (@Param('id') id: number, @Body('name') name: string, @Body('sku') sku: string, @Body('price') price: number) { |
||||
return this.csvService.editData(id, name, sku, price); |
||||
} |
@ -0,0 +1,22 @@ |
||||
import { Test, TestingModule } from '@nestjs/testing'; |
||||
import { AppController } from './app.controller'; |
||||
import { AppService } from './app.service'; |
||||
|
||||
describe('AppController', () => { |
||||
let appController: AppController; |
||||
|
||||
beforeEach(async () => { |
||||
const app: TestingModule = await Test.createTestingModule({ |
||||
controllers: [AppController], |
||||
providers: [AppService], |
||||
}).compile(); |
||||
|
||||
appController = app.get<AppController>(AppController); |
||||
}); |
||||
|
||||
describe('root', () => { |
||||
it('should return "Hello World!"', () => { |
||||
expect(appController.getHello()).toBe('Hello World!'); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,13 @@ |
||||
import { Controller, Get, Post } from '@nestjs/common'; |
||||
import { AppService } from './app.service'; |
||||
|
||||
@Controller() |
||||
export class AppController { |
||||
constructor(private readonly appService: AppService) {} |
||||
|
||||
@Get() |
||||
getHello(): string { |
||||
return this.appService.getHello(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,19 @@ |
||||
import { Module } from '@nestjs/common'; |
||||
import { AppController } from './app.controller'; |
||||
import { AppService } from './app.service'; |
||||
import { TypeOrmModule } from '@nestjs/typeorm'; |
||||
import { config } from './orm.config'; |
||||
import { CsvModule } from './csv/csv.module'; |
||||
import { CsvEntity } from './entity/csv.entity'; |
||||
import { AuthModule } from './auth/auth.module'; |
||||
|
||||
@Module({ |
||||
imports: [ |
||||
TypeOrmModule.forRoot(config), |
||||
CsvModule, |
||||
AuthModule, |
||||
], |
||||
controllers: [AppController], |
||||
providers: [AppService], |
||||
}) |
||||
export class AppModule {} |
@ -0,0 +1,8 @@ |
||||
import { Injectable } from '@nestjs/common'; |
||||
|
||||
@Injectable() |
||||
export class AppService { |
||||
getHello(): string { |
||||
return 'Hello World!'; |
||||
} |
||||
} |
@ -0,0 +1,26 @@ |
||||
import { Body, Controller, Get, Post, ValidationPipe } from '@nestjs/common'; |
||||
import { AuthService } from './auth.service'; |
||||
import { LoginUserDto } from 'src/dto/loginUser.dto'; |
||||
import { RegisterUserDto } from 'src/dto/registerUser.dto'; |
||||
|
||||
@Controller('auth') |
||||
export class AuthController { |
||||
constructor( |
||||
private readonly authService: AuthService |
||||
) {} |
||||
|
||||
@Post('login') |
||||
async login(@Body(ValidationPipe) LoginUserDto: LoginUserDto) { |
||||
return this.authService.loginUser(LoginUserDto); |
||||
} |
||||
|
||||
@Post('register') |
||||
register(@Body(ValidationPipe) RegisterUserDto: RegisterUserDto) { |
||||
return this.authService.createUser(RegisterUserDto); |
||||
} |
||||
|
||||
@Get('data') |
||||
async getUsers() { |
||||
return this.authService.getUser(); |
||||
} |
||||
} |
@ -0,0 +1,28 @@ |
||||
import { Module } from '@nestjs/common'; |
||||
import { AuthController } from './auth.controller'; |
||||
import { AuthService } from './auth.service'; |
||||
import { TypeOrmModule } from '@nestjs/typeorm'; |
||||
import { UserEntity } from 'src/entity/user.entity'; |
||||
import { JwtModule } from '@nestjs/jwt'; |
||||
import { PassportModule } from '@nestjs/passport'; |
||||
import { JwtStrategy } from './jwt.strategy'; |
||||
|
||||
@Module({ |
||||
imports: [ |
||||
TypeOrmModule.forFeature([UserEntity]), |
||||
JwtModule.register({ |
||||
secret: 'iuhgdfhg984h493ghiughohfgd', |
||||
signOptions: { |
||||
algorithm: 'HS512', |
||||
expiresIn: '1d', |
||||
} |
||||
}), |
||||
PassportModule.register({ |
||||
defaultStrategy: 'jwt' |
||||
}) |
||||
], |
||||
controllers: [AuthController], |
||||
providers: [AuthService, JwtStrategy], |
||||
exports: [PassportModule, JwtStrategy] |
||||
}) |
||||
export class AuthModule {} |
@ -0,0 +1,55 @@ |
||||
import { Injectable, InternalServerErrorException, UnauthorizedException } from '@nestjs/common'; |
||||
import { JwtService } from '@nestjs/jwt'; |
||||
import { InjectRepository } from '@nestjs/typeorm'; |
||||
import { UserEntity } from 'src/entity/user.entity'; |
||||
import { Repository } from 'typeorm'; |
||||
import * as bcrypt from "bcryptjs"; |
||||
import { LoginUserDto } from 'src/dto/loginUser.dto'; |
||||
import { RegisterUserDto } from 'src/dto/registerUser.dto'; |
||||
|
||||
@Injectable() |
||||
export class AuthService { |
||||
constructor( |
||||
@InjectRepository(UserEntity) |
||||
private repo: Repository<UserEntity>, private jwt: JwtService |
||||
) {} |
||||
|
||||
async getUser () { |
||||
return this.repo.find(); |
||||
} |
||||
|
||||
async loginUser (loginUserDto: LoginUserDto) { |
||||
const { username, password } = loginUserDto; |
||||
const user = await this.repo.findOne({ where: {username} }); |
||||
if (!user) { |
||||
throw new UnauthorizedException('Invalid credentials.'); |
||||
} |
||||
const passwordMatch = await bcrypt.compare(password, user.password); |
||||
if (passwordMatch) { |
||||
const jwtPayload = {username}; |
||||
const jwtToken = await this.jwt.signAsync(jwtPayload, {expiresIn: '1d', algorithm: 'HS512'}); |
||||
return {token: jwtToken, message: 'Login successfully'}; |
||||
} |
||||
else { |
||||
throw new UnauthorizedException('Invalid credentials.'); |
||||
} |
||||
} |
||||
|
||||
async createUser (registerUserDto: RegisterUserDto) { |
||||
const { username, password} = registerUserDto; |
||||
const hash = await bcrypt.hash(password, 12); |
||||
const salt = await bcrypt.getSalt(hash); |
||||
|
||||
const user = new UserEntity(); |
||||
user.username = username; |
||||
user.password = hash; |
||||
user.salt = salt; |
||||
|
||||
this.repo.create(user); |
||||
try { |
||||
return await this.repo.save(user); |
||||
} catch (error) { |
||||
throw new InternalServerErrorException('Something went wrong') |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
import { UnauthorizedException } from "@nestjs/common"; |
||||
import { PassportStrategy } from "@nestjs/passport"; |
||||
import { InjectRepository } from "@nestjs/typeorm"; |
||||
import { ExtractJwt, Strategy } from "passport-jwt"; |
||||
import { UserEntity } from "src/entity/user.entity"; |
||||
import { Repository } from "typeorm"; |
||||
|
||||
export class JwtStrategy extends PassportStrategy(Strategy) { |
||||
constructor(@InjectRepository(UserEntity) private repo: Repository<UserEntity>) { |
||||
super({ |
||||
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), |
||||
secretOrKey: 'iuhgdfhg984h493ghiughohfgd' |
||||
}); |
||||
} |
||||
|
||||
async validate(payload: {username: string}) { |
||||
const {username} = payload; |
||||
const user = await this.repo.findOne({where: {username}}); |
||||
|
||||
if (!user) { |
||||
throw new UnauthorizedException(); |
||||
} |
||||
return user; |
||||
} |
||||
} |
@ -0,0 +1,51 @@ |
||||
import { Body, Controller, Delete, Get, InternalServerErrorException, Param, Patch, Post, UploadedFile, UseGuards, UseInterceptors, ValidationPipe } from '@nestjs/common'; |
||||
import { FileInterceptor } from '@nestjs/platform-express'; |
||||
import { createReadStream } from 'fs'; |
||||
import * as csv from 'csv-parser'; |
||||
import { CsvService } from './csv.service'; |
||||
import { CreateProductDto } from 'src/dto/createProduct.dto'; |
||||
import { AuthGuard } from '@nestjs/passport'; |
||||
|
||||
|
||||
@Controller('file') |
||||
@UseGuards(AuthGuard()) |
||||
export class CsvController { |
||||
|
||||
constructor (private csvService : CsvService) {} |
||||
|
||||
@Post('upload') |
||||
@UseInterceptors(FileInterceptor('file')) |
||||
async importCsv(@UploadedFile() file: any) { |
||||
if(!file) { |
||||
throw new InternalServerErrorException('No file uploaded'); |
||||
} |
||||
const filePath = file.path; |
||||
await this.csvService.importCsvData(filePath); |
||||
return 'Csv file uploaded and processed'; |
||||
} |
||||
|
||||
@Get('data') |
||||
getData () { |
||||
return this.csvService.getAllData(); |
||||
} |
||||
|
||||
@Get('data/:id') |
||||
async getOne(@Param('id') id: number) { |
||||
return this.csvService.getOneData(id); |
||||
} |
||||
|
||||
@Post('data/create')
|
||||
createProduct (@Body(ValidationPipe) data: CreateProductDto) { |
||||
return this.csvService.createData(data); |
||||
} |
||||
|
||||
@Patch('data/edit/:id') |
||||
updateProduct (@Param('id') id: number, @Body('name') name: string, @Body('sku') sku: string, @Body('price') price: string) { |
||||
return this.csvService.editData(id, name, sku, price); |
||||
} |
||||
|
||||
@Delete('data/delete/:id') |
||||
deleteProduct(@Param('id') id: number) { |
||||
return this.csvService.deleteData(id); |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
import { Module } from '@nestjs/common'; |
||||
import { CsvController } from './csv.controller'; |
||||
import { CsvService } from './csv.service'; |
||||
import { MulterModule } from '@nestjs/platform-express'; |
||||
import { TypeOrmModule } from '@nestjs/typeorm'; |
||||
import { CsvEntity } from 'src/entity/csv.entity'; |
||||
import { AuthModule } from 'src/auth/auth.module'; |
||||
|
||||
@Module({ |
||||
imports: [ |
||||
TypeOrmModule.forFeature([CsvEntity]), |
||||
MulterModule.register({ |
||||
dest: './uploads', |
||||
}), |
||||
AuthModule |
||||
], |
||||
controllers: [CsvController], |
||||
providers: [CsvService] |
||||
}) |
||||
export class CsvModule {} |
@ -0,0 +1,69 @@ |
||||
import { Injectable, InternalServerErrorException, Param } from '@nestjs/common'; |
||||
import { InjectRepository } from '@nestjs/typeorm'; |
||||
import * as csv from 'csv-parser'; |
||||
import { createReadStream } from 'fs'; |
||||
import { CreateProductDto } from 'src/dto/createProduct.dto'; |
||||
import { CsvEntity } from 'src/entity/csv.entity'; |
||||
import { UserEntity } from 'src/entity/user.entity'; |
||||
import { Repository } from 'typeorm'; |
||||
|
||||
@Injectable() |
||||
export class CsvService { |
||||
|
||||
constructor ( |
||||
@InjectRepository(CsvEntity) |
||||
private readonly repo: Repository<CsvEntity>) {} |
||||
|
||||
async importCsvData(filePath: string) { |
||||
const results = []; |
||||
createReadStream(filePath).pipe(csv()).on('data', (data) => results.push(data)).on('end', async () => { |
||||
for (const result of results) { |
||||
const csvData = new CsvEntity(); |
||||
csvData.name = result.name; |
||||
csvData.sku = result.sku; |
||||
csvData.price = result.price; |
||||
await this.repo.save(csvData); |
||||
} |
||||
console.log(results); |
||||
return results; |
||||
}); |
||||
} |
||||
|
||||
async getAllData () { |
||||
return this.repo.find(); |
||||
} |
||||
|
||||
async getOneData (id: number) { |
||||
return this.repo.findOne({where: {id: id}}); |
||||
} |
||||
|
||||
async createData (CreateProductDto: CreateProductDto) { |
||||
const product = new CsvEntity(); |
||||
const { name, sku, price} = CreateProductDto; |
||||
product.name = name; |
||||
product.sku = sku; |
||||
product.price = price; |
||||
|
||||
this.repo.create(product); |
||||
return await this.repo.save(product); |
||||
} |
||||
|
||||
async editData (id: number, name: string, sku: string, price: string) { |
||||
const product = await this.repo.findOne({where: {id: id}}); |
||||
if (product) { |
||||
product.name = name; |
||||
product.sku = sku; |
||||
product.price = price; |
||||
return this.repo.save(product); |
||||
} |
||||
else throw new InternalServerErrorException('Product not found'); |
||||
} |
||||
|
||||
async deleteData (id: number) { |
||||
const product = await this.repo.findOne({where: {id: id}}); |
||||
if (product) { |
||||
return this.repo.delete(id).then(() => {}); |
||||
} |
||||
else throw new InternalServerErrorException('Product not found'); |
||||
} |
||||
} |
@ -0,0 +1,13 @@ |
||||
import { IsNotEmpty } from "class-validator" |
||||
|
||||
export class CreateProductDto { |
||||
|
||||
@IsNotEmpty() |
||||
name: string; |
||||
|
||||
@IsNotEmpty() |
||||
sku: string; |
||||
|
||||
@IsNotEmpty() |
||||
price: string; |
||||
} |
@ -0,0 +1,8 @@ |
||||
import { IsNotEmpty } from "class-validator"; |
||||
|
||||
export class LoginUserDto { |
||||
@IsNotEmpty() |
||||
username: string; |
||||
@IsNotEmpty() |
||||
password: string; |
||||
} |
@ -0,0 +1,12 @@ |
||||
import { IsNotEmpty, Matches, MinLength, MaxLength } from "class-validator"; |
||||
|
||||
export class RegisterUserDto { |
||||
@IsNotEmpty() |
||||
username: string; |
||||
@IsNotEmpty() |
||||
@MinLength(6) @MaxLength(12) |
||||
@Matches(/(?:(?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, { |
||||
message: "Password must contains at least a uppercase letter, a lowercase letter and a number" |
||||
}) |
||||
password: string; |
||||
} |
@ -0,0 +1,16 @@ |
||||
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm' |
||||
|
||||
@Entity('csv') |
||||
export class CsvEntity { |
||||
@PrimaryGeneratedColumn() |
||||
id: number; |
||||
|
||||
@Column({nullable: true}) |
||||
name: string; |
||||
|
||||
@Column({nullable: true}) |
||||
sku: string; |
||||
|
||||
@Column({nullable: true}) |
||||
price: string; |
||||
} |
@ -0,0 +1,13 @@ |
||||
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; |
||||
|
||||
@Entity('users') |
||||
export class UserEntity { |
||||
@PrimaryGeneratedColumn() |
||||
id: number; |
||||
@Column() |
||||
username: string; |
||||
@Column() |
||||
password: string; |
||||
@Column() |
||||
salt : string; |
||||
} |
@ -0,0 +1,8 @@ |
||||
import { NestFactory } from '@nestjs/core'; |
||||
import { AppModule } from './app.module'; |
||||
|
||||
async function bootstrap() { |
||||
const app = await NestFactory.create(AppModule); |
||||
await app.listen(3000); |
||||
} |
||||
bootstrap(); |
@ -0,0 +1,14 @@ |
||||
import { TypeOrmModuleOptions } from "@nestjs/typeorm"; |
||||
import { CsvEntity } from "./entity/csv.entity"; |
||||
import { UserEntity } from "./entity/user.entity"; |
||||
export const config: TypeOrmModuleOptions = { |
||||
type: 'postgres', |
||||
port: 5432, |
||||
host: 'localhost', |
||||
username: 'postgres', |
||||
password: 'hung04112002', |
||||
database: 'newapp', |
||||
autoLoadEntities: true, |
||||
synchronize: true, |
||||
entities: [CsvEntity, UserEntity], |
||||
} |
@ -0,0 +1,24 @@ |
||||
import { Test, TestingModule } from '@nestjs/testing'; |
||||
import { INestApplication } from '@nestjs/common'; |
||||
import * as request from 'supertest'; |
||||
import { AppModule } from './../src/app.module'; |
||||
|
||||
describe('AppController (e2e)', () => { |
||||
let app: INestApplication; |
||||
|
||||
beforeEach(async () => { |
||||
const moduleFixture: TestingModule = await Test.createTestingModule({ |
||||
imports: [AppModule], |
||||
}).compile(); |
||||
|
||||
app = moduleFixture.createNestApplication(); |
||||
await app.init(); |
||||
}); |
||||
|
||||
it('/ (GET)', () => { |
||||
return request(app.getHttpServer()) |
||||
.get('/') |
||||
.expect(200) |
||||
.expect('Hello World!'); |
||||
}); |
||||
}); |
@ -0,0 +1,9 @@ |
||||
{ |
||||
"moduleFileExtensions": ["js", "json", "ts"], |
||||
"rootDir": ".", |
||||
"testEnvironment": "node", |
||||
"testRegex": ".e2e-spec.ts$", |
||||
"transform": { |
||||
"^.+\\.(t|j)s$": "ts-jest" |
||||
} |
||||
} |
@ -0,0 +1,4 @@ |
||||
{ |
||||
"extends": "./tsconfig.json", |
||||
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"] |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ |
||||
"compilerOptions": { |
||||
"module": "commonjs", |
||||
"declaration": true, |
||||
"removeComments": true, |
||||
"emitDecoratorMetadata": true, |
||||
"experimentalDecorators": true, |
||||
"allowSyntheticDefaultImports": true, |
||||
"target": "ES2021", |
||||
"sourceMap": true, |
||||
"outDir": "./dist", |
||||
"baseUrl": "./", |
||||
"incremental": true, |
||||
"skipLibCheck": true, |
||||
"strictNullChecks": false, |
||||
"noImplicitAny": false, |
||||
"strictBindCallApply": false, |
||||
"forceConsistentCasingInFileNames": false, |
||||
"noFallthroughCasesInSwitch": false |
||||
} |
||||
} |
@ -0,0 +1,26 @@ |
||||
name,sku,price |
||||
V-Neck T-Shirt,woo-vneck-tee,20 |
||||
Hoodie,woo-hoodie,20 |
||||
Hoodie with Logo,woo-hoodie-with-logo,45 |
||||
T-Shirt,woo-tshirt,18 |
||||
Beanie,woo-beanie,20 |
||||
Belt,woo-belt,65 |
||||
Cap,woo-cap,18 |
||||
Sunglasses,woo-sunglasses,90 |
||||
Hoodie with Pocket,woo-hoodie-with-pocket,45 |
||||
Hoodie with Zipper,woo-hoodie-with-zipper,45 |
||||
Long Sleeve Tee,woo-long-sleeve-tee,25 |
||||
Polo,woo-polo,20 |
||||
Album,woo-album,15 |
||||
Single,woo-single,3 |
||||
V-Neck T-Shirt - Red,woo-vneck-tee-red,20 |
||||
V-Neck T-Shirt - Green,woo-vneck-tee-green,20 |
||||
V-Neck T-Shirt - Blue,woo-vneck-tee-blue,15 |
||||
"Hoodie - Red, No",woo-hoodie-red,45 |
||||
"Hoodie - Green, No",woo-hoodie-green,45 |
||||
"Hoodie - Blue, No",woo-hoodie-blue,45 |
||||
T-Shirt with Logo,Woo-tshirt-logo,18 |
||||
Beanie with Logo,Woo-beanie-logo,20 |
||||
Logo Collection,logo-collection, |
||||
WordPress Pennant,wp-pennant,11.05 |
||||
"Hoodie - Blue, Yes",woo-hoodie-blue-logo,45 |
@ -0,0 +1,26 @@ |
||||
name,sku,price |
||||
V-Neck T-Shirt,woo-vneck-tee,20 |
||||
Hoodie,woo-hoodie,20 |
||||
Hoodie with Logo,woo-hoodie-with-logo,45 |
||||
T-Shirt,woo-tshirt,18 |
||||
Beanie,woo-beanie,20 |
||||
Belt,woo-belt,65 |
||||
Cap,woo-cap,18 |
||||
Sunglasses,woo-sunglasses,90 |
||||
Hoodie with Pocket,woo-hoodie-with-pocket,45 |
||||
Hoodie with Zipper,woo-hoodie-with-zipper,45 |
||||
Long Sleeve Tee,woo-long-sleeve-tee,25 |
||||
Polo,woo-polo,20 |
||||
Album,woo-album,15 |
||||
Single,woo-single,3 |
||||
V-Neck T-Shirt - Red,woo-vneck-tee-red,20 |
||||
V-Neck T-Shirt - Green,woo-vneck-tee-green,20 |
||||
V-Neck T-Shirt - Blue,woo-vneck-tee-blue,15 |
||||
"Hoodie - Red, No",woo-hoodie-red,45 |
||||
"Hoodie - Green, No",woo-hoodie-green,45 |
||||
"Hoodie - Blue, No",woo-hoodie-blue,45 |
||||
T-Shirt with Logo,Woo-tshirt-logo,18 |
||||
Beanie with Logo,Woo-beanie-logo,20 |
||||
Logo Collection,logo-collection, |
||||
WordPress Pennant,wp-pennant,11.05 |
||||
"Hoodie - Blue, Yes",woo-hoodie-blue-logo,45 |
@ -0,0 +1,101 @@ |
||||
FirstName,LastName,Company,City,Country,Phone,Email |
||||
Sheryl,Baxter,Rasmussen Group,East Leonard,Chile,229.077.5154,zunigavanessa@smith.info |
||||
Preston,Lozano,Vega-Gentry,East Jimmychester,Djibouti,5153435776,vmata@colon.com |
||||
Roy,Berry,Murillo-Perry,Isabelborough,Antigua and Barbuda,-1199,beckycarr@hogan.com |
||||
Linda,Olsen,"Dominguez, Mcmillan and Donovan",Bensonview,Dominican Republic,001-808-617-6467x12895,stanleyblackwell@benson.org |
||||
Joanna,Bender,"Martin, Lang and Andrade",West Priscilla,Slovakia (Slovak Republic),001-234-203-0635x76146,colinalvarado@miles.net |
||||
Aimee,Downs,Steele Group,Chavezborough,Bosnia and Herzegovina,(283)437-3886x88321,louis27@gilbert.com |
||||
Darren,Peck,"Lester, Woodard and Mitchell",Lake Ana,Pitcairn Islands,(496)452-6181x3291,tgates@cantrell.com |
||||
Brett,Mullen,"Sanford, Davenport and Giles",Kimport,Bulgaria,001-583-352-7197x297,asnow@colon.com |
||||
Sheryl,Meyers,Browning-Simon,Robersonstad,Cyprus,854-138-4911x5772,mariokhan@ryan-pope.org |
||||
Michelle,Gallagher,Beck-Hendrix,Elaineberg,Timor-Leste,739.218.2516x459,mdyer@escobar.net |
||||
Carl,Schroeder,"Oconnell, Meza and Everett",Shannonville,Guernsey,637-854-0256x825,kirksalas@webb.com |
||||
Jenna,Dodson,"Hoffman, Reed and Mcclain",East Andrea,Vietnam,(041)737-3846,mark42@robbins.com |
||||
Tracey,Mata,Graham-Francis,South Joannamouth,Togo,001-949-844-8787,alex56@walls.org |
||||
Kristine,Cox,Carpenter-Cook,Jodyberg,Sri Lanka,786-284-3358x62152,holdenmiranda@clarke.com |
||||
Faith,Lutz,Carter-Hancock,Burchbury,Singapore,(781)861-7180x8306,cassieparrish@blevins-chapman.net |
||||
Miranda,Beasley,Singleton and Sons,Desireeshire,Oman,540.085.3135x185,vduncan@parks-hardy.com |
||||
Caroline,Foley,Winters-Mendoza,West Adriennestad,Western Sahara,936.222.4746x9924,holtgwendolyn@watson-davenport.com |
||||
Greg,Mata,Valentine LLC,Lake Leslie,Mozambique,(701)087-2415,jaredjuarez@carroll.org |
||||
Clifford,Jacobson,Simon LLC,Harmonview,South Georgia and the South Sandwich Islands,001-151-330-3524x0469,joseph26@jacobson.com |
||||
Joanna,Kirk,Mays-Mccormick,Jamesshire,French Polynesia,(266)131-7001x711,tuckerangie@salazar.net |
||||
Maxwell,Frye,Patterson Inc,East Carly,Malta,423.262.3059,fgibson@drake-webb.com |
||||
Kiara,Houston,"Manning, Hester and Arroyo",South Alvin,Netherlands,001-274-040-3582x10611,blanchardbob@wallace-shannon.com |
||||
Colleen,Howard,Greer and Sons,Brittanyview,Paraguay,1935085151,rsingleton@ryan-cherry.com |
||||
Janet,Valenzuela,Watts-Donaldson,Veronicamouth,Lao People's Democratic Republic,354.259.5062x7538,stefanie71@spence.com |
||||
Shane,Wilcox,Tucker LLC,Bryanville,Albania,(429)005-9030x11004,mariah88@santos.com |
||||
Marcus,Moody,Giles Ltd,Kaitlyntown,Panama,674-677-8623,donnamullins@norris-barrett.org |
||||
Dakota,Poole,Simmons Group,Michealshire,Belarus,(371)987-8576x4720,stacey67@fields.org |
||||
Frederick,Harper,"Hinton, Chaney and Stokes",South Marissatown,Switzerland,+1-077-121-1558x0687,jacobkhan@bright.biz |
||||
Stefanie,Fitzpatrick,Santana-Duran,Acevedoville,Saint Vincent and the Grenadines,(752)776-3286,wterrell@clark.com |
||||
Kent,Bradshaw,Sawyer PLC,North Harold,Tanzania,+1-472-143-5037x884,qjimenez@boyd.com |
||||
Jack,Tate,"Acosta, Petersen and Morrow",West Samuel,Zimbabwe,965-108-4406x20714,gfigueroa@boone-zavala.com |
||||
Tom,Trujillo,Mcgee Group,Cunninghamborough,Denmark,416-338-3758,tapiagreg@beard.info |
||||
Gabriel,Mejia,Adkins-Salinas,Port Annatown,Liechtenstein,4077245425,coleolson@jennings.net |
||||
Kaitlyn,Santana,Herrera Group,New Kaitlyn,United States of America,6303643286,georgeross@miles.org |
||||
Faith,Moon,"Waters, Chase and Aguilar",West Marthaburgh,Bahamas,+1-586-217-0359x6317,willistonya@randolph-baker.com |
||||
Tammie,Haley,"Palmer, Barnes and Houston",East Teresa,Belize,001-276-734-4113x6087,harrisisaiah@jenkins.com |
||||
Nicholas,Sosa,Jordan Ltd,South Hunter,Uruguay,(661)425-6042,fwolfe@dorsey.com |
||||
Jordan,Gay,Glover and Sons,South Walter,Solomon Islands,7208417020,tiffanydavies@harris-mcfarland.org |
||||
Bruce,Esparza,Huerta-Mclean,Poolefurt,Montenegro,559-529-4424,preese@frye-vega.com |
||||
Sherry,Garza,Anderson Ltd,West John,Poland,001-067-713-6440x158,ann48@miller.com |
||||
Natalie,Gentry,Monroe PLC,West Darius,Dominican Republic,830.996.8238,tcummings@fitzpatrick-ashley.com |
||||
Bryan,Dunn,Kaufman and Sons,North Jimstad,Burkina Faso,001-710-802-5565,woodwardandres@phelps.com |
||||
Wayne,Simpson,Perkins-Trevino,East Rebekahborough,Bolivia,(344)156-8632x1869,barbarapittman@holder.com |
||||
Luis,Greer,Cross PLC,North Drew,Bulgaria,001-336-025-6849x701,bstuart@williamson-mcclure.com |
||||
Rhonda,Frost,"Herrera, Shepherd and Underwood",Lake Lindaburgh,Monaco,(127)081-9339,zkrueger@wolf-chavez.net |
||||
Joanne,Montes,"Price, Sexton and Mcdaniel",Gwendolynview,Palau,(897)726-7952,juan80@henson.net |
||||
Geoffrey,Guzman,Short-Wiggins,Zimmermanland,Uzbekistan,975.235.8921x269,bauercrystal@gay.com |
||||
Gloria,Mccall,"Brennan, Acosta and Ramos",North Kerriton,Ghana,445-603-6729,bartlettjenna@zuniga-moss.biz |
||||
Brady,Cohen,Osborne-Erickson,North Eileenville,United Arab Emirates,741.849.0139x524,mccalltyrone@durham-rose.biz |
||||
Latoya,Mccann,"Hobbs, Garrett and Sanford",Port Sergiofort,Belarus,(530)287-4548x29481,bobhammond@barry.biz |
||||
Gerald,Hawkins,"Phelps, Forbes and Koch",New Alberttown,Canada,+1-323-239-1456x96168,uwarner@steele-arias.com |
||||
Samuel,Crawford,"May, Goodwin and Martin",South Jasmine,Algeria,802-242-7457,xpittman@ritter-carney.net |
||||
Patricia,Goodwin,"Christian, Winters and Ellis",Cowanfort,Swaziland,322.549.7139x70040,vaughanchristy@lara.biz |
||||
Stacie,Richard,Byrd Inc,New Deborah,Madagascar,001-622-948-3641x24810,clinton85@colon-arias.org |
||||
Robin,West,"Nixon, Blackwell and Sosa",Wallstown,Ecuador,698.303.4267,greenemiranda@zimmerman.com |
||||
Ralph,Haas,Montes PLC,Lake Ellenchester,Palestinian Territory,2239271999,goodmancesar@figueroa.biz |
||||
Phyllis,Maldonado,Costa PLC,Lake Whitney,Saint Barthelemy,4500370767,yhanson@warner-diaz.org |
||||
Danny,Parrish,Novak LLC,East Jaredbury,United Arab Emirates,(669)384-8597x8794,howelldarren@house-cohen.com |
||||
Kathy,Hill,"Moore, Mccoy and Glass",Selenabury,South Georgia and the South Sandwich Islands,001-171-716-2175x310,ncamacho@boone-simmons.org |
||||
Kelli,Hardy,Petty Ltd,Huangfort,Sao Tome and Principe,020.324.2191x2022,kristopher62@oliver.com |
||||
Lynn,Pham,"Brennan, Camacho and Tapia",East Pennyshire,Portugal,846.468.6834x611,mpham@rios-guzman.com |
||||
Shelley,Harris,"Prince, Malone and Pugh",Port Jasminborough,Togo,423.098.0315x8373,zachary96@mitchell-bryant.org |
||||
Eddie,Jimenez,Caldwell Group,West Kristine,Ethiopia,+1-235-657-1073x6306,kristiwhitney@bernard.com |
||||
Chloe,Hutchinson,Simon LLC,South Julia,Netherlands,981-544-9452,leah85@sutton-terrell.com |
||||
Eileen,Lynch,"Knight, Abbott and Hubbard",Helenborough,Liberia,+1-158-951-4131x53578,levigiles@vincent.com |
||||
Fernando,Lambert,Church-Banks,Lake Nancy,Lithuania,497.829.9038,fisherlinda@schaefer.net |
||||
Makayla,Cannon,Henderson Inc,Georgeport,New Caledonia,001-215-801-6392x46009,scottcurtis@hurley.biz |
||||
Tom,Alvarado,Donaldson-Dougherty,South Sophiaberg,Kiribati,(585)606-2980x2258,nicholsonnina@montgomery.info |
||||
Virginia,Dudley,Warren Ltd,Hartbury,French Southern Territories,027.846.3705x14184,zvalencia@phelps.com |
||||
Riley,Good,Wade PLC,Erikaville,Canada,6977745822,alex06@galloway.com |
||||
Alexandria,Buck,Keller-Coffey,Nicolasfort,Iran,078-900-4760x76668,lee48@manning.com |
||||
Richard,Roth,Conway-Mcbride,New Jasmineshire,Morocco,581-440-6539,aharper@maddox-townsend.org |
||||
Candice,Keller,Huynh and Sons,East Summerstad,Zimbabwe,001-927-965-8550x92406,buckleycory@odonnell.net |
||||
Anita,Benson,Parrish Ltd,Skinnerport,Russian Federation,874.617.5668x69878,angie04@oconnell.com |
||||
Regina,Stein,Guzman-Brown,Raystad,Solomon Islands,001-469-848-0724x4407,zrosario@rojas-hardin.net |
||||
Debra,Riddle,"Chang, Aguirre and Leblanc",Colinhaven,United States Virgin Islands,+1-768-182-6014x14336,shieldskerry@robles.com |
||||
Brittany,Zuniga,Mason-Hester,West Reginald,Kyrgyz Republic,(050)136-9025,mchandler@cochran-huerta.org |
||||
Cassidy,Mcmahon,"Mcguire, Huynh and Hopkins",Lake Sherryborough,Myanmar,5040771311,katrinalane@fitzgerald.com |
||||
Laurie,Pennington,"Sanchez, Marsh and Hale",Port Katherineville,Dominica,007.155.3406x553,cookejill@powell.com |
||||
Alejandro,Blair,"Combs, Waller and Durham",Thomasland,Iceland,(690)068-4641x51468,elizabethbarr@ewing.com |
||||
Leslie,Jennings,Blankenship-Arias,Coreybury,Micronesia,629.198.6346,corey75@wiggins.com |
||||
Kathleen,Mckay,"Coffey, Lamb and Johnson",Lake Janiceton,Saint Vincent and the Grenadines,(733)910-9968,chloelester@higgins-wilkinson.com |
||||
Hunter,Moreno,Fitzpatrick-Lawrence,East Clinton,Isle of Man,(733)833-6754,isaac26@benton-finley.com |
||||
Chad,Davidson,Garcia-Jimenez,South Joshuashire,Oman,8275702958,justinwalters@jimenez.com |
||||
Corey,Holt,"Mcdonald, Bird and Ramirez",New Glenda,Fiji,001-439-242-4986x7918,maurice46@morgan.com |
||||
Emma,Cunningham,Stephens Inc,North Jillianview,New Zealand,128-059-0206x60217,walter83@juarez.org |
||||
Duane,Woods,Montoya-Miller,Lyonsberg,Maldives,(636)544-7783x7288,kmercer@wagner.com |
||||
Alison,Vargas,"Vaughn, Watts and Leach",East Cristinabury,Benin,365-273-8144,vcantu@norton.com |
||||
Vernon,Kane,Carter-Strickland,Thomasfurt,Yemen,114-854-1159x555,hilljesse@barrett.info |
||||
Lori,Flowers,Decker-Mcknight,North Joeburgh,Namibia,679.415.1210,tyrone77@valenzuela.info |
||||
Nina,Chavez,Byrd-Campbell,Cassidychester,Bhutan,053-344-3205,elliserica@frank.com |
||||
Shane,Foley,Rocha-Hart,South Dannymouth,Hungary,-1692,nsteele@sparks.com |
||||
Collin,Ayers,Lamb-Peterson,South Lonnie,Anguilla,404-645-5351x012,dudleyemily@gonzales.biz |
||||
Sherry,Young,"Lee, Lucero and Johnson",Frankchester,Solomon Islands,158-687-1764,alan79@gates-mclaughlin.com |
||||
Darrell,Douglas,"Newton, Petersen and Mathis",Daisyborough,Mali,001-084-845-9524x1777,grayjean@lowery-good.com |
||||
Karl,Greer,Carey LLC,East Richard,Guyana,(188)169-1674x58692,hhart@jensen.com |
||||
Lynn,Atkinson,"Ware, Burns and Oneal",New Bradview,Sri Lanka,-3769,vkemp@ferrell.com |
||||
Fred,Guerra,Schmitt-Jones,Ortegaland,Solomon Islands,+1-753-067-8419x7170,swagner@kane.org |
||||
Yvonne,Farmer,Fitzgerald-Harrell,Lake Elijahview,Aruba,(530)311-9786,mccarthystephen@horn-green.biz |
||||
Clarence,Haynes,"Le, Nash and Cross",Judymouth,Honduras,(753)813-6941,colleen91@faulkner.biz |
@ -0,0 +1,26 @@ |
||||
Name,SKU,Regular price |
||||
V-Neck T-Shirt,woo-vneck-tee, |
||||
Hoodie,woo-hoodie, |
||||
Hoodie with Logo,woo-hoodie-with-logo,45 |
||||
T-Shirt,woo-tshirt,18 |
||||
Beanie,woo-beanie,20 |
||||
Belt,woo-belt,65 |
||||
Cap,woo-cap,18 |
||||
Sunglasses,woo-sunglasses,90 |
||||
Hoodie with Pocket,woo-hoodie-with-pocket,45 |
||||
Hoodie with Zipper,woo-hoodie-with-zipper,45 |
||||
Long Sleeve Tee,woo-long-sleeve-tee,25 |
||||
Polo,woo-polo,20 |
||||
Album,woo-album,15 |
||||
Single,woo-single,3 |
||||
V-Neck T-Shirt - Red,woo-vneck-tee-red,20 |
||||
V-Neck T-Shirt - Green,woo-vneck-tee-green,20 |
||||
V-Neck T-Shirt - Blue,woo-vneck-tee-blue,15 |
||||
"Hoodie - Red, No",woo-hoodie-red,45 |
||||
"Hoodie - Green, No",woo-hoodie-green,45 |
||||
"Hoodie - Blue, No",woo-hoodie-blue,45 |
||||
T-Shirt with Logo,Woo-tshirt-logo,18 |
||||
Beanie with Logo,Woo-beanie-logo,20 |
||||
Logo Collection,logo-collection, |
||||
WordPress Pennant,wp-pennant,11.05 |
||||
"Hoodie - Blue, Yes",woo-hoodie-blue-logo,45 |
@ -0,0 +1,26 @@ |
||||
name,sku,price |
||||
V-Neck T-Shirt,woo-vneck-tee,20 |
||||
Hoodie,woo-hoodie,20 |
||||
Hoodie with Logo,woo-hoodie-with-logo,45 |
||||
T-Shirt,woo-tshirt,18 |
||||
Beanie,woo-beanie,20 |
||||
Belt,woo-belt,65 |
||||
Cap,woo-cap,18 |
||||
Sunglasses,woo-sunglasses,90 |
||||
Hoodie with Pocket,woo-hoodie-with-pocket,45 |
||||
Hoodie with Zipper,woo-hoodie-with-zipper,45 |
||||
Long Sleeve Tee,woo-long-sleeve-tee,25 |
||||
Polo,woo-polo,20 |
||||
Album,woo-album,15 |
||||
Single,woo-single,3 |
||||
V-Neck T-Shirt - Red,woo-vneck-tee-red,20 |
||||
V-Neck T-Shirt - Green,woo-vneck-tee-green,20 |
||||
V-Neck T-Shirt - Blue,woo-vneck-tee-blue,15 |
||||
"Hoodie - Red, No",woo-hoodie-red,45 |
||||
"Hoodie - Green, No",woo-hoodie-green,45 |
||||
"Hoodie - Blue, No",woo-hoodie-blue,45 |
||||
T-Shirt with Logo,Woo-tshirt-logo,18 |
||||
Beanie with Logo,Woo-beanie-logo,20 |
||||
Logo Collection,logo-collection, |
||||
WordPress Pennant,wp-pennant,11.05 |
||||
"Hoodie - Blue, Yes",woo-hoodie-blue-logo,45 |
@ -0,0 +1,26 @@ |
||||
name,sku,price |
||||
V-Neck T-Shirt,woo-vneck-tee,20 |
||||
Hoodie,woo-hoodie,20 |
||||
Hoodie with Logo,woo-hoodie-with-logo,45 |
||||
T-Shirt,woo-tshirt,18 |
||||
Beanie,woo-beanie,20 |
||||
Belt,woo-belt,65 |
||||
Cap,woo-cap,18 |
||||
Sunglasses,woo-sunglasses,90 |
||||
Hoodie with Pocket,woo-hoodie-with-pocket,45 |
||||
Hoodie with Zipper,woo-hoodie-with-zipper,45 |
||||
Long Sleeve Tee,woo-long-sleeve-tee,25 |
||||
Polo,woo-polo,20 |
||||
Album,woo-album,15 |
||||
Single,woo-single,3 |
||||
V-Neck T-Shirt - Red,woo-vneck-tee-red,20 |
||||
V-Neck T-Shirt - Green,woo-vneck-tee-green,20 |
||||
V-Neck T-Shirt - Blue,woo-vneck-tee-blue,15 |
||||
"Hoodie - Red, No",woo-hoodie-red,45 |
||||
"Hoodie - Green, No",woo-hoodie-green,45 |
||||
"Hoodie - Blue, No",woo-hoodie-blue,45 |
||||
T-Shirt with Logo,Woo-tshirt-logo,18 |
||||
Beanie with Logo,Woo-beanie-logo,20 |
||||
Logo Collection,logo-collection, |
||||
WordPress Pennant,wp-pennant,11.05 |
||||
"Hoodie - Blue, Yes",woo-hoodie-blue-logo,45 |
Loading…
Reference in new issue