Browse Source

Oasis release 0.4.5

psy 3 hours ago
parent
commit
664da84515

+ 1 - 2
src/client/assets/translations/oasis_en.js

@@ -271,7 +271,6 @@ module.exports = {
     //search
     searchTitle: "Search",
     searchDescriptionLabel: "Search for content in your network.",
-    search:"Search",
     searchLanguagesLabel: "Languages",
     searchSkillsLabel: "Skills",
     searchPlaceholder:"Search for content...",
@@ -296,7 +295,6 @@ module.exports = {
     createdAtLabel:"Created at",
     hashtagDescription:"Explore the content associated with this hashtag",
     tribeDescriptionLabel:"Description",
-    searchTitle:"Search Results",
     votesOption:"Vote Options",
     voteYesLabel:"Yes",
     voteNoLabel:"No",
@@ -1479,6 +1477,7 @@ module.exports = {
     statsActivity7d: "Activity (last 7 days)",
     statsActivity7dTotal: "7-day total",
     statsActivity30dTotal: "30-day total",
+    statsKarmaScore: "KARMA Score",
     day: "Day",
     messages: "Messages",
     statsProject: "Projects",

+ 1 - 2
src/client/assets/translations/oasis_es.js

@@ -271,7 +271,6 @@ module.exports = {
     //search
     searchTitle: "Buscar",
     searchDescriptionLabel: "Buscar contenido en tu red.",
-    search:"Buscar",
     searchLanguagesLabel: "Lenguajes",
     searchSkillsLabel: "Habilidades",
     searchPlaceholder:"Buscar contenido...",
@@ -295,7 +294,6 @@ module.exports = {
     author:"Autoría",
     createdAtLabel:"Creado el",
     hashtagDescription:"Explora el contenido asociado con ésta etiqueta",
-    searchTitle:"Buscar Resultados",
     votesOption:"Opiniones Votadas",
     voteYesLabel:"Si",
     voteNoLabel:"No",
@@ -1491,6 +1489,7 @@ module.exports = {
     statsActivity7d: "Actividad (últimos 7 días)",
     statsActivity7dTotal: "Total de 7 días",
     statsActivity30dTotal: "Total de 30 días",
+    statsKarmaScore: "Puntuación de KARMA",
     day: "Día",
     messages: "Mensajes",
     statsProject: "Proyectos",

+ 1 - 2
src/client/assets/translations/oasis_eu.js

@@ -271,7 +271,6 @@ module.exports = {
     //search
     searchTitle: "Bilatu",
     searchDescriptionLabel: "Bilatu edukia zure sarean.",
-    search:"Bilatu",
     searchLanguagesLabel: "Hizkuntzak",
     searchSkillsLabel: "Trebetasunak",
     searchPlaceholder:"Bilatu edukia...",
@@ -296,7 +295,6 @@ module.exports = {
     createdAtLabel:"Noiz",
     hashtagDescription:"Traola honekin erlazionatutako edukia arakatu.",
     tribeDescriptionLabel:"Deskribapena",
-    searchTitle:"Bilaketaren Emaitzak",
     votesOption:"Bozkatzeko Aukerak",
     voteYesLabel:"Bai",
     voteNoLabel:"Ez",
@@ -1492,6 +1490,7 @@ module.exports = {
     statsActivity7d: "Aktibitatea (azken 7 egunetan)",
     statsActivity7dTotal: "7 egunerako guztira",
     statsActivity30dTotal: "30 egunerako guztira",
+    statsKarmaScore: "KARMA Puntuazioa",
     day: "Eguna",
     messages: "Mezuak",
     statsProject: "Proiektuak",

+ 21 - 14
src/models/banking_model.js

@@ -416,7 +416,7 @@ async function publishKarmaScore(userId, karmaScore) {
   const timestamp = new Date().toISOString();
   const content = {
     type: "karmaScore",
-    karmaScore: karmaScore,
+    karmaScore,
     userId: userId,
     timestamp: timestamp,
   };
@@ -486,7 +486,8 @@ async function getUserEngagementScore(userId) {
   const currentTimestamp = Date.now();
   const timeDifference = currentTimestamp - new Date(lastPublishedTimestamp).getTime();
   const shouldPublish = karmaScore !== previousKarmaScore && timeDifference >= 24 * 60 * 60 * 1000;
-  if (shouldPublish) {
+  const canPublish = Boolean(services?.ssb || global.ssb);
+  if (shouldPublish && canPublish) {
     await publishKarmaScore(userId, karmaScore);
   }
   return karmaScore;
@@ -495,23 +496,28 @@ async function getUserEngagementScore(userId) {
 async function getLastKarmaScore(userId) {
   const ssb = await openSsb();
   if (!ssb) return 0;
-  return new Promise(resolve => {
+  const matchOne = (arr) => {
+    if (!arr || !arr.length) return 0;
+    const v = arr[0].value || arr[0];
+    const c = v.content || {};
+    return Number(c.karmaScore) || 0;
+  };
+  return new Promise((resolve) => {
     const source = ssb.messagesByType
       ? ssb.messagesByType({ type: "karmaScore", reverse: true })
       : ssb.createLogStream && ssb.createLogStream({ reverse: true });
     if (!source) return resolve(0);
     pull(
       source,
-      pull.filter(msg => {
+      pull.filter((msg) => {
         const v = msg.value || msg;
         const c = v.content || {};
-        return v.author === userId && c.type === "karmaScore" && typeof c.karmaScore !== "undefined";
+        return c && c.type === "karmaScore" && c.userId === userId;
       }),
       pull.take(1),
       pull.collect((err, arr) => {
-        if (err || !arr || !arr.length) return resolve(0);
-        const v = arr[0].value || arr[0];
-        resolve(v.content.karmaScore || 0);
+        if (err) return resolve(0);
+        resolve(matchOne(arr));
       })
     );
   });
@@ -520,24 +526,25 @@ async function getLastKarmaScore(userId) {
 async function getLastPublishedTimestamp(userId) {
   const ssb = await openSsb();
   if (!ssb) return new Date(0).toISOString();
-  return new Promise(resolve => {
+  const fallback = new Date(0).toISOString();
+  return new Promise((resolve) => {
     const source = ssb.messagesByType
       ? ssb.messagesByType({ type: "karmaScore", reverse: true })
       : ssb.createLogStream && ssb.createLogStream({ reverse: true });
-    if (!source) return resolve(new Date(0).toISOString());
+    if (!source) return resolve(fallback);
     pull(
       source,
-      pull.filter(msg => {
+      pull.filter((msg) => {
         const v = msg.value || msg;
         const c = v.content || {};
-        return v.author === userId && c.type === "karmaScore";
+        return c && c.type === "karmaScore" && c.userId === userId;
       }),
       pull.take(1),
       pull.collect((err, arr) => {
-        if (err || !arr || !arr.length) return resolve(new Date(0).toISOString());
+        if (err || !arr || !arr.length) return resolve(fallback);
         const v = arr[0].value || arr[0];
         const c = v.content || {};
-        resolve(c.timestamp || new Date(0).toISOString());
+        resolve(c.timestamp || fallback);
       })
     );
   });

+ 1 - 1
src/views/main_views.js

@@ -436,7 +436,7 @@ const template = (titlePrefix, ...elements) => {
              navLink({ href: "/publish", emoji: "❂", text: i18n.publish }),
              renderAILink(),
              renderTagsLink(),
-             navLink({ href: "/search", emoji: "ꔅ", text: i18n.search })
+             navLink({ href: "/search", emoji: "ꔅ", text: i18n.searchTitle })
              )
           ),
         )

+ 7 - 6
src/views/search_view.js

@@ -194,7 +194,8 @@ const renderContentHtml = (content) => {
     case 'document':
       return div({ class: 'search-document' },
         content.title ? div({ class: 'card-field' }, span({ class: 'card-label' }, i18n.documentTitleLabel + ':'), span({ class: 'card-value' }, content.title)) : null,
-        content.description ? div({ class: 'card-field' }, span({ class: 'card-label' }, i18n.searchDescription + ':'), span({ class: 'card-value' }, content.description)) : null,
+        br,
+        content.description ? div({ class: 'card-field' }, span({ class: 'card-value' }, content.description)) : null,
         br,
         div({
           id: `pdf-container-${content.key || content.url}`,
@@ -376,13 +377,13 @@ const resultSection = Object.entries(results).length > 0
           authorUrl = `/author/${encodeURIComponent(msg.value.author)}`;
         } else if (content.type === 'report') {
           author = content.author || i18n.anonymous || "Anonymous";
-          authorUrl = `/author/${encodeURIComponent(content.author || 'anonymous')}`;
+          authorUrl = `/author/${encodeURIComponent(content.author || 'Anonymous')}`;
         } else if (content.type === 'votes') {
           author = content.createdBy || i18n.anonymous || "Anonymous";
-          authorUrl = `/author/${encodeURIComponent(content.createdBy || 'anonymous')}`;   
+          authorUrl = `/author/${encodeURIComponent(content.createdBy || 'Anonymous')}`;   
         } else {
           author = content.author
-          authorUrl = `/author/${encodeURIComponent(content.author || 'anonymous')}`;
+          authorUrl = `/author/${encodeURIComponent(content.author || 'Anonymous')}`;
         }
         
         const contentId = msg.key;
@@ -407,10 +408,10 @@ const resultSection = Object.entries(results).length > 0
   : div({ class: 'no-results' }, p(i18n.noResultsFound));
 
   let html = template(
-    hashtag ? `#${hashtag}` : i18n.search,
+    hashtag ? `#${hashtag}` : i18n.searchTitle,
     section(
       div({ class: "tags-header" },
-        h2(hashtag ? `#${hashtag}` : i18n.search),
+        h2(hashtag ? `#${hashtag}` : i18n.searchTitle),
         p(hashtag ? i18n.hashtagDescription : i18n.searchDescriptionLabel)
       ),
       form(

+ 0 - 1
src/views/stats_view.js

@@ -17,7 +17,6 @@ exports.statsView = (stats, filter) => {
   const totalOpinions = types.reduce((sum, t) => sum + O(stats, t), 0);
   const blockStyle = 'padding:16px;border:1px solid #ddd;border-radius:8px;margin-bottom:24px;';
   const headerStyle = 'background-color:#f8f9fa; padding:24px; border-radius:8px; border:1px solid #e0e0e0; box-shadow:0 2px 8px rgba(0,0,0,0.1);';
-
   return template(
     title,
     section(