mirror of
https://github.com/larksuite/cli.git
synced 2026-07-08 02:00:19 +08:00
* feat(mail): add signature foundation, draft exports, and +signature shortcut - Add signature data model, API provider, and template variable interpolation with tests (shortcuts/mail/signature/) - Export signature-related symbols from draft package (SignatureWrapperClass, BuildSignatureHTML, FindMatchingCloseDiv, SplitAtQuote, RemoveSignatureHTML, SignatureSpacing, SignatureImage) for use by compose shortcuts - Add +signature shortcut for listing and viewing email signatures - Add signature reference documentation Change-Id: I62525e7b475692ada9ec8590b6d0252cf5afcdbc Co-Authored-By: AI * feat(mail): add --signature-id to all compose shortcuts - Add --signature-id flag to +draft-create, +send, +reply, +reply-all, +forward for inserting a signature into the email body - Add signature image download with SSRF protection (https enforcement, no token leak, context timeout, size limit) - Add signature HTML insertion with quote-aware placement - Update compose shortcut reference docs Change-Id: Ic5606bab7826a20364084898ad1714778e5a8bd0 Co-Authored-By: AI * feat(mail): add signature insert/remove ops for +draft-edit - Add insert_signature and remove_signature patch operations with old-signature MIME cleanup and case-insensitive CID matching - Expose signature ops in supported_ops flat list - Update SKILL.md and draft-edit reference docs Change-Id: I74affbf555e32351520f610ef42195f399a265d9 Co-Authored-By: AI * test(mail): add unit tests for signature patch operations Test insert_signature and remove_signature ops: - Insert into basic HTML body - Insert before quote block (reply/forward) - Replace existing signature - Error on plain-text-only draft - Remove existing signature - Error when no signature present Change-Id: Icd713552b130d6eb461ef1cabca61e82327f4f0b Co-Authored-By: AI * fix(mail): address reviewer findings on signature PR - Remove --device flag and device field from docs (not exposed in CLI) - Fix signature interpolation to match --from alias address in send_as list, instead of always using the primary mailbox address - Update lark-mail-signature.md reference doc Change-Id: I65f41a029cd33b17785e2355a99d042063962d23 Co-Authored-By: AI * fix(mail): resolve lint issues — remove unused code, fix gofmt - Remove unused cidSrcRe, collectSignatureCIDs, isCIDReferencedInHTML from signature_html.go (CID logic lives in draft/patch.go) - Remove unused strings import - Run gofmt on all affected files Change-Id: Ie142744a7ab17acf440dc69a5a78cefb3ce6c341 Co-Authored-By: AI * fix(mail): use draft From address for signature interpolation in +draft-edit Moved signature resolution after draft fetch+parse so insert_signature reads the From header from the existing draft. This ensures alias and shared-mailbox senders get correct template variable values (B-NAME, B-ENTERPRISE-EMAIL) instead of falling back to the primary address. Change-Id: I917016b17176090124814f30e8e15c67f1604de0 Co-Authored-By: AI
83 lines
2.9 KiB
Go
83 lines
2.9 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package signature
|
|
|
|
// SignatureType represents the type of a mail signature.
|
|
type SignatureType string
|
|
|
|
const (
|
|
SignatureTypeUser SignatureType = "USER"
|
|
SignatureTypeTenant SignatureType = "TENANT"
|
|
)
|
|
|
|
// SignatureDevice represents the device platform a signature is designed for.
|
|
type SignatureDevice string
|
|
|
|
const (
|
|
DevicePC SignatureDevice = "PC"
|
|
DeviceMobile SignatureDevice = "MOBILE"
|
|
)
|
|
|
|
// SignatureImage holds metadata for an inline image embedded in a signature.
|
|
type SignatureImage struct {
|
|
ImageName string `json:"image_name,omitempty"`
|
|
FileKey string `json:"file_key,omitempty"`
|
|
CID string `json:"cid,omitempty"`
|
|
FileSize string `json:"file_size,omitempty"`
|
|
Header string `json:"header,omitempty"`
|
|
ImageWidth int32 `json:"image_width,omitempty"`
|
|
ImageHeight int32 `json:"image_height,omitempty"`
|
|
DownloadURL string `json:"download_url,omitempty"`
|
|
}
|
|
|
|
// UserFieldValue holds a template variable value with multi-language support.
|
|
type UserFieldValue struct {
|
|
DefaultVal string `json:"default_val"`
|
|
I18nVals map[string]string `json:"i18n_vals"` // keys: "zh_cn", "en_us", "ja_jp"
|
|
}
|
|
|
|
// Resolve returns the localized value for the given language code.
|
|
// Falls back to DefaultVal when the language key is missing or empty.
|
|
func (v UserFieldValue) Resolve(lang string) string {
|
|
if val, ok := v.I18nVals[lang]; ok && val != "" {
|
|
return val
|
|
}
|
|
return v.DefaultVal
|
|
}
|
|
|
|
// Signature represents a single mail signature returned by the API.
|
|
type Signature struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
SignatureType SignatureType `json:"signature_type"`
|
|
SignatureDevice SignatureDevice `json:"signature_device"`
|
|
Content string `json:"content"`
|
|
Images []SignatureImage `json:"images,omitempty"`
|
|
TemplateJSONKeys []string `json:"template_json_keys,omitempty"`
|
|
UserFields map[string]UserFieldValue `json:"user_fields,omitempty"`
|
|
}
|
|
|
|
// IsTenant returns true if this is a tenant/corporate signature with template variables.
|
|
func (s *Signature) IsTenant() bool {
|
|
return s.SignatureType == SignatureTypeTenant
|
|
}
|
|
|
|
// HasTemplateVars returns true if the signature contains template variables that need interpolation.
|
|
func (s *Signature) HasTemplateVars() bool {
|
|
return len(s.TemplateJSONKeys) > 0
|
|
}
|
|
|
|
// SignatureUsage indicates which signature is used by default for a given email address.
|
|
type SignatureUsage struct {
|
|
EmailAddress string `json:"email_address"`
|
|
SendMailSignatureID string `json:"send_mail_signature_id"`
|
|
ReplySignatureID string `json:"reply_signature_id"`
|
|
}
|
|
|
|
// GetSignaturesResponse is the parsed response from the get_signatures API.
|
|
type GetSignaturesResponse struct {
|
|
Signatures []Signature `json:"signatures"`
|
|
Usages []SignatureUsage `json:"usages"`
|
|
}
|