GithubHelp home page GithubHelp logo

disenio-ts-caralibro's Introduction

Caralibro

Portada

Este repositorio fue generado utilizando la semilla Biblioteca Typescript. Recomendamos leer su README para conocer un poco más sobre las tecnologías elegidas y los requisitos para poder utilizarlo.

Antes de empezar: algunos consejos

El enunciado tiene mucha información, van a necesitar leerlo varias veces. La sugerencia es que lo lean entero una vez (para tener una idea general) y luego vuelvan a consultarlo las veces que hagan falta.

Concentrensé en los requerimientos y, excepto que se traben mucho, respeten el orden sugerido. No es necesario que hagan TDD, pero sí sería interesante que vayan creando las distintas clases y métodos a medida que resuelven cada requerimiento y no antes.

En otras palabras: trabajen completando cada requerimiento antes de pasar al siguiente, con los tests que aseguran que funciona incluidos. Si al avanzar en los requerimientos les parece necesario refactorizar, adelante, van a tener los tests que garantizan que no rompieron nada. 😏

Descripción del dominio

Un grupo de inversores, que no quiere dar la cara, nos contrató para llevar a cabo una red social. Caralibro permite a los usuarios publicar diferentes tipos de contenidos, los cuales incluyen texto, fotos y videos.

Por cuestiones de almacenamiento en los servidores, nos interesará saber cuánto espacio ocupa cada publicación, en Bytes:

  • Las fotos tienen un alto y ancho dado en pixels; el espacio que ocupan se calcula como alto * ancho * factor de compresión. El factor de compresión actual para las fotos es de 0.7, pero debe poder modificarse para todas las fotos a la vez. Como de esta cuenta muy probablemente resulte un número con coma, vamos a redondear para arriba en todos los casos (ejemplo: 99.85 se volvería 100, y lo mismo para 99.12).
  • Las publicaciones de texto son mucho más fáciles de calcular, ya que el espacio que ocupan es igual a la cantidad de caracteres que tienen.
  • Los videos tienen un tamaño que depende de la calidad con la cual el usuario elija publicarlo. Para la calidad SD, el tamaño es igual a la duración del video en segundos. Para los videos HD 720p el tamaño es igual al triple de la duración en segundos del video y para los videos de HD 1080p el tamaño es el doble de los HD 720p + 300 bytes fijos. Debe poder modificarse la calidad sin tener que volver a hacer la publicación.

Los usuarios que pueden ver una publicación pueden indicar que esa publicación les gusta, aumentando el número de me gustas de la misma. A nuestra aplicación le importa tanto la cantidad de me gustas que recibió una publicación, como saber quiénes le dieron me gusta. No es posible que una misma persona le de me gusta más de una vez.

Nuestros usuarios tienen amigos, pero no quieren compartir todas sus publicaciones con todos ellos. Por ejemplo, hay fotos y videos que no quieren que sus familias vean, por alguna extraña razón. Para satisfacer esa necesidad, cada publicación tiene asignado un permiso, que puede ser:

  • público: cualquier usuario puede ver la publicación,
  • sólo amigos: sólo los amigos pueden verla,
  • privado con lista de permitidos: el usuario configura una lista que vale para esa publicación, y solo los usuarios que pertenezcan a esa lista pueden verla. Para que quede claro: la lista se establece para cada publicación, dos publicaciones con este permiso deben poder tener listas de permitidos diferentes,
  • público con lista de excluidos: similar al anterior, pero en este caso todos pueden ver la publicación excepto quienes están en la lista.

Cada publicación tiene uno de estos permisos asociados, que debe poder modificarse en cualquier momento. Sea cual sea la configuración, un usuario siempre puede ver sus propias publicaciones.

Requerimientos

Se pide implementar la solución a este problema en Kotlin, junto con los tests que prueben cada uno de los requerimientos.

  1. Saber cuánto espacio ocupa el total de las publicaciones de un usuario.
  2. Poder darle me gusta a una publicación, y conocer cuántas veces fue votada de esta forma.
  3. Saber si un usuario es más amistoso que otro: esto ocurre cuando el primero tiene más amigos.
  4. Saber si un usuario puede ver una cierta publicacion.
  5. Determinar los mejores amigos de un usuario: el conjunto de sus amigos que pueden ver todas sus publicaciones.
  6. Saber cual es el amigo más popular que tiene un usuario. Es decir, el amigo que tiene mas me gusta entre todas sus publicaciones.
  7. Saber si un usuario stalkea a otro. Lo cual ocurre si el stalker le dio me gusta a más del 90% de sus publicaciones.

Licencia

Esta obra fue elaborada por Federico Aloi y publicada bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.

CC BY-SA 4.0

Créditos

📝 Enunciado original creado por Carlos Lombardi y Leonardo Gassman.

📸 Imagen de portada por Annie Spratt en Unsplash.

disenio-ts-caralibro's People

Contributors

faloi avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.