Era tu tercer día en Motoko School y estabas decidido a empezar a hacer buenos amigos. Siendo un gran fanático de la música, pensaste que organizar un pequeño concierto podría ser una excelente manera de conocer a otros estudiantes con intereses similares. 🎶
Mientras paseabas por los pasillos durante la hora del almuerzo, escuchaste a dos estudiantes discutiendo cómo desearían que hubiera una mejor manera de mantenerse informados sobre los eventos y actividades escolares. Se quejaron de cómo se habían perdido la Conferencia de la Comunidad de ICP del año anterior porque no estaban al tanto a tiempo, y de cómo estaban decididos a no dejar que eso vuelva a suceder este año. 💪
Esto despertó una idea en tu mente.
¿Qué tal si pudieras crear una plataforma digital donde los estudiantes compartieran los eventos y actividades próximas? Sería la manera perfecta de publicitar tu concierto de música y ayudar a otros estudiantes a mantenerse informados sobre todo lo que sucede en el campus. 📅
Compartiste rápidamente tu idea con los dos estudiantes y les encantó. Te presentaron a otros interesados en la idea, y antes de que te dieras cuenta, tenías un grupo de estudiantes motivados listos para dar vida a tu idea. 🚀
Todos se reunieron en el laboratorio de computación y comenzaron a pensar en las características de su muro de estudiantes. Querían que fuera algo más que un tablero de anuncios, así que se les ocurrió la idea de incluir imágenes y encuestas también. Dividieron el trabajo y comenzaron a codificar.
Tu tarea es desarrollar el código para un muro de estudiantes, implementado como un canister, una plataforma digital que revolucionará la forma en que los estudiantes se comunican y se mantienen informados sobre eventos, clubes y actividades de la comunidad. Imagina un espacio dinámico e interactivo donde los estudiantes puedan compartir sus pensamientos, ideas y eventos próximos entre ellos.
Este muro será el destino principal para los estudiantes que buscan obtener la información más reciente sobre lo que está sucediendo en la escuela.
Tu canister debe implementar la siguiente interfaz:
actor {
// Add a new message to the wall
writeMessage: shared (c : Content) -> async Nat;
//Get a specific message by ID
getMessage: shared query (messageId : Nat) -> async Result.Result<Message, Text>;
// Update the content for a specific message by ID
updateMessage: shared (messageId : Nat, c : Content) -> async Result.Result<(), Text>;
//Delete a specific message by ID
deleteMessage: shared (messageId : Nat) -> async Result.Result<(), Text>;
// Voting
upVote: shared (messageId : Nat) -> async Result.Result<(), Text>;
downVote: shared (messageId : Nat) -> async Result.Result<(), Text>;
//Get all messages
getAllMessages : query () -> async [Message];
//Get all messages
getAllMessagesRanked : query () -> async [Message];
};
Definimos un tipo de variante llamado Content
que representa el tipo de contenido de los mensajes que pueden ser publicados en el muro.
public type Content = {
#Text: Text;
#Image: Blob;
#Video: Blob;
};
- Define un nuevo tipo de registro llamado
Message
. Un mensaje de tipoMessage
contiene un campovote
de tipoInt
, un campocontent
de tipoContent
y un campocreator
de tipoPrincipal
que representa al creador del mensaje. - Define una variable llamada
messageId
que sirve como un contador continuamente creciente, manteniendo un registro del total de mensajes publicados. - Crea una variable llamada
wall
, que es unHashMap
diseñado para almacenar mensajes. En este muro, las claves son de tipoNat
y representan los ID de los mensajes, mientras que los valores son de tipoMessage
. - Implementa la función
writeMessage
, que acepta un contenidoc
de tipoContent
, crea un mensaje a partir del contenido, lo agrega al muro y devuelve el ID del mensaje. - Implementa la función
getMessage
, que acepta unmessageId
de tipoNat
y devuelve el mensaje correspondiente envuelto en un resultadoOk
. Si elmessageId
es inválido, la función debe devolver un mensaje de error envuelto en un resultadoErr
. - Implementa la función
updateMessage
, que acepta unmessageId
de tipoNat
y un contenidoc
de tipoContent
, y actualiza el contenido del mensaje correspondiente. Esto solo debe funcionar si el llamador es elcreator
del mensaje. Si elmessageId
es inválido o el llamador no es elcreator
, la función debe devolver un mensaje de error envuelto en un resultadoErr
. Si todo funciona y el mensaje se actualiza, la función debe devolver un valor de unidad simple envuelto en un resultadoOk
. - Implementa la función
deleteMessage
, que acepta unmessageId
de tipoNat
, elimina el mensaje correspondiente delwall
y devuelve un valor de unidad envuelto en un resultadoOk
. Si elmessageId
es inválido, la función debe devolver un mensaje de error envuelto en un resultadoErr
. - Implementa la función
upVote
, que acepta unmessageId
de tipoNat
, agrega un voto al mensaje y devuelve un valor de unidad envuelto en un resultadoOk
. Si elmessageId
es inválido, la función debe devolver un mensaje de error envuelto en un resultadoErr
. - Implementa la función
downVote
, que acepta unmessageId
de tipoNat
, resta un voto al mensaje y devuelve un valor de unidad envuelto en un resultadoOk
. Si elmessageId
es inválido, la función debe devolver un mensaje de error envuelto en un resultadoErr
. - Implementa la función de consulta
getAllMessages
, que devuelve la lista de todos los mensajes. - Implementa la función de consulta
getAllMessagesRanked
, que devuelve la lista de todos los mensajes, donde cada mensaje está ordenado por el número de votos. El primer mensaje de la lista debe ser el mensaje con más votos. - Despliega el muro de estudiantes en Internet Computer.
- (Paso de bonificación) Construye una interfaz de usuario para el muro e integra Internet Identity para autenticar a los usuarios que publiquen en el muro.