You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.7 KiB
145 lines
3.7 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"time" |
|
|
|
"go-common/app/interface/main/shorturl/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
// ShortCache get short by cache |
|
func (s *Service) ShortCache(c context.Context, short string) (su *model.ShortUrl, err error) { |
|
if su, err = s.shortd.Cache(c, short); err != nil { |
|
log.Error("s.shrtd.Cache(%s) error(%v)", short, err) |
|
return |
|
} |
|
if su != nil { |
|
return |
|
} |
|
if su, err = s.shortd.Short(c, short); err != nil { |
|
log.Error("s.shortd.Short(%s) error(%v)", short, err) |
|
return |
|
} |
|
// add cache |
|
if su == nil { |
|
s.shortd.AddCache(func() { |
|
s.shortd.SetEmptyCache(context.TODO(), short) |
|
}) |
|
return |
|
} |
|
s.shortd.AddCache(func() { |
|
s.shortd.SetCache(context.TODO(), su) |
|
}) |
|
return |
|
} |
|
|
|
// ShortByID model.ShortUrl by short id |
|
func (s *Service) ShortByID(c context.Context, id int64) (su *model.ShortUrl, err error) { |
|
su, err = s.shortd.ShortbyID(c, id) |
|
if err != nil || su == nil { |
|
log.Error("ShortByID.Get(%d) error(%v)", id, err) |
|
err = ecode.ShortURLNotFound |
|
return |
|
} |
|
return |
|
} |
|
|
|
// Add new url to db |
|
func (s *Service) Add(c context.Context, mid int64, long string) (short string, err error) { |
|
su := &model.ShortUrl{ |
|
Long: long, |
|
Mid: mid, |
|
State: model.StateNormal, |
|
CTime: xtime.Time(time.Now().Unix()), |
|
} |
|
ss := model.Generate(long) // detemine no repeat |
|
for _, str := range ss { |
|
su.Short = str |
|
if su.ID, err = s.shortd.InShort(c, su); err != nil { |
|
log.Error("s.shortd.InShort error(%v)", err) |
|
err = ecode.ServerErr |
|
return |
|
} |
|
if su.ID == 0 { |
|
var shortRes *model.ShortUrl |
|
// already exist |
|
if shortRes, err = s.shortd.Short(c, str); err == nil && shortRes != nil { |
|
if shortRes.Long == long { |
|
if _, err = s.shortd.UpdateState(c, shortRes.ID, mid, model.StateNormal); err != nil { |
|
break |
|
} |
|
short = shortRes.Short |
|
break |
|
} else { |
|
continue |
|
} |
|
} |
|
} else { |
|
short = str |
|
break |
|
} |
|
} |
|
if short == "" { |
|
err = ecode.ShortURLNotFound |
|
return |
|
} |
|
s.shortd.AddCache(func() { |
|
var su, err = s.shortd.Short(context.TODO(), short) |
|
if err == nil && su != nil { |
|
s.shortd.SetCache(context.TODO(), su) |
|
} |
|
}) |
|
return |
|
} |
|
|
|
// ShortUpdate model.ShortUpdate |
|
func (s *Service) ShortUpdate(c context.Context, id, mid int64, long string) (err error) { |
|
if _, err = s.shortd.ShortUp(c, id, mid, long); err != nil { |
|
log.Error("s.shortd.ShortUp error(%v)", err) |
|
return |
|
} |
|
s.shortd.AddCache(func() { |
|
var short *model.ShortUrl |
|
if short, err = s.shortd.ShortbyID(context.TODO(), id); err != nil { |
|
log.Error("s.shortd.ShortByID(%d) error(%v)", id, err) |
|
return |
|
} |
|
s.shortd.SetCache(context.TODO(), short) |
|
}) |
|
return |
|
} |
|
|
|
// ShortDel model.ShortDel |
|
func (s *Service) ShortDel(c context.Context, id, mid int64, now time.Time) (err error) { |
|
if _, err = s.shortd.UpdateState(c, id, mid, model.StateDelted); err != nil { |
|
log.Error("s.shortd.ShortDel error(%v)", err) |
|
} |
|
s.shortd.AddCache(func() { |
|
var short *model.ShortUrl |
|
if short, err = s.shortd.ShortbyID(context.TODO(), id); err != nil { |
|
log.Error("s.shortd.ShortByID(%d) error(%v)", id, err) |
|
return |
|
} |
|
s.shortd.SetCache(context.TODO(), short) |
|
}) |
|
return |
|
} |
|
|
|
// ShortCount model.ShortCount count |
|
func (s *Service) ShortCount(c context.Context, mid int64, long string) (count int, err error) { |
|
if count, err = s.shortd.ShortCount(c, mid, long); err != nil { |
|
log.Error("s.shortd.ShortState error(%v)", err) |
|
} |
|
return |
|
} |
|
|
|
// ShortLimit get short_url list |
|
func (s *Service) ShortLimit(c context.Context, pn, ps int, mid int64, long string) (res []*model.ShortUrl, err error) { |
|
if res, err = s.shortd.ShortLimit(c, (pn-1)*ps, ps, mid, long); err != nil { |
|
log.Error("s.shortd.ShortLimit error(%v)", err) |
|
} |
|
return |
|
}
|
|
|