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