Skip to content

Commit 8d6d372

Browse files
authored
Merge pull request mouredev#7133 from MohamedElderkaoui/main
mouredev#46 - javascript
2 parents 8ea59b9 + 16c2f88 commit 8d6d372

File tree

1 file changed

+252
-0
lines changed

1 file changed

+252
-0
lines changed
Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
const users = new Map();
2+
let idCounter = 0;
3+
4+
class User {
5+
constructor(name) {
6+
this.id = idCounter++;
7+
this.name = name;
8+
this.following = [];
9+
this.posts = [];
10+
}
11+
12+
follow(user) {
13+
if (!this.following.includes(user)) {
14+
this.following.push(user);
15+
}
16+
}
17+
18+
unfollow(user) {
19+
const index = this.following.indexOf(user);
20+
if (index !== -1) {
21+
this.following.splice(index, 1);
22+
}
23+
}
24+
25+
addPost(post) {
26+
this.posts.push(post);
27+
}
28+
29+
deletePost(postId) {
30+
const index = this.posts.findIndex(post => post.id === postId);
31+
if (index !== -1) {
32+
this.posts.splice(index, 1);
33+
return true;
34+
}
35+
return false;
36+
}
37+
38+
getMyFeed() {
39+
return this.posts.slice().sort((a, b) => b.creationDate - a.creationDate).slice(0, 10);
40+
}
41+
42+
getFollowingFeed() {
43+
let feed = [];
44+
this.following.forEach(user => {
45+
feed = feed.concat(user.posts);
46+
});
47+
return feed.sort((a, b) => b.creationDate - a.creationDate).slice(0, 10);
48+
}
49+
}
50+
51+
class Post {
52+
constructor(user, content) {
53+
this.id = idCounter++;
54+
this.user = user;
55+
this.content = content;
56+
this.creationDate = new Date();
57+
this.likes = new Set();
58+
}
59+
60+
addLike(user) {
61+
this.likes.add(user);
62+
}
63+
64+
removeLike(user) {
65+
this.likes.delete(user);
66+
}
67+
68+
toString() {
69+
return `Post de ${this.user.name}: ${this.content} | Likes: ${this.likes.size}`;
70+
}
71+
}
72+
73+
function registerUser() {
74+
const name = prompt("Ingrese el nombre de usuario: ");
75+
if (users.has(name)) {
76+
console.log("Error: El usuario ya existe.");
77+
} else {
78+
const newUser = new User(name);
79+
users.set(name, newUser);
80+
console.log("Usuario registrado exitosamente: " + name);
81+
}
82+
}
83+
84+
function followUser() {
85+
const userName = prompt("Tu nombre de usuario: ");
86+
const user = users.get(userName);
87+
const toFollowName = prompt("Nombre del usuario a seguir: ");
88+
const toFollow = users.get(toFollowName);
89+
if (user && toFollow) {
90+
user.follow(toFollow);
91+
console.log(`Ahora sigues a ${toFollow.getName()}`);
92+
}
93+
}
94+
95+
function unfollowUser() {
96+
const userName = prompt("Tu nombre de usuario: ");
97+
const user = users.get(userName);
98+
const toUnfollowName = prompt("Nombre del usuario a dejar de seguir: ");
99+
const toUnfollow = users.get(toUnfollowName);
100+
if (user && toUnfollow) {
101+
user.unfollow(toUnfollow);
102+
console.log(`Has dejado de seguir a ${toUnfollow.getName()}`);
103+
}
104+
}
105+
106+
function createPost() {
107+
const userName = prompt("Tu nombre de usuario: ");
108+
const user = users.get(userName);
109+
if (user) {
110+
const content = prompt("Ingrese el texto del post (máximo 200 caracteres): ");
111+
if (content.length > 200) {
112+
console.log("Error: El texto excede los 200 caracteres.");
113+
} else {
114+
const post = new Post(user, content);
115+
user.addPost(post);
116+
console.log("Post creado exitosamente: " + post);
117+
}
118+
}
119+
}
120+
121+
function deletePost() {
122+
const userName = prompt("Tu nombre de usuario: ");
123+
const user = users.get(userName);
124+
if (user) {
125+
const postId = prompt("Ingrese el ID del post a eliminar: ");
126+
const success = user.deletePost(postId);
127+
if (success) {
128+
console.log("Post eliminado exitosamente.");
129+
} else {
130+
console.log("Error: No se encontró el post con ese ID.");
131+
}
132+
}
133+
}
134+
135+
function likePost() {
136+
const userName = prompt("Tu nombre de usuario: ");
137+
const user = users.get(userName);
138+
if (user) {
139+
const authorName = prompt("Ingrese el nombre del usuario que publicó el post: ");
140+
const author = users.get(authorName);
141+
if (author) {
142+
let postNumber;
143+
do {
144+
try {
145+
postNumber = parseInt(prompt("Ingrese el número del post que desea dar like (1 para el primero, 2 para el segundo, etc.): "));
146+
break;
147+
} catch (error) {
148+
console.log("Debe ingresar un número entero.");
149+
}
150+
} while (true);
151+
const posts = author.posts;
152+
if (postNumber > 0 && postNumber <= posts.length) {
153+
const post = posts[postNumber - 1];
154+
post.addLike(user);
155+
console.log("Diste like al post de " + author.name);
156+
} else {
157+
console.log("Error: Número de post inválido.");
158+
}
159+
} else {
160+
console.log("Error: Usuario no encontrado.");
161+
}
162+
}
163+
}
164+
165+
function unlikePost() {
166+
const userName = prompt("Tu nombre de usuario: ");
167+
const user = users.get(userName);
168+
if (user) {
169+
const postId = prompt("Ingrese el ID del post a eliminar like: ");
170+
let post = null;
171+
for (let u of users.values()) {
172+
post = u.posts.find(p => p.id === postId);
173+
if (post) break;
174+
}
175+
if (post) {
176+
post.removeLike(user);
177+
console.log("Eliminaste tu like del post.");
178+
} else {
179+
console.log("Error: No se encontró el post con ese ID.");
180+
}
181+
}
182+
}
183+
184+
function viewMyFeed() {
185+
const userName = prompt("Tu nombre de usuario: ");
186+
const user = users.get(userName);
187+
if (user) {
188+
console.log("Tu feed:");
189+
user.getMyFeed().forEach(post => console.log(post.toString()));
190+
}
191+
}
192+
193+
function viewFollowingFeed() {
194+
const userName = prompt("Tu nombre de usuario: ");
195+
const user = users.get(userName);
196+
if (user) {
197+
console.log("Feed de usuarios que sigues:");
198+
user.getFollowingFeed().forEach(post => console.log(post.toString()));
199+
}
200+
}
201+
202+
function listUsers() {
203+
if (users.size === 0) {
204+
console.log("No hay usuarios registrados actualmente.");
205+
} else {
206+
console.log("Usuarios registrados:");
207+
users.forEach(user => {
208+
console.log(`- ${user.name} (ID: ${user.id})`);
209+
});
210+
}
211+
}
212+
213+
function main() {
214+
let option;
215+
do {
216+
console.log("\nMenú:");
217+
console.log("1. Registrar usuario");
218+
console.log("2. Seguir a un usuario");
219+
console.log("3. Dejar de seguir a un usuario");
220+
console.log("4. Crear un post");
221+
console.log("5. Eliminar un post");
222+
console.log("6. Dar like a un post");
223+
console.log("7. Eliminar like de un post");
224+
console.log("8. Ver mi feed");
225+
console.log("9. Ver feed de usuarios seguidos");
226+
console.log("10. Listar usuarios registrados");
227+
console.log("11. Salir");
228+
do {
229+
try {
230+
option = parseInt(prompt("Seleccione una opción: "));
231+
} catch (error) {
232+
console.log("Debe ingresar un número entero.");
233+
}
234+
} while (isNaN(option));
235+
switch (option) {
236+
case 1: registerUser(); break;
237+
case 2: followUser(); break;
238+
case 3: unfollowUser(); break;
239+
case 4: createPost(); break;
240+
case 5: deletePost(); break;
241+
case 6: likePost(); break;
242+
case 7: unlikePost(); break;
243+
case 8: viewMyFeed(); break;
244+
case 9: viewFollowingFeed(); break;
245+
case 10: listUsers(); break;
246+
case 11: console.log("Saliendo de la red social..."); break;
247+
default: console.log("Opción inválida. Intente nuevamente."); break;
248+
}
249+
} while (option !== 11);
250+
}
251+
252+
main();

0 commit comments

Comments
 (0)