<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="130724" data-post-id="130724">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jdumont" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jdumont/120/2353_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jdumont
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’m glad this thread got some discussion going, but as <a class="mention" href="/u/lostkobrakai" rel="nofollow">@LostKobrakai</a> said, I’m surprised we went to client/server so quickly! <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20"> Whilst not part of my original question, I’ll likely be using plain old form submissions (over HTTPS of course) or possibly Phoenix LiveView. That said, LV would be of less value in this instance as there’s not much I can validate in the registration form beyond unique email addresses which CQRS makes too cumbersome for instant validation to be practical, and password length/unique characters etc.</p>
<p>Anyway, I decided that for the time being I would roll <code>Credentials</code> into the <code>User</code> schema. Either of the approaches that I listed above comes with caveats and compromises, mainly due to the password hashing in events (as already explained) and the complexity of unique validation of email addresses (mentioned above).</p>
<p>I suspect that in Commanded parlance I’ll be looking to use a process manager so that I can respond appropriately to errors caused by duplicate emails before any other, related events get saved. At this stage, simply combining the two schemas is the most pragmatic solution until I’m more comfortable with ES/CQRS.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="130724" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/when-to-hash-password-in-event-sourced-system/22770/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-130724" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="130724"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="130731" data-post-id="130731">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tcoopman" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/tcoopman/120/8112_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tcoopman
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’m not sure why you dismiss option 1 so fast. A small variation of option 1 might be to hash your password even before it hits the first command. That would mean that in your original design the <code>RegisterUser</code> command has a user name, email and hashed password`.<br>
In that case you don’t have any risks of saving the plain text password anywhere because it won’t enter you commands/events unhashed.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="130731" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/when-to-hash-password-in-event-sourced-system/22770/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-130731" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="130731"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="130737" data-post-id="130737">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jdumont" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jdumont/120/2353_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jdumont
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>That’s roughly what I started with, and subsequently ended up with after discarded the additional <code>CreateCredential</code> event.</p>
<p>My public API in <code>Accounts</code> has a <code>register_user</code> function which just takes a map of attributes. These attrs are then piped through various functions which do things like assign a UUID, add a <code>registration_date</code>, downcase the email address and hash the password before the command is dispatched.</p>
<p>All these functions are scoped to the <code>RegisterUser</code> module which is why I initially felt option one was undesirable as there was going to be a <code>CreateCredential</code> module that shared some of the same functions, either duplicating them or referencing another, only semi-related command. It was an issue of semantics and DRY which largely became moot once I ditched the extra event.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="130737" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/when-to-hash-password-in-event-sourced-system/22770/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-130737" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="130737"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>