Personalizza la homepage per mostrare argomenti in base agli interessi dell'utente

Vorrei sentire cosa ne pensi di questo plugin. Sto lavorando a un plugin che permetterà ai visitatori di scegliere un nuovo argomento da visualizzare sulla homepage in base ai loro interessi. Ho scritto l’idea e ho disegnato questo passaggio, ma non ci ho ancora lavorato.

plugin.rb

# plugins/custom_homepage/plugin.rb
# frozen_string_literal: true

# name: custom-homepage
# about: Personalizza la homepage per mostrare argomenti basati sugli interessi dell'utente
# version: 0.1
# authors: MHAT
# url: https://domain.com

enabled_site_setting :custom_homepage_enabled

after_initialize do
  # codice da eseguire dopo l'inizializzazione
end
// plugins/custom_homepage/assets/javascripts/discourse/initializers/custom-homepage.js.es6

import { withPluginApi } from 'discourse/lib/plugin-api';

export default {
  name: 'custom-homepage',
  initialize(container) {
    withPluginApi('0.8', api => {
      api.modifyClass('component:topic-list', {
        didInsertElement() {
          this._super(...arguments);

          if (this.currentUser) {
            this.loadUserInterests();
          }
        },

        loadUserInterests() {
          const userId = this.currentUser.id;

          fetch(`/u/${userId}/preferences/interests`)
            .then(response => response.json())
            .then(data => {
              this.set('topics', this.sortTopicsByInterests(this.topics, data.interests));
            });
        },

        sortTopicsByInterests(topics, interests) {
          return topics.sort((a, b) => {
            const aScore = interests.includes(a.category_id) ? 1 : 0;
            const bScore = interests.includes(b.category_id) ? 1 : 0;

            return bScore - aScore;
          });
        }
      });
    });
  }
};
# plugins/custom_homepage/config/locales/server.en.yml
en:
  site_settings:
    custom_homepage_enabled: "Abilita Homepage Personalizzata"

  user:
    preferences:
      interests: "Interessi"

# plugins/custom_homepage/config/discourse_plugin.yml
enabled_site_setting: custom_homepage_enabled

HTML per le impostazioni

<script type="text/x-handlebars" data-template-name="/connectors/user-preferences/interests">
  <div class="control-group">
    <label class="control-label">{{i18n 'user.preferences.interests'}}</label>
    <div class="controls">
      {{input value=currentUser.custom_fields.interests class="form-control"}}
    </div>
  </div>
</script>
# plugins/custom_homepage/plugin.rb

after_initialize do
  User.register_custom_field_type('interests', :string)

  add_to_serializer(:current_user, :interests) do
    object.custom_fields['interests']
  end
end

Grazie per il tuo feedback e suggerimenti per miglioramenti.

Sono thailandese. Le mie capacità di inglese potrebbero non sembrare particolarmente buone. Ho provato ad impararlo mentre sviluppavo discourse.

Dove è implementato /preferences/interests?

Credo che per gestire gli interessi dell’utente e integrarli nelle preferenze dell’utente, debbano essere creati i percorsi, le azioni del controller e i template richiesti.

Tuttavia, questo è solo il mio punto di vista, ed è semplicemente progettato. Non ho ancora iniziato a costruirlo. Potrebbe non andare come previsto se ci provo.

Aggiungere un percorso per le preferenze utente:
- Aggiungere un percorso che gestirà le richieste a /u/:username/preferences/interests.

```ruby
# plugins/custom_homepage/config/routes.rb
Discourse::Application.routes.append do
  get '/u/:username/preferences/interests' => 'custom_homepage#interests', constraints: { username: /[^\\/]+/ }
end
```

Creare l’azione del controller:
- Definire un controller per gestire la richiesta e recuperare gli interessi dell’utente.

```ruby
# plugins/custom_homepage/app/controllers/custom_homepage_controller.rb
class CustomHomepageController < ApplicationController
  requires_login
  
  def interests
    username = params[:username]
    user = User.find_by(username: username)
    
    if user
      render json: {
        interests: user.custom_fields['interests']
      }
    else
      render json: { error: 'User not found' }, status: 404
    end
  end
end
```

Aggiungere il campo Interessi nelle Preferenze Utente:
- Modificare il template delle preferenze utente per includere un input per gli interessi.

```html
<!-- plugins/custom_homepage/assets/javascripts/discourse/connectors/user-preferences/interests.hbs -->
<div class="control-group">
  <label class="control-label">{{i18n 'user.preferences.interests'}}</label>
  <div class="controls">
    {{input value=model.custom_fields.interests class="form-control"}}
  </div>
</div>
```

Estendere il Serializer:
- Estendere il serializer utente per includere il campo interessi.

```ruby
# plugins/custom_homepage/plugin.rb

after_initialize do
  User.register_custom_field_type('interests', :string)
  
  add_to_serializer(:current_user, :interests) do
    object.custom_fields['interests']
  end

  add_to_serializer(:admin_detailed_user, :interests) do
    object.custom_fields['interests']
  end
end
```

Modificare il JavaScript per la Gestione degli Interessi:
- Utilizzare JavaScript per recuperare e salvare gli interessi nel profilo utente.

```javascript
// plugins/custom_homepage/assets/javascripts/discourse/initializers/custom-homepage.js.es6

import { withPluginApi } from 'discourse/lib/plugin-api';

export default {
  name: 'custom-homepage',
  initialize(container) {
    withPluginApi('0.8', api => {
      api.modifyClass('controller:preferences/account', {
        save() {
          const interests = this.model.custom_fields.interests;
          this.model.save().then(() => {
            fetch(`/u/${this.model.username}/preferences/interests`, {
              method: 'PUT',
              headers: {
                'Content-Type': 'application/json',
                'X-CSRF-Token': Discourse.CSRFToken
              },
              body: JSON.stringify({ interests })
            }).then(response => response.json()).then(() => {
              this.flash('Your preferences have been saved.');
            });
          });
        }
      });
    });
  }
};
```
  1. Gestire la Richiesta PUT:

    • Implementare la logica per gestire la richiesta PUT e salvare gli interessi nel controller.
    # plugins/custom_homepage/app/controllers/custom_homepage_controller.rb
    class CustomHomepageController < ApplicationController
      requires_login
    
      def interests
        if request.get?
          username = params[:username]
          user = User.find_by(username: username)
          
          if user
            render json: {
              interests: user.custom_fields['interests']
            }
          else
            render json: { error: 'User not found' }, status: 404
          end
        elsif request.put?
          user = current_user
          interests = params[:interests]
          user.custom_fields['interests'] = interests
          user.save_custom_fields
          render json: success_json
        end
      end
    end
    
2 Mi Piace

Sembra interessante. Potresti trovare alcune idee anche in questo plugin.