Skip to content

Commit

Permalink
Refactor opt-in confirmation behaviour in subscriber update API.
Browse files Browse the repository at this point in the history
- Updating a subscriber no longer triggers an opt-in confirmation mail
  as `POST /api/subscribers/:id/optin` allows that.
- A "Send opt-in confirmation" option is added to the subscriber
  update UI.

Closes #656.
  • Loading branch information
knadh committed Jan 15, 2022
1 parent c95427e commit 04ea18c
Show file tree
Hide file tree
Showing 19 changed files with 63 additions and 8 deletions.
4 changes: 0 additions & 4 deletions cmd/subscribers.go
Original file line number Diff line number Diff line change
Expand Up @@ -367,10 +367,6 @@ func handleUpdateSubscriber(c echo.Context) error {
return err
}

if !req.PreconfirmSubs && app.constants.SendOptinConfirmation {
_, _ = sendOptinConfirmation(sub, []int64(req.Lists), app)
}

return c.JSON(http.StatusOK, okResp{sub})
}

Expand Down
3 changes: 3 additions & 0 deletions frontend/src/api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ export const createSubscriber = (data) => http.post('/api/subscribers', data,
export const updateSubscriber = (data) => http.put(`/api/subscribers/${data.id}`, data,
{ loading: models.subscribers });

export const sendSubscriberOptin = (id) => http.post(`/api/subscribers/${id}/optin`, {},
{ loading: models.subscribers });

export const deleteSubscriber = (id) => http.delete(`/api/subscribers/${id}`,
{ loading: models.subscribers });

Expand Down
4 changes: 4 additions & 0 deletions frontend/src/assets/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ section {
}
}

.is-disabled {
opacity: 0.30;
}

.box {
background: $white;
box-shadow: 2px 2px 0 #f3f3f3;
Expand Down
30 changes: 26 additions & 4 deletions frontend/src/views/SubscriberForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,22 @@
:all="lists.results"
></list-selector>

<b-field :message="$t('subscribers.preconfirmHelp')">
<b-checkbox v-model="form.preconfirm"
:native-value="true">{{ $t('subscribers.preconfirm') }}</b-checkbox>
</b-field>
<div class="columns mb-5">
<div class="column is-7">
<b-field :message="$t('subscribers.preconfirmHelp')">
<b-checkbox v-model="form.preconfirm"
:native-value="true" :disabled="!hasOptinList">
{{ $t('subscribers.preconfirm') }}
</b-checkbox>
</b-field>
</div>
<div class="column is-5 has-text-right" v-if="isEditing">
<a href="" @click.prevent="sendOptinConfirmation"
:class="{'is-disabled': !hasOptinList}">
<b-icon icon="email-outline" size="is-small" />
{{ $t('subscribers.sendOptinConfirm') }}</a>
</div>
</div>

<b-field :label="$t('subscribers.attribs')" label-position="on-border"
:message="$t('subscribers.attribsHelp') + ' ' + egAttribs">
Expand Down Expand Up @@ -250,6 +262,12 @@ export default Vue.extend({
});
},
sendOptinConfirmation() {
this.$api.sendSubscriberOptin(this.form.id).then(() => {
this.$utils.toast(this.$t('subscribers.sentOptinConfirm'));
});
},
validateAttribs(str) {
// Parse and validate attributes JSON.
let attribs = {};
Expand All @@ -271,6 +289,10 @@ export default Vue.extend({
computed: {
...mapState(['lists', 'loading']),
hasOptinList() {
return this.form.lists.some((l) => l.optin === 'double');
},
},
mounted() {
Expand Down
2 changes: 2 additions & 0 deletions i18n/cs-cz.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail nebo jméno",
"subscribers.reset": "Reset",
"subscribers.selectAll": "Vybrat vše {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Uvedeno na seznamu blokovaných",
"subscribers.status.confirmed": "Potvrzeno",
"subscribers.status.enabled": "Povoleno",
Expand Down
2 changes: 2 additions & 0 deletions i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-Mail oder Name",
"subscribers.reset": "Zurücksetzen",
"subscribers.selectAll": "Wähle alle {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Blockiert",
"subscribers.status.confirmed": "Bestätigt",
"subscribers.status.enabled": "Aktiviert",
Expand Down
2 changes: 2 additions & 0 deletions i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail or name",
"subscribers.reset": "Reset",
"subscribers.selectAll": "Select all {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Blocklisted",
"subscribers.status.confirmed": "Confirmed",
"subscribers.status.enabled": "Enabled",
Expand Down
2 changes: 2 additions & 0 deletions i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Correo electrónico o nombre",
"subscribers.reset": "Restablecer",
"subscribers.selectAll": "Seleccionar todos {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Bloqueado",
"subscribers.status.confirmed": "Confirmado",
"subscribers.status.enabled": "Habilitado",
Expand Down
2 changes: 2 additions & 0 deletions i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Email ou nom",
"subscribers.reset": "Réinitialiser",
"subscribers.selectAll": "Sélectionner tout {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Bloqué·e",
"subscribers.status.confirmed": "Confirmé·e",
"subscribers.status.enabled": "Activé·e",
Expand Down
2 changes: 2 additions & 0 deletions i18n/hu.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail vagy név",
"subscribers.reset": "Visszaállítás",
"subscribers.selectAll": "Összes kijelölése {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Feketelistás",
"subscribers.status.confirmed": "Megerősített",
"subscribers.status.enabled": "Engedélyezve",
Expand Down
2 changes: 2 additions & 0 deletions i18n/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Email o nome",
"subscribers.reset": "Ripristina",
"subscribers.selectAll": "Seleziona tutto {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Lista bloccata",
"subscribers.status.confirmed": "Confermato",
"subscribers.status.enabled": "Attivata",
Expand Down
2 changes: 2 additions & 0 deletions i18n/ml.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "പേരോ ഇ-മെയിൽ വിലാസമോ",
"subscribers.reset": "പുനഃസജ്ജമാക്കുക",
"subscribers.selectAll": "{num} എല്ലാം തിരഞ്ഞടുക്കുക",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "തടയുന്ന പട്ടികയിൽ ചേർത്തു",
"subscribers.status.confirmed": "Confirmed",
"subscribers.status.enabled": "പ്രവർത്തനക്ഷമാക്കി",
Expand Down
2 changes: 2 additions & 0 deletions i18n/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail of naam",
"subscribers.reset": "Resetten",
"subscribers.selectAll": "Selecteer alle {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Geblokkeerd",
"subscribers.status.confirmed": "Bevestigd",
"subscribers.status.enabled": "Geactiveerd",
Expand Down
2 changes: 2 additions & 0 deletions i18n/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail lub nazwa",
"subscribers.reset": "Resetuj",
"subscribers.selectAll": "Wybierz wszystkich {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Zablokowany",
"subscribers.status.confirmed": "Potwierdzony",
"subscribers.status.enabled": "Aktywny",
Expand Down
2 changes: 2 additions & 0 deletions i18n/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail ou nome",
"subscribers.reset": "Redefinir",
"subscribers.selectAll": "Selecionar todos {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Lista de bloqueados",
"subscribers.status.confirmed": "Confirmado",
"subscribers.status.enabled": "Habilitado",
Expand Down
2 changes: 2 additions & 0 deletions i18n/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail ou nome",
"subscribers.reset": "Repor",
"subscribers.selectAll": "Selecionar todos os {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Bloqueados",
"subscribers.status.confirmed": "Confirmado",
"subscribers.status.enabled": "Ativo",
Expand Down
2 changes: 2 additions & 0 deletions i18n/ro.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Email sau nume",
"subscribers.reset": "Reset",
"subscribers.selectAll": "Selectează tot {număr}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "În lista neagră",
"subscribers.status.confirmed": "Confirmat",
"subscribers.status.enabled": "Activfat",
Expand Down
2 changes: 2 additions & 0 deletions i18n/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail или имя",
"subscribers.reset": "Сброс",
"subscribers.selectAll": "Выбрать все {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Заблокирован",
"subscribers.status.confirmed": "Подтверждён",
"subscribers.status.enabled": "Включён",
Expand Down
2 changes: 2 additions & 0 deletions i18n/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-posta veya isim",
"subscribers.reset": "Sıfırla",
"subscribers.selectAll": "Select all {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Engellenmiş",
"subscribers.status.confirmed": "Doğrulanmış",
"subscribers.status.enabled": "Etkinleştirildi",
Expand Down

0 comments on commit 04ea18c

Please sign in to comment.