changes on db initializing

main
buuwie 9 months ago
commit c8b64c21ff
  1. 25
      .eslintrc.js
  2. 56
      .gitignore
  3. 4
      .prettierrc
  4. 73
      README.md
  5. 8
      nest-cli.json
  6. 9528
      package-lock.json
  7. 82
      package.json
  8. 4
      something.txt
  9. 22
      src/app.controller.spec.ts
  10. 13
      src/app.controller.ts
  11. 19
      src/app.module.ts
  12. 8
      src/app.service.ts
  13. 26
      src/auth/auth.controller.ts
  14. 28
      src/auth/auth.module.ts
  15. 55
      src/auth/auth.service.ts
  16. 25
      src/auth/jwt.strategy.ts
  17. 51
      src/csv/csv.controller.ts
  18. 20
      src/csv/csv.module.ts
  19. 69
      src/csv/csv.service.ts
  20. 13
      src/dto/createProduct.dto.ts
  21. 8
      src/dto/loginUser.dto.ts
  22. 12
      src/dto/registerUser.dto.ts
  23. 16
      src/entity/csv.entity.ts
  24. 13
      src/entity/user.entity.ts
  25. 8
      src/main.ts
  26. 14
      src/orm.config.ts
  27. 24
      test/app.e2e-spec.ts
  28. 9
      test/jest-e2e.json
  29. 4
      tsconfig.build.json
  30. 21
      tsconfig.json
  31. 26
      uploads/55663bab639616f75c3faf06f0901b7f
  32. 26
      uploads/df27729e14cdb2042b31802b94b1f067
  33. 101
      uploads/e0c40b53ef197d006fb2b2c952a029fc
  34. 26
      uploads/e2105d14cd240471ee3b1bc3be180106
  35. 26
      uploads/f4188ce170d590450ad3f652d33a9108
  36. 26
      uploads/f66ede1f88e2032f3cf9ec744d4f09f9

@ -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',
},
};

56
.gitignore vendored

@ -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
}
}

9528
package-lock.json generated

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…
Cancel
Save