Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,9 @@ dist

# TernJS port file
.tern-port

# Skaffold file
users-api/skaffold.yaml

# sanitized dump
user-avatar-dump/sanitized-dump.json
761 changes: 761 additions & 0 deletions images-api/yarn.lock

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions user-avatar-dump/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Solução filtro dump de avatar de usuários

## Requerimentos
- NodeJS e Yarn instalados.
- API images-api inicializada.

## Setup local
A partir de /user-avatar-d
- `yarn install` para instalar as dependências.
- arquivo "input-dump.tar" no mesmo diretório de index.ts.

### Início local
-`yarn start` para iniciar o programa localmente.
14 changes: 14 additions & 0 deletions user-avatar-dump/checkImage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import axios from "axios";

const imagesHost = "http://localhost:3000/images/";

export default async function checkImage(imageName: String): Promise<boolean> {
try {
const imageUrl = imagesHost + imageName;
const response = await axios.get(imageUrl);
// return true if image is healthy
return response && response.status == 200 ? true : false;
} catch (e) {
return false;
}
}
16 changes: 16 additions & 0 deletions user-avatar-dump/createDump.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import fs from "fs";

export default function createSanitizedDump(
userImagesMap: Map<String, Array<String>>
) {
var dump = fs.createWriteStream("sanitized-dump.json"); // write to filename sanitized-dump.json
userImagesMap.forEach((value, key) => {
// for each user in map, transform data to json, then to string
let userJson = { userId: key, images: value };
let userString = JSON.stringify(userJson) + `\n`;
// write string to file
dump.write(userString);
});
console.log("finished creating file.");
dump.end();
}
42 changes: 42 additions & 0 deletions user-avatar-dump/filter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import lineReader from "line-reader";
import checkImage from "./checkImage";
import createSanitizedDump from "./createDump";

export default function filterDump(dumpFile: String) {
const userImagesMap = new Map();
console.log("started filtering.");
lineReader.eachLine(
dumpFile,
(line) => {
try {
var lineJson = JSON.parse(line);
if (userImagesMap.has(lineJson.userId)) {
// if user is already in map, return images associated
let userImages = userImagesMap.get(lineJson.userId);
if (
// if user has less than 3 images associated and image is healthy
userImages.length < 3 &&
checkImage(lineJson.image.split("/").slice(-1)[0])
) {
// add image to user ('s images array)
userImages.push(lineJson.image);
}
} else {
if (lineJson.userId) {
// else initialize user images array in map
userImagesMap.set(lineJson.userId, []);
userImagesMap.get(lineJson).push(lineJson.image);
}
}
} catch (e) {}
},
function (err) {
if (err) {
throw err;
}
console.log("done filtering.");
console.log("creating file.");
createSanitizedDump(userImagesMap);
}
);
}
3 changes: 3 additions & 0 deletions user-avatar-dump/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import filterDump from "./filter";

filterDump("input-dump.tar");
Binary file added user-avatar-dump/input-dump.tar
Binary file not shown.
20 changes: 20 additions & 0 deletions user-avatar-dump/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "user-avatar-dump",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"start": "yarn build && yarn watch",
"build": "tsc -p .",
"watch": "ts-node ./index.ts"
},
"devDependencies": {
"@types/node": "^17.0.24",
"line-reader": "^0.4.0",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
},
"dependencies": {
"axios": "^0.26.1"
}
}
11 changes: 11 additions & 0 deletions user-avatar-dump/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist"
},
"lib": ["es2015"]
}
Loading